一、GTID的簡介
1.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(強制)。
2.GTID的組成部分
前面是server_uuid:后面是一個序列號 例如:server_uuid:sequence number 7800a22c-95ae-11e4-983d-080027de205a:10 UUID:每個mysql實例的唯一ID,由於會傳遞到slave,所以也可以理解為源ID。 Sequence number:在每台MySQL服務器上都是從1開始自增長的序列,一個數值對應一個事務。
3.GTID比傳統復制的優勢
1、更簡單的實現failover,不用以前那樣在需要找log_file和log_Pos。特別是對運維人員來說應該是一件大喜的事情,在主從切換后,在傳統的方式里,你需要找到binlog和POS點,然后change master to指向, 而不是很有經驗的運維,往往會將其找錯,造成主從同步復制報錯,在mysql5.6里,你無須再知道binlog和POS點,你只需要知道master的IP、端口,賬號密碼即可,因為同步復制是自動的,mysql通過內部機制GTID自動找點同步。 2、更簡單的搭建主從復制。 3、比傳統復制更加安全。 4、GTID是連續沒有空洞的,因此主從庫出現數據沖突時,可以用添加空事物的方式進行跳過。
4.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、在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描
二、配置GTID
1.環境准備
1.操作系統:centos 6.6 x86_64 2.MySQL版本:5.6.36 MySQL Community Server(建議使用mysql-5.6.10以上的版本) 3.關閉防火牆與SELinux 4.時間同步 5.服務器: master:192.168.1.11 slave :192.168.1.12
2.修改主從my.cnf增加GTID支持
要在MySQL 5.6中使用復制功能,其服務配置段[mysqld]中於少應該定義如下選項:
binlog-format:二進制日志的格式,有row、statement和mixed幾種類型; 需要注意的是:當設置隔離級別為READ-COMMITED必須設置二進制日志格式為ROW,現在MySQL官方認為STATEMENT這個已經不再適合繼續使用;但mixed類型在默認的事務隔離級別下,可能會導致主從數據不一致; log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用於啟動GTID及滿足附屬的其它需求; master-info-repository和relay-log-info-repository:啟用此兩項,可用於實現在崩潰時保證二進制及從服務器安全的功能; sync-master-info:啟用之可確保無信息丟失; slave-paralles-workers:設定從服務器的SQL線程數;0表示關閉多線程復制功能; binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:啟用復制有關的所有校驗功能; binlog-rows-query-log-events:啟用之可用於在二進制日志記錄事件相關的信息,可降低故障排除的復雜度; log-bin:啟用二進制日志,這是保證復制功能的基本前提; server-id:同一個復制拓撲中的所有服務器的id號必須惟一;
master配置:
在 [mysqld] 加入如下:
binlog-format=ROW # 設置二進制日志格式, log-slave-updates=true #是否記錄從服務器同步數據動作 gtid-mode=on #啟用Gtid模式 enforce-gtid-consistency=true #是否強制GTID的一致性 master-info-repository=TABLE #master信息的記錄位置 relay-log-info-repository=TABLE #中繼日志信息的記錄位置 sync-master-info=1 #啟用之可確保無信息丟失 slave-parallel-workers=2 #設置從服務器復制線程數 binlog-checksum=CRC32 #設置binlog校驗算法(循環冗余校驗碼) master-verify-checksum=1 #設置主服務器是否校驗 slave-sql-verify-checksum=1 #設置從服務器是否校驗 binlog-rows-query-log_events=1 server-id=1 report-port=3306 report-host=192.168.1.11 #設置報告給哪台服務器,一般設置為本機的主機名。
在Slave服務器上安裝MySQL與在Master服務器上安裝方法相同,這里不在介紹,而在Slave服務器上安裝Mysql有兩個參數與Master服務器不同。如下:
server-id=2 report-host=192.168.1.12
重啟MySQL服務
2.在Master服務器上為Slave創建復制用戶
mysql> grant replication slave,replication client on *.* to 'replication'@'192.168.1.%' identified by '123456'; Query OK, 0 rows affected (0.15 sec) mysql> flush privileges; Query OK, 0 rows affected (0.06 sec)
3.配置master只讀鎖,查看二進制日志位置
mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.10 sec) mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 561 | | | e9598c9e-f605-11e7-9c77-000c29c24776:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.04 sec)
4.進行數據庫備份並復制到slave上,不要關閉這個mysql進程連接,避免鎖失效,我們另起一個ssh連接master服務器:
[root@localhost ~]# mysqldump --single-transaction --master-data=2 --all-databases --triggers --routines --events > /tmp/database-backup.sql [root@localhost ~]# scp /tmp/database-backup.sql 192.168.1.12:/root
5.回到剛才mysql進程,進行解鎖
mysql> UNLOCK TABLES; Query OK, 0 rows affected (0.05 sec)
6.導入sql文件,並刷新權限:
[root@localhost ~]# mysql < database-backup.sql [root@localhost ~]# mysql -e "FLUSH PRIVILEGES;"
7.slave上將master設置為主服務器
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.11',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=561; Query OK, 0 rows affected, 2 warnings (0.17 sec) mysql> start slave; Query OK, 0 rows affected, 1 warning (0.15 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.11 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 561 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 314 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes .........................
......................略 Master_Server_Id: 1 Master_UUID: e9598c9e-f605-11e7-9c77-000c29c24776 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: 826b1c09-f608-11e7-9c88-000c29e543b4:1, e9598c9e-f605-11e7-9c77-000c29c24776:1-2 Auto_Position: 0
1 row in set (0.00 sec)
8.在主服務器上查看從服務器信息:
mysql> show slave hosts; +-----------+--------------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+--------------+------+-----------+--------------------------------------+
| 2 | 192.168.1.12 | 3306 | 1 | 826b1c09-f608-11e7-9c88-000c29e543b4 |
+-----------+--------------+------+-----------+--------------------------------------+
1 row in set (0.00 sec)
