1. 程式人生 > >mysql5.7——基於GTID的主從複製

mysql5.7——基於GTID的主從複製

在上一篇部落格中我們介紹了mysql5.7主從複製的原理和配置,今天我們就在上一篇部落格的基礎上來看看基於GTID的mysql5.7主從複製與半同步複製是什麼樣的

GTID

概述

GTID(Global Transaction ID)是MySQL5.6引入的功能,可以在叢集全域性範圍標識事務,用於取代過去通過binlog檔案偏移量(pos)定位複製位置的傳統方式。藉助GTID,在發生主備切換的情況下,MySQL的其它Slave可以自動在新主上找到正確的複製位置,這大大簡化了複雜複製拓撲下叢集的維護,也減少了人為設定複製位置發生誤操作的風險。另外,基於GTID的複製可以忽略已經執行過的事務,減少了資料發生不一致的風險。

特點

1:更簡單的實現failover,不用以前那樣在需要找log_file和log_Pos。
2:更簡單的搭建主從複製。
3:比傳統複製更加安全。
4:GTID是連續沒有空洞的,因此主從庫出現數據衝突時,可以用新增空事物的方式進行跳過。

GTID的組成

根據官方文件定義,GTID由source_id加transaction_id構成。
GTID = source_id:transaction_id
上面的source_id指示發起事務的MySQL例項,值為該例項的server_uuid。server_uuid由MySQL在第一次啟動時自動生成並被持久化到auto.cnf檔案裡,transaction_id是MySQL例項上執行的事務序號,從1開始遞增。 例如:

e6954592-8dba-11e6-af0e-fa163e1cf111:1 

一組連續的事務可以用’-'連線的事務序號範圍表示。例如

e6954592-8dba-11e6-af0e-fa163e1cf111:1-5 

更一般的情況是GTID的集合。GTID集合可以包含來自多個source_id的事務,它們之間用逗號分隔;如果來自同一source_id的事務序號有多個範圍區間,各組範圍之間用冒號分隔,例如:

e6954592-8dba-11e6-af0e-fa163e1cf111:1-5:11-18,
e6954592-8dba-11e6-af0e-fa163e1cf3f2:1-27 

GTID工作原理

1、master更新資料時,會在事務前產生GTID,一同記錄到binlog日誌中。
2、slave端的i/o 執行緒將變更的binlog,寫入到本地的relay log中。
3、sql執行緒從relay log中獲取GTID,然後對比slave端的binlog是否有記錄。
4、如果有記錄,說明該GTID的事務已經執行,slave會忽略。
5、如果沒有記錄,slave就會從relay log中執行該GTID的事務,並記錄到binlog。
6、在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。

配置基於GTID的主從複製

一、
1:在所有節點中編輯mysql配置檔案/etc/my.cnf
新增:
gtid_mode=ON
enforce-gtid-consistency=true

gtid_mode有4中模式:
    OFF 不產生GTID, Slave只接受不帶GTID的事務
    OFF_PERMISSIVE 不產生GTID, Slave即接受不帶GTID的事務也接受帶GTID的事務
    ON_PERMISSIVE 產生GTID, Slave即接受不帶GTID的事務也接受帶GTID的事務
    ON 產生GTID, Slave只接受帶GTID的事務

2:重啟mysql
/etc/init.d/mysqld restart
二、在slave(server2)中:
進入mysql
1:stop slave;
2:change master to master_host=‘172.25.66.1’,master_user=‘repl’,master_password=‘Guodong+0306’,master_auto_position=1;
3:start slave;
在這裡插入圖片描述
4:檢視狀態 (IO執行緒和 sql執行緒已經正常開啟 )
在這裡插入圖片描述
三、在master的mysql中修改資料
1:use user;
向usertb表中新增一組資料
insert into user.usertb value(‘user1’,‘123’);
在這裡插入圖片描述
2:在slave中檢視是否同步
在這裡插入圖片描述
3:可以看到資料成功同步,現在我們就可以在master與slave中檢視已經執行過的事務的GTID
在master中:show master status;
在這裡插入圖片描述
在slave中:show slave status\G;
在這裡插入圖片描述
四、因為在上一篇部落格中我們做的是一個鏈式的mysql5.7主從複製,即server1是server2的master,server2是server3的master,所以我們在做好上面的操作後,直接開啟slave(server3)中的mysql,show slave status\G;可以直接檢視到執行過的事務的GTID,並且資料也已經同步
在這裡插入圖片描述
在這裡插入圖片描述