1 避免回環過程
在MySQL雙主架構中,GTID(全局事務標識符)通過以下流程避免數據回環:
1 事務提交與GTID生成
- 在Master1節點,事務提交時生成一個全局唯一的GTID(如3E11FA47-71CA-11E1-9E33-C80AA9429562:23),并記錄到binlog中。
2 日志傳輸到Master2
- Master1的log dump Thread將包含GTID的binlog日志發送到Master2。
3 Master2記錄Relay Log
- Master2的I/O Thread接收binlog日志,并將其寫入本地的Relay Log。
4 Master2重放事務
- Master2的SQL Thread讀取Relay Log中的事務,并嘗試重放。
5 Master2檢查GTID并忽略
- 關鍵步驟:在重放前,Master2檢查該事務的GTID是否已存在于其gtid_executed集合(已應用事務的GTID列表)中:
- 存在:跳過該事務(因為是Master1已提交的事務)。
- 不存在:執行事務,并將GTID添加到gtid_executed集合。
6 Master2生成新的Binlog
- 如果事務在Master2上執行,Master2會生成一個新的binlog日志,其中包含相同的GTID。
7 日志傳輸回Master1
- Master2的log dump Thread將新的binlog日志(包含GTID)發送回Master1。
8 Master1記錄Relay Log
- Master1的I/O Thread接收binlog日志,并將其寫入本地的Relay Log。
9 Master1重放事務
- Master1的SQL Thread讀取Relay Log中的事務,并嘗試重放。
10 Master1檢查GTID并忽略
- Master1檢查其GTID是否已存在于gtid_executed集合中:
存在:跳過該事務(因為是Master1自己生成的GTID)。
- 不存在:執行事務(理論上不會發生,因為GTID是全局唯一的)。
補充:v5.6及以后的版本是通過gtid避免回環,v5.6以前的版本是通過server_id[不同的節點有不同的server_id]避免回環
2 總結
2.1 為什么GTID能避免回環?
- 全局唯一性:每個GTID在集群中唯一,確保事務不會被重復應用。
- 冪等性檢查:通過gtid_executed集合,節點能自動檢測并跳過已應用的事務。