主機環境:rhel7.3 selinux and firewalld disabled
主機名 | ip | 服務 |
---|---|---|
server3 | 172.25.254.3 | mysql |
server4 | 172.25.254.4 | mysql |
server3:主庫
server4:從庫
配置要求:
mysql5.7版本
主從複製的原理:
從庫生成兩個線程,一個I/O線程,一個SQL線程;
i/o線程去請求主庫 的binlog,並將得到的binlog日誌寫到relay log(中繼日誌) 文件中;
主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog;
SQL 線程,會讀取relay log文件中的日誌,並解析成具體操作,來實現主從的操作一致,而最終數據一致;
mysql的主從配置又叫replication,AB複製,基於binlog二進制日誌,主數據庫必須開啓binlog二進制日誌才能進行復制。
(1)主數據庫將更改操作記錄到binlog二進制日誌(主數據庫有log dump線程和從數據庫的i/o線程傳遞binlog)。
(2)從庫生成兩個線程,一個i/o線程,一個SQL線程
(3)i/o線程去請求主庫的binlog,並且得到的binlog日誌寫到relay log(中繼日誌)文件中
(4)然後主庫會生成一個log dump線程,用來給從庫的i/o線程傳binlog;SQL線程,會讀取中繼日誌文件,並解析成具體的操作執行,這樣主從的操作就一致了,而最終的數據也就一致了。
作爲異步複製,其主庫將事件寫入binlog二進制文件,dump線程將binlog文件發送出去,不保證其他從節點是否會收到binlog二進制文件。
搭建步驟:
1.獲得資源,解壓(安裝rpm包,不用編譯)基礎設置
[root@server3 mysql]# ls
master_ip_failover mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar sysbench
master_ip_online_change mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
MHA-7 send_report
[root@server3 mysql]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@server3 mysql]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@server3 mysql]# vim /etc/my.cnf
29 log-bin=mysql-bin #主庫開啓binlog日誌
30 server-id=1 #主從庫id不同
2.啓動mysql,作簡單配置
[root@server3 mysql]# systemctl start mysqld
[root@server3 mysql]# cat /var/log/mysqld.log | grep password #會發現生成初始密碼
[root@server3 mysql]# mysql_secure_installation #改密碼,設定安全性
[root@server3 mysql]# mysql -uroot -pWestos+001 #登陸數據庫
server4進行操作和第一步第二步相同(my.cnf不同)
3.在server3(主)上進行授權
mysql> grant replication slave on *.* to repl@'172.25.254.%' identified by 'Westos+001'; #授權
mysql> SHOW PLUGINS; #查看插件
mysql> SHOW MASTER STATUS; #查看從需要的信息
replication 表示授權複製的權限
*.* 表示所有數據庫可以進行同步
repl 表示授權名,可以隨意填寫
'172.25.254.%' 表示授權172.25.254.0/24的網段所有服務器可以同步, %表示任意
4.在server4(從)上進行授權
mysql> change master to master_host='172.25.254.3',master_user='repl',master_password='Westos+001',master_log_file='mysql-bin.000002',master_log_pos=692; #授權
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes #表示成功
測試:
在server3上創建表
mysql> CREATE DATABASE westos;
mysql> USE westos;
Database changed
mysql> CREATE table usertb (
-> username varchar(10) not null,
-> password varchar(15) not null);
mysql> DESC usertb; #查看錶信息
mysql> insert into usertb values ('user1','123');
mysql> select * from usertb;
在server4查看是否可以同步信息:
mysql> SHOW DATABASES;
mysql> use westos;
mysql> select * from usertb;
二、mysql的jtid下的主從複製
1.基本概念
GTID即全局事務ID(global transaction identifier),GTID實際上是由UUID+TID組成的。其中UUID是一個MySQL實例的唯一標識。TID代表了該實例上已經提交的事務數量,並且隨着事務提交單調遞增,所以GTID能夠保證每個MySQL實例事務的執行(不會重複執行同一個事務,並且會補全沒有執行的事務)。
原理:
從服務器連接到主服務器之後,把自己執行過的GTID(Executed_Gtid_Set)<SQL線程> 、獲取到的GTID(Retrieved_Gtid_Set)<IO線程>發給主服務器,主服務器把從服務器缺少的GTID及對應的transactions發過去補全即可。當主服務器掛掉的時候,找出同步最成功的那臺從服務器,直接把它提升爲主即可。如果硬要指定某一臺不是最新的從服務器提升爲主, 先change到同步最成功的那臺從服務器, 等把GTID全部補全了,就可以把它提升爲主了。
搭建步驟:
1.先將mysql關閉,修改配置文件
[root@server3 mysql]# systemctl stop mysqld
[root@server3 mysql]# vim /etc/my.cnf
29 log-bin=mysql-bin
30 server-id=1
31 gtid_mode=ON
32 enforce-gtid-consistency=true
[root@server3 mysql]# systemctl start mysqld
[root@server4 mysql]# systemctl stop mysqld
[root@server4 mysql]# vim /etc/my.cnf
29 server-id=2
30 gtid_mode=ON
31 enforce-gtid-consistency=true
[root@server4 mysql]# systemctl start mysqld
2.在主庫端進入mysql,進行授權(之前做過)
3.在從庫端進入mysql,關閉slave,進行gtid授權
[root@server4 mysql]# mysql -uroot -pWestos+001
mysql> stop slave;
mysql> CHANGE MASTER TO
-> MASTER_HOST = '172.25.254.3', #主庫ip
-> MASTER_USER = 'repl', #使用的用戶(主庫那邊授權的用戶身份)
-> MASTER_PASSWORD = 'Westos+001', #密碼
-> MASTER_AUTO_POSITION = 1; #自動開啓gtid的複製方式
mysql> start slave;
mysql> show slave status\G #IO和SQL打開即授權成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
測試:
在主庫寫入信息:
mysql> create database westos;
mysql> use westos
mysql> create table usertb (
-> username varchar(10) not null,
-> password varchar(15) not null);
mysql> desc usertb; #查看錶的結構
mysql> insert into usertb values ('user1','123');
在從庫查看:
mysql> use westos
mysql> select * from usertb;
從庫此時可以使用以下命令查看複製的信息是基於gtid的同步方式
mysql> show slave status\G
或者:
mysql> use mysql
mysql> select * from gtid_executed;
三、半同步複製
1.在主庫安裝插件,激活插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%'; #查看安裝的插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled =1; #激活插件
2.在從庫安裝插件,並激活
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
3.重啓從庫的IO線程
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
4.在主庫查看狀態信息
mysql> show status like '%rpl%'; #可以看到半同步打開
mysql> show variables like '%rpl%';
5.在從庫查看信息
mysql> show variables like '%rpl%'; #此時是半同步
測試:
測試1:將從庫的IO線程關閉,在主庫添加信息
從庫:
mysql> STOP SLAVE IO_THREAD; #此時主庫收不到從庫發送的ack,模仿網絡卡頓
主庫:
mysql> use westos;
Database changed
mysql> insert into usertb values ('user2','456'); #插入信息的時候會等待接收從的ack10秒,如果沒接收到就不等待,此時從庫會缺少添加的數據
從庫查看:(信息同步不到)
在主庫查看狀態
mysql> show status like '%rpl%'; #此時已經變成異步,半同步關閉
mysql> insert into usertb values ('user3','456');
從庫:
mysql> show status like '%rpl%'; #半同步關閉,異步開啓
mysql> START SLAVE IO_THREAD; #將IO打開,模擬網絡通暢
mysql> select * from usertb; #此時可以查看到數據同步
注意:此時默認的狀態是半同步,會自動開啓(半同步是mysql的5.5後提出的)