溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL GTID 主從復(fù)制的原理及配置

發(fā)布時(shí)間:2020-07-22 22:46:44 來源:網(wǎng)絡(luò) 閱讀:1199 作者:楊書凡 欄目:MySQL數(shù)據(jù)庫

    GTID是一個(gè)基于原始mysql服務(wù)器生成的一個(gè)已經(jīng)被成功執(zhí)行的全局事務(wù)ID,它由服務(wù)器ID以及事務(wù)ID組合而成。這個(gè)全局事務(wù)ID不僅僅在原始服務(wù)器器上唯一,在所有存在主從關(guān)系 的mysql服務(wù)器上也是唯一的。正是因?yàn)檫@樣一個(gè)特性使得mysql的主從復(fù)制變得更加簡單,以及數(shù)據(jù)庫一致性更可靠。本文主要描述了快速配置一個(gè)基于GTID的主從復(fù)制架構(gòu),供大家參考。


一、GTID的概念

1、全局事務(wù)標(biāo)識:global transaction identifiers。

2、GTID是一個(gè)事務(wù)一一對應(yīng),并且全局唯一ID。

3、一個(gè)GTID在一個(gè)服務(wù)器上只執(zhí)行一次,避免重復(fù)執(zhí)行導(dǎo)致數(shù)據(jù)混亂或者主從不一致。

4、GTID用來代替?zhèn)鹘y(tǒng)復(fù)制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS開啟復(fù)制。而是使用MASTER_AUTO_POSTION=1的方式開始復(fù)制。

5、MySQL-5.6.5開始支持的,MySQL-5.6.10后開始完善。

6、在傳統(tǒng)的slave端,binlog是不用開啟的,但是在GTID中slave端的binlog是必須開啟的,目的是記錄執(zhí)行過的GTID(強(qiáng)制)。


二、GTID的組成

GTID = source_id:transaction_id

source_id,用于鑒別原服務(wù)器,即mysql服務(wù)器唯一的的server_uuid,由于GTID會傳遞到slave,所以也可以理解為源ID。 

transaction_id,為當(dāng)前服務(wù)器上已提交事務(wù)的一個(gè)序列號,通常從1開始自增長的序列,一個(gè)數(shù)值對應(yīng)一個(gè)事務(wù)。         

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

前面的一串為服務(wù)器的server_uuid,即3E11FA47-71CA-11E1-9E33-C80AA9429562,后面的23為transaction_id


三、GTID的優(yōu)勢

1、更簡單的實(shí)現(xiàn)failover,不用以前那樣在需要找log_file和log_pos。 

2、更簡單的搭建主從復(fù)制。 

3、比傳統(tǒng)的復(fù)制更加安全。 

4、GTID是連續(xù)的沒有空洞的,保證數(shù)據(jù)的一致性,零丟失。



四、GTID的工作原理

1、當(dāng)一個(gè)事務(wù)在主庫端執(zhí)行并提交時(shí),產(chǎn)生GTID,一同記錄到binlog日志中。

2、binlog傳輸?shù)絪lave,并存儲到slave的relaylog后,讀取這個(gè)GTID的這個(gè)值設(shè)置gtid_next變量,即告訴Slave,下一個(gè)要執(zhí)行的GTID值。

3、sql線程從relay log中獲取GTID,然后對比slave端的binlog是否有該GTID。

4、如果有記錄,說明該GTID的事務(wù)已經(jīng)執(zhí)行,slave會忽略。

5、如果沒有記錄,slave就會執(zhí)行該GTID事務(wù),并記錄該GTID到自身的binlog,   在讀取執(zhí)行事務(wù)前會先檢查其他session持有該GTID,確保不被重復(fù)執(zhí)行。

6、在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。



五、配置GTID

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

1、主: 

[mysqld]

server_id=1               

gtid_mode=on                 #開啟gtid模式

enforce_gtid_consistency=on  #強(qiáng)制gtid一致性,開啟后對于特定create table不被支持

log_bin=master-binlog

log-slave-updates=1    

binlog_format=row            #強(qiáng)烈建議,其他格式可能造成數(shù)據(jù)不一致

skip_slave_start=1            


2、從: 

[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            



六、配置基于GTID的復(fù)制

1、新配置的mysql服務(wù)器 

在主服務(wù)器上執(zhí)行以下操作:

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


對于新配置的mysql服務(wù)器,按本文第五點(diǎn)描述配置參數(shù)文件后,在slave端執(zhí)行以下操作 

> 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;    #查看是否正常同步




2、已運(yùn)行經(jīng)典復(fù)制mysql服務(wù)器轉(zhuǎn)向GTID復(fù)制 

(1)按本文第五點(diǎn)描述配置參數(shù)文件; 

(2)所有服務(wù)器設(shè)置global.read_only參數(shù),等待主從服務(wù)器同步完畢;        

> SET @@global.read_only = ON; 


(3)依次重啟主從服務(wù)器; 

(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;





向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI