MySQL GTID 主從複製的原理及配置

    GTID是一個基於原始mysql服務器生成的一個已經被成功執行的全局事務ID,它由服務器ID以及事務ID組合而成。這個全局事務ID不只僅在原始服務器器上惟一,在全部存在主從關係 的mysql服務器上也是惟一的。正是由於這樣一個特性使得mysql的主從複製變得更加簡單,以及數據庫一致性更可靠。本文主要描述了快速配置一個基於GTID的主從複製架構,供你們參考。mysql


1、GTID的概念

一、全局事務標識:global transaction identifiers。sql

二、GTID是一個事務一一對應,而且全局惟一ID。數據庫

三、一個GTID在一個服務器上只執行一次,避免重複執行致使數據混亂或者主從不一致。安全

四、GTID用來代替傳統複製方法,再也不使用MASTER_LOG_FILE+MASTER_LOG_POS開啓複製。而是使用MASTER_AUTO_POSTION=1的方式開始複製。服務器

五、MySQL-5.6.5開始支持的,MySQL-5.6.10後開始完善。session

六、在傳統的slave端,binlog是不用開啓的,可是在GTID中slave端的binlog是必須開啓的,目的是記錄執行過的GTID(強制)。架構


2、GTID的組成

GTID = source_id:transaction_idide

source_id,用於鑑別原服務器,即mysql服務器惟一的的server_uuid,因爲GTID會傳遞到slave,因此也能夠理解爲源ID。 ui

transaction_id,爲當前服務器上已提交事務的一個序列號,一般從1開始自增加的序列,一個數值對應一個事務。         spa

示例:      3E11FA47-71CA-11E1-9E33-C80AA9429562:23

前面的一串爲服務器的server_uuid,即3E11FA47-71CA-11E1-9E33-C80AA9429562,後面的23爲transaction_id


3、GTID的優點

一、更簡單的實現failover,不用之前那樣在須要找log_file和log_pos。 

二、更簡單的搭建主從複製。 

三、比傳統的複製更加安全。 

四、GTID是連續的沒有空洞的,保證數據的一致性,零丟失。



4、GTID的工做原理

一、當一個事務在主庫端執行並提交時,產生GTID,一同記錄到binlog日誌中。

二、binlog傳輸到slave,並存儲到slave的relaylog後,讀取這個GTID的這個值設置gtid_next變量,即告訴Slave,下一個要執行的GTID值。

三、sql線程從relay log中獲取GTID,而後對比slave端的binlog是否有該GTID。

四、若是有記錄,說明該GTID的事務已經執行,slave會忽略。

五、若是沒有記錄,slave就會執行該GTID事務,並記錄該GTID到自身的binlog,   在讀取執行事務前會先檢查其餘session持有該GTID,確保不被重複執行。

六、在解析過程當中會判斷是否有主鍵,若是沒有就用二級索引,若是沒有就用所有掃描。



5、配置GTID

對於GTID的配置,主要修改/etc/my.cnf配置文件中與GTID特性相關的幾個重要參數(建議使用mysql-5.6.5以上版本),以下:

一、主: 

[mysqld]

server_id=1               

gtid_mode=on                 #開啓gtid模式

enforce_gtid_consistency=on  #強制gtid一致性,開啓後對於特定create table不被支持

log_bin=master-binlog

log-slave-updates=1    

binlog_format=row            #強烈建議,其餘格式可能形成數據不一致

skip_slave_start=1            


二、從: 

[mysqld]

server_id=1 

gtid_mode=on                 

enforce_gtid_consistency=on  

log_bin=master-binlog

log-slave-updates=1    

binlog_format=row           

skip_slave_start=1            



6、配置基於GTID的複製

一、新配置的mysql服務器 

在主服務器上執行如下操做:

> grant replication slave on *.* to 'rep'@'192.168.1.%' identified by '123';


對於新配置的mysql服務器,按本文第五點描述配置參數文件後,在slave端執行如下操做 

> CHANGE MASTER TO  

->  MASTER_HOST='192.168.1.135',        

->  MASTER_USER='rep',        

->  MASTER_PASSWORD='123',        

->  MASTER_PORT=3306,        

->  MASTER_AUTO_POSITION = 1;

Query OK, 0 rows affected, 2 warnings (0.01 sec) 


> start slave;

 Query OK, 0 rows affected (0.01 sec) 


> show slave status \G;    #查看是否正常同步




二、已運行經典複製mysql服務器轉向GTID複製 

(1)按本文第五點描述配置參數文件; 

(2)全部服務器設置global.read_only參數,等待主從服務器同步完畢;        

> SET @@global.read_only = ON; 


(3)依次重啓主從服務器; 

(4)使用change master 更新主從配置;        

> CHANGE MASTER TO  

->  MASTER_HOST='192.168.1.135',        

->  MASTER_USER='rep',        

->  MASTER_PASSWORD='123',        

->  MASTER_PORT=3306,        

->  MASTER_AUTO_POSITION = 1;

Query OK, 0 rows affected, 2 warnings (0.01 sec) 


> start slave;

 Query OK, 0 rows affected (0.01 sec) 


> show slave status \G;

相關文章
相關標籤/搜索