Mysql 的主從複製、基於gtid的主從複製和半同步複製

主機環境: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				#IOSQL打開即授權成功
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後提出的)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章