1. 程式人生 > >MySQL 基於GTID復制

MySQL 基於GTID復制

避免 連續 標識 logs 獲取 row ssi tran ike

GTID Replication:
在MySQL 5.6.5以上的版本中,MySQL新增了一種基於GTID的復制方式。通過 GTID 保證了每個在主數據庫上提交的事務在集群中有一個唯一的ID,這種方式強化了數據庫主備的一致性,故障恢復以及容錯能力。

GTID是什麽?:
GTID (Global Transaction ID) 是對一個已提交事務的編號,並且是一個全局唯一的編號。GTID 是由 UUID+TID 組成的。UUID 是一個 MySQL 實例的唯一標識,TID 代表了該實例上已經提交的事務數量,並且隨著事務提交單調遞增。
UUID是什麽?
MySQL 5.6 以後用 128 位的 server-uuid 代替了原本的 32 位 server-id。server-id 是基於 my.cnf 的手工配置,易產生沖突,而UUID可以保證所生成的 server-uuid 避免沖突問題。
查看UUID:
show variables like "%server_uuid%";
3ff69404-0b11-11e8-a5c9-000c29713b71
查看GTID:
3ff69404-0b11-11e8-a5c9-000c29713b71:1
GTID形式:
3ff69404-0b11-11e8-a5c9-000c29713b71:1
3ff69404-0b11-11e8-a5c9-000c29713b71:5  #一組連續的事物

GTID復制實現的工作原理

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

show binlog events in ‘mysql-bin.000003‘;
| mysql-bin.000003 | 2152 | Gtid | 1283306 | 2217 | SET @@SESSION.GTID_NEXT= ‘3ff69404-0b11-11e8-a5c9-000c29713b71:12‘ |
| mysql-bin.000003 | 2217 | Query | 1283306 | 2290 | BEGIN |
| mysql-bin.000003 | 2290 | Table_map | 1283306 | 2339 | table_id: 145 (gtidb.gtitb) |
| mysql-bin.000003 | 2339 | Write_rows | 1283306 | 2379 | table_id: 145 flags: STMT_END_F |
| mysql-bin.000003 | 2379 | Xid | 1283306 | 2410 | COMMIT /* xid=588 */ |


配置GTID主從復制:
master配置:

  • gtid-mode:gtid-mode=ON
  • enforce-gtid-consistency:enforce-gtid-consistency=ON
  • log-slave-updates:log-slave-updates:ON
  • server-id 1003306,(建議IP後兩位加數據庫端口號)
  • binlog_format:binlog_format=ROW
  • log-bin:log-bi=ON

創建復制賬號:
grant replication slave on *.* to ‘repl‘@‘%‘ identified by ‘password‘;
flush privileges;
查看master狀態:
show master status\G;

slave配置:

  • gtid-mode:gtid-mode=ON
  • enforce-gtid-consistency:enforce-gtid-consistency=ON
  • log-slave-updates:log-slave-updates:ON
  • server-id 1013306,(建議IP後兩位加數據庫端口號)
  • binlog_format:binlog_format=ROW
  • log-bin:log-bi=ON

連接主數據:
連接主庫:
CHANGE MASTER TO
MASTER_HOST=‘192.168.100.100‘,
MASTER_USER=‘repl‘,
MASTER_PASSWORD=‘password‘,
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;
開開啟同步:
start slave;
查看slave狀態:
show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Retrieved_Gtid_Set: 3ff69404-0b11-11e8-a5c9-000c29713b71:1-3
Executed_Gtid_Set: 3ff69404-0b11-11e8-a5c9-000c29713b71:1-3

GTID相關參數:
show global variables like ‘%gtid%‘;
show variables like ‘%gtid_next%‘;
gtid_executed:在當前實例上執行過的GTID集合; 實際上包含了所有記錄到binlog中的事務。所以,設置set sql_log_bin=0後執行的事務不會生成binlog 事件,也不會被記錄到gtid_executed中。執行RESET MASTER可以將該變量置空。
gtid_purged:binlog不可能永遠駐留在服務上,需要定期進行清理(通過expire_logs_days可以控制定期清理間隔),否則遲早它會把磁盤用盡。gtid_purged用於記錄已經被清除了的binlog事務集合,它是gtid_executed的子集。只有gtid_executed為空時才能手動設置該變量,此時會同時更新gtid_executed為和gtid_purged相同的值。gtid_executed為空意味著要麽之前沒有啟動過基於GTID的復制,要麽執行過RESET MASTER。執行RESET MASTER時同樣也會把gtid_purged置空,即始終保持gtid_purged是gtid_executed的子集。

gtid_next:話級變量,指示如何產生下一個GTID。

  •   AUTOMATIC:自動生成下一個GTID,實現上是分配一個當前實例上尚未執行過的序號最小的GTID。
  •   ANONYMOUS:設置後執行事務不會產生GTID。
  •   顯式指定的GTID:可以指定任意形式合法的GTID值,但不能是當前gtid_executed中的已經包含的GTID,否則,下次執行事務時會報錯。

MySQL 基於GTID復制