配置MySQL GTID 主從複製
GTID是一個基於原始mysql伺服器產生的一個已經被成功執行的全域事務ID,它由伺服器ID以及事務ID組合而成。這個全域事務ID不僅僅在原始伺服器器上唯一,在所有存在主從關係 的mysql伺服器上也是唯一的。正是因為這樣一個特性使得mysql的主從複製變得更加簡單,以及資料庫一致性更可靠。本文主要描述了快速配置一個基於GTID的主從複製架構,供大家參考。
一、GTID的概念
1、全域事務標識:global transaction identifiers。2、GTID是一個事務一一對應,並且全域唯一ID。3、一個GTID在一個伺服器上只執行一次,避免重複執行導致資料混亂或者主從不一致。4、GTID用來代替傳統複製方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS開啟複製。而是使用MASTER_AUTO_POSTION=1的方式開始複製。5、MySQL-5.6.5開始支援的,MySQL-5.6.10後開始完善。6、在傳統的slave端,binlog是不用開啟的,但是在GTID中slave端的binlog是必須開啟的,目的是記錄執行過的GTID(強制)。
二、GTID的組成
GTID = source_id:transaction_idsource_id,用於鑒別原伺服器,即mysql伺服器唯一的的server_uuid,由於GTID會傳遞到slave,所以也可以理解為源ID。transaction_id,為當前伺服器上已提交事務的一個序號,通常從1開始自增長的序列,一個數值對應一個事務。 樣本: 3E11FA47-71CA-11E1-9E33-C80AA9429562:23前面的一串為伺服器的server_uuid,即3E11FA47-71CA-11E1-9E33-C80AA9429562,後面的23為transaction_id
三、GTID的優勢
1、更簡單的實現failover,不用以前那樣在需要找log_file和log_pos。2、更簡單的搭建主從複製。3、比傳統的複製更加安全。4、GTID是連續的沒有空洞的,保證資料的一致性,零丟失。
四、GTID的工作原理
1、當一個事務在主庫端執行並提交時,產生GTID,一同記錄到binlog日誌中。2、binlog傳輸到slave,並儲存到slave的relaylog後,讀取這個GTID的這個值設定gtid_next變數,即告訴Slave,下一個要執行的GTID值。3、sql線程從relay log中擷取GTID,然後對比slave端的binlog是否有該GTID。4、如果有記錄,說明該GTID的事務已經執行,slave會忽略。5、如果沒有記錄,slave就會執行該GTID事務,並記錄該GTID到自身的binlog, 在讀取執行事務前會先檢查其他session持有該GTID,確保不被重複執行。6、在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。
五、配置GTID
對於GTID的配置,主要修改設定檔中與GTID特性相關的幾個重要參數(建議使用mysql-5.6.5以上版本),如下:1、主:[mysqld]#GTID:server_id=135 #伺服器idgtid_mode=on #開啟gtid模式enforce_gtid_consistency=on #強制gtid一致性,開啟後對於特定create table不被支援#binloglog_bin=master-binloglog-slave-updates=1 binlog_format=row #強烈建議,其他格式可能造成資料不一致#relay logskip_slave_start=1 2、從:[mysqld]#GTID:gtid_mode=onenforce_gtid_consistency=onserver_id=143#binloglog-bin=slave-binloglog-slave-updates=1binlog_format=row #強烈建議,其他格式可能造成資料不一致#relay logskip_slave_start=1
六、配置基於GTID的複製
1、新配置的mysql伺服器對於新配置的mysql伺服器,按本文第五點描述配置參數檔案後,在slave端執行以下操作(root@localhost) [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.1.135', -> MASTER_USER='repl', -> MASTER_PASSWORD='xxx', -> MASTER_PORT=3306, -> MASTER_AUTO_POSITION = 1;Query OK, 0 rows affected, 2 warnings (0.01 sec)(root@localhost) [(none)]> start slave;Query OK, 0 rows affected (0.01 sec)(root@localhost) [(none)]> show slave status \G ###可以看到複製工作已經開始且正常*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.135 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-binlog.000001 Read_Master_Log_Pos: 151 Relay_Log_File: slave-relay-log.000002 Relay_Log_Pos: 369 Relay_Master_Log_File: master-binlog.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes2、已運行經典複製mysql伺服器轉向GTID複製a、按本文第五點描述配置參數檔案;b、所有伺服器設定global.read_only參數,等待主從伺服器同步完畢; mysql> SET @@global.read_only = ON; c、依次重啟主從伺服器;d、使用change master 更新主從配置; mysql> CHANGE MASTER TO > MASTER_HOST = host, > MASTER_PORT = port, > MASTER_USER = user, > MASTER_PASSWORD = password, > MASTER_AUTO_POSITION = 1;e、從庫開啟複製 mysql> START SLAVE;f、驗證主從複製
MySQL5.6基於GTID的主從複製
Ubuntu下Nginx做負載實現高效能WEB伺服器5---MySQL主主同步
生產環境MySQL主主同步主鍵衝突處理
MySQL主從失敗 錯誤Got fatal error 1236
MySQL主從複製,單台伺服器上實施
搭建MySQLProxy 伺服器實現讀寫分離+主從同步
MySQL 5.5 主從雙向同步
MySQL 5.5主從同步排錯
MySQL主從複製非同步半同步執行個體
本文永久更新連結地址: