MySql主從復制的配置(GTID方式)實例講解

GTID是一個基於原始mysql伺服器生成的一個已經被成功執行的全局事務ID,它由伺服器ID以及事務ID組合而成。這個全局事務ID不僅僅在原始伺服器器上唯一,在所有存在主從關系 的mysql伺服器上也是唯一的。正是因為這樣一個特性使得mysql的主從復制變得更加簡單,以及資料庫一致性更可靠。本文主要描述瞭快速配置一個基於GTID的主從復制架構,供大傢參考。

一、GTID的概念

全局事務標識:global transaction identifiers; GTID是一個事務一一對應,並且全局唯一ID; 一個GTID在一個伺服器上隻執行一次,避免重復執行導致數據混亂或者主從不一致; GTID用來代替傳統復制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS開啟復制。而是使用MASTER_AUTO_POSTION=1的方式開始復制; MySQL-5.6.5開始支持的,MySQL-5.6.10後開始完善; 在傳統的slave端,binlog是不用開啟的,但是在GTID中slave端的binlog是必須開啟的,目的是記錄執行過的GTID(強制)。

二、GTID的組成

GTID = source_id:transaction_id

source_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的優勢

更簡單的實現failover,不用以前那樣在需要找log_file和log_pos; 更簡單的搭建主從復制; 比傳統的復制更加安全; GTID是連續的沒有空洞的,保證數據的一致性,零丟失。

四、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,確保不被重復執行; 在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。

GTID的詳細原理請參考:MySql Replication基本原理

五、配置GTID

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

1、主:
[mysqld]
#GTID:
server_id=54
gtid_mode=on
enforce_gtid_consistency=on

#binlog
log_bin=master-binlog
log-slave-updates=1    
binlog_format=row

#relay log
skip_slave_start=1            

2、從:
[mysqld]
#GTID:
gtid_mode=on
enforce_gtid_consistency=on
server_id=197

#binlog
log-bin=slave-binlog
log-slave-updates=1
binlog_format=row

#relay log
skip_slave_start=1

配置文件中的參數解釋請參考:MySql Replication配置項簡述

六、配置基於GTID的復制

1、新配置的mysql伺服器

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

mysql> CHANGE MASTER TO  
    -> MASTER_HOST='mysql-server-01',    
    -> MASTER_USER='slave',    
    -> MASTER_PASSWORD='123456',    
    -> MASTER_PORT=3306,    
    -> MASTER_AUTO_POSITION = 1;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: mysql-server-01
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-binlog.000001
          Read_Master_Log_Pos: 151
               Relay_Log_File: mysql-server-02-relay-bin.000002
                Relay_Log_Pos: 369
        Relay_Master_Log_File: master-binlog.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 

可以看到復制工作已經開始且正常

2、已運行經典復制mysql伺服器轉向GTID復制

按本文第五點描述配置參數文件; 所有伺服器設置global.read_only參數,等待主從伺服器同步完畢:mysql> SET @@global.read_only = ON;; 依次重啟主從伺服器; 使用change master 更新主從配置;

`

mysql> CHANGE MASTER TO

> MASTER_HOST = host,

> MASTER_PORT = port,

> MASTER_USER = user,

> MASTER_PASSWORD = password,

> MASTER_AUTO_POSITION = 1;

5. 從庫開啟復制:mysql> START SLAVE;`

6. 驗證主從復制。

發佈留言