1. 程式人生 > >MySQL傳統複製與GTID複製的原理闡述

MySQL傳統複製與GTID複製的原理闡述

MySQL複製
MySQL非同步複製架構中傳統複製的原理闡述
MySQL非同步複製架構中GTID複製的原理闡述
一、GTID的概述:
二、GTID的組成部分:
三、GTID如何產生
四、GTID相關的變數
五、GTID比傳統複製的優勢與限制:
優勢
GTID的限制
六、GTID的工作原理:

MySQL複製

MySQL非同步複製架構中傳統複製的原理闡述


MySQL傳統複製是基於MySQL二進位制檔案(mysql-bin.000001),加上對應日誌檔案中每個事件的偏移量位置點(postion)。

  • 三個執行緒來實現:主庫Binlog Dump,從庫IO和SQL執行緒
  • Master所有資料庫變更寫進Binary log, 主庫執行緒 binlog dump把Binary log內容傳送到從庫slave上(slave被動接受資料,不是主動去獲取)。
  • Slave IO執行緒讀取Master上Binary log日誌資訊,把接受到的Binary log日誌寫到本地中繼日誌 Relay log
  • Slave SQL執行緒讀取Ralay log日誌內容寫入本地資料庫例項

MySQL非同步複製架構中GTID複製的原理闡述

一、GTID的概述:

  • 1、全域性事物標識:global transaction identifieds。
  • 2、GTID事物是全域性唯一性的,且一個事務對應一個GTID。
  • 3、一個GTID在一個伺服器上只執行一次,避免重複執行導致資料混亂或者主從不一致。
  • 4、GTID用來代替classic的複製方法,不在使用binlog+pos開啟複製。而是使用master_auto_postion=1的方式自動匹配GTID斷點進行復制。
  • 5、MySQL-5.6.5開始支援的,MySQL-5.6.10後開始完善。
  • 6、在傳統的slave端,binlog是不用開啟的,但是在GTID中,slave端的binlog是必須開啟的,目的是記錄執行過的GTID(強制);但是從5.7.5版本開始無需在GTID模式下啟用引數log_slave_updates

二、GTID的組成部分:

GTID = source_id:transaction_id 
source_id正常即是server_uuid,在第一次啟動時生成(函式generate_server_uuid),並持久化到DATADIR/auto.cnf檔案裡。 
transaction_id是順序化的序列號(sequence number),在每臺MySQL伺服器上都是從1開始自增長的序列,是事務的唯一標識。例如:3E11FA47-71CA-11E1-9E33-C80AA9429562:23 
GTID 的集合(GTIDs)可以用source_id+transaction_id範圍表示,例如:3E11FA47-71CA-11E1-9E33-C80AA9429562:1-18 
複雜一點的:如果這組 GTIDs 來自不同的 source_id,各組 source_id 之間用逗號分隔;如果事務序號有多個範圍區間,各組範圍之間用冒號分隔,例如:3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5:11-18,2C256447-3F0D-431B-9A12-575BB20C1507:1-27

三、GTID如何產生

GTID的生成受gtid_next控制。 
在Master上,gtid_next是預設的AUTOMATIC,即GTID在每次事務提交時自動生成。它從當前已執行的GTID集合(即gtid_executed)中,找一個大於0的未使用的最小值作為下個事務GTID。同時將GTID寫入到binlog(set gtid_next記錄),在實際的更新事務記錄之前。 
在Slave上,從binlog先讀取到主庫的GTID(即set gtid_next記錄),而後執行的事務採用該GTID。

四、GTID相關的變數

  • GTID_EXECUTED 
    表示已經在該例項上執行過的事務; 執行RESET MASTER 會將該變數置空; 我們還可以通過設定GTID_NEXT在執行一個空事務,來影響GTID_EXECUTED
  • GTID_PURGED 
    已經被刪除了binlog的事務,它是GTID_EXECUTED的子集,只有在GTID_EXECUTED為空時才能設定該變數,修改GTID_PURGED會同時更新GTID_EXECUTED和GTID_PURGED的值。
  • GTID_OWNED 
    表示正在執行的事務的gtid以及對應的執行緒ID。
  • GTID_NEXT 
    SESSION級別變數,表示下一個將被使用的GTID。

五、GTID比傳統複製的優勢與限制:

優勢

  • 1、更簡單的實現failover,不用以前那樣在需要找log_file和log_Pos。
  • 2、更簡單的搭建主從複製。
  • 3、複製叢集有一個統一的方式識別複製位置,給叢集管理帶來了便利。
  • 4、正常情況下,GTID是連續沒有空洞的,因此主從庫出現數據衝突時,可以用新增空事物的方式進行跳過。

GTID的限制

  • 1、在一個事務裡面混合使用引擎如Innodb(支援事務)、MyISAM(不支援事務), 造成多個GTIDs和同一個事務相關聯出錯
  • 2、CREATE TABLE…..SELECT 不能使用,該語句產生的兩個event在某一情況 會使用同一個GTID(同一個GTID在slave只能被使用一次)
    • 1th event:建立表語句create table
    • 2th event:插入資料語句insert
  • 3、CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE 不能在事務內使用 (啟用了--enforce-gtid-consistency引數)。

六、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、在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。