Mysql基於GTID的複製模式

ChenAfrica發表於2020-12-25

GTID定義

GTID( Global Transaction Identifier)全域性事務標識。GTID是5.6 版本引入的一個有關於主從複製的重大改進,相對於之前版本基於Binlog檔案+Position的主從複製,基於GTID的主從複製,資料一致性更高,主從資料複製更健壯,主從切換、故障切換不易出錯,很少需要人為介入處理。

表示方式

GTID = server_uuid:transaction_id
其GTID通常會記錄在MySQL的系統變數@@GLOBAL.gtid_executed 以及系統表mysql.gtid_executed中,系統變數@@GLOBAL.gtid_executed 在記憶體中,屬於非持久化儲存,而系統表mysql.gtid_executed屬於持久化儲存。

GTID的作用

  1. 快速將一個從節點升級為一個主節點
  2. 保證事務的安全性
  3. 多執行緒複製

主從複製流程圖


GTID生命週期

  1. 當一個事務在一個主庫上被執行和提交,那麼這個事務就會被分配一個和該主庫uuid相關聯的gtid,這個gtid被寫入到主庫的binlog檔案中。
  2. 當這個binlog檔案達到最大值發生輪轉,或者MySQL Server關閉時,上一個binlog檔案中的事務GTID將會被寫入到mysql.gtid_executed表中。
  3. 事務提交時,該事務的gtid會很快的新增到系統變數@@GLOBAL.gtid_executed,但是系統表 mysql.gtid_executed 則不會,應為有部分gtid還在binlog中,需要等到binlog輪轉或者mysqlServer關閉時才會寫入到mysql。gtid_executed表中.
  4. 主庫上的binlog通過主從複製協議傳送到從庫,並寫入到從庫的relay log(中繼日誌), 從庫讀取relay log中的gtid和對應的事務資訊,把gtid_next設定為該gtid值,使得從庫使用該gtid值應用其對應的事務
  5. 如果多個執行緒併發應用同一個事務,比如多個執行緒設定gtid_next為同一個值,MySQL Server 只允許其中一個執行緒執行,gtid_owned系統變數記錄著誰擁有該GTID.
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章