1. 程式人生 > >mysql GTID 半同步復制

mysql GTID 半同步復制

傳統 col sta ble roc true ted mis 索引

1)什麽是GTID

GTID(Global Transaction ID)是對於一個已提交事務的編號,並且是一個全局唯一的編號。GTID實際上是由UUID+TID組成的。其中UUID是一個MySQL實例的唯一標 識,保存在mysql數據目錄下的auto.cnf文件裏。TID代表了該實例上已經提交的事務數量,並且隨著事務提交單調遞增。下面是一個GTID的具 體形式:3E11FA47-71CA-11E1-9E33-C80AA9429562:23。
2)GTID的作用

根據GTID可以知道事務最初是在哪個實例上提交的

GTID的存在方便了Replication的Failover
3)GTID比傳統復制的優勢

更簡單的實現failover,不用以前那樣在需要找log_file和log_Pos。

更簡單的搭建主從復制。

比傳統復制更加安全。

GTID是連續沒有空洞的,因此主從庫出現數據沖突時,可以用添加空事物的方式進行跳過。
4)GTID的工作原理:

master更新數據時,會在事務前產生GTID,一同記錄到binlog日誌中。

slave端的i/o線程將變更的binlog,寫入到本地的relay log中。

sql線程從relay log中獲取GTID,然後對比slave端的binlog是否有記錄。

如果有記錄,說明該GTID的事務已經執行,slave會忽略。

如果沒有記錄,slave就會從relay log中執行該GTID的事務,並記錄到binlog。

在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。
實驗環境:rhel6.5
server7 master
server8 slave[root@server7 ~]# mysql -p

基於mysql主從復制實驗
[root@server7 ~]# vim /etc/my.cnf
server-id=1
log-bin=mysql-bin

gtid_mode=ON
enforce-gtid-consistency=true #添加GTID
[root@server7 ~]# /etc/init.d/mysqld restart
[root@server7 ~]# mysql #添加數據

[root@server7 ~]# mysql -p
技術分享圖片
[root@server8 ~]# vim /etc/my.cnf
server-id=2

gtid_mode=ON
enforce-gtid-consistency=true #添加GTID
[root@server8 ~]# /etc/init.d/mysqld restart
[root@server8 ~]# mysql -p
mysql> stop slave;
mysql> change master to master_host=‘172.25.135.7‘,master_user=‘repl‘,master_password=‘Caonimei@478‘,MASTER_AUTO_POSITION = 1;
mysql> start slave;
mysql> show slave status\G;
mysql> use mysql;
mysql> show tables;
mysql> select * from gtid_executed;
技術分享圖片
mysql> show slave status\G;
半同步復制:
開啟slave半同步
[root@server8 ~]# vim /etc/my.cnf
server-id=2

gtid_mode=ON
enforce-gtid-consistency=true
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
[root@server8 ~]# /etc/init.d/mysqld restart
[root@server7 ~]# mysql -p
mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;
Query OK, 0 rows affected (0.02 sec)

mysql> SET GLOBAL rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)

mysql> set global rpl_semi_sync_master_enabled=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> show status like ‘%rpl%‘;
技術分享圖片
mysql> show variables like ‘%rpl%‘;
[root@server8 ~]# mysql -p
mysql> show processlist;
mysql> use mysql;
mysql> select * from slave_master_info;
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;
mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;
mysql> stop slave io_thread;
mysql> start slave io_thread;
mysql> show status like ‘%rpl%‘;
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
master上server7插入數據
mysql> use westos;
mysql> insert into usertb values (‘user4‘,‘333‘);
mysql> show variables like ‘%rpl%‘;
技術分享圖片
技術分享圖片
mysql> insert into usertb values (‘user5‘,‘333‘);
技術分享圖片
技術分享圖片
slave server8關掉io同步
mysql> stop slave io_thread;
master server7摻入數據就有10秒延遲。
mysql> insert into usertb values (‘user6‘,‘333‘);
技術分享圖片

mysql GTID 半同步復制