基於GTIDs的MySQL Replicationhtml
一、GTIDs(Global transaction identifiers)全局事務標識符,是mysql 5.6新加入的一項技術mysql
二、當使用GTIDs時,每個事務均可以被識別而且跟蹤sql
三、添加新的slave或者當發生故障須要將master身份或者角色遷移到slave上時,都無需考慮是哪個二進制日誌以及哪一個position值,極大簡化了相關操做vim
四、GTIDs是徹底基於事務的,所以不支持MYISAM存儲引擎服務器
五、GTID由source_id和transaction_id組成:
1>source_id來自於server_uuid,能夠在auto.cnf中看到
2>transation_id是一個序列數字,自動生成session
一、不支持非事務引擎(MYisam),由於可能會致使多個gtid分配給同一個事務
二、create table ... select 語句不支持(主庫語法報錯)
三、create/drop temporary table 語句不支持
四、必須使用enforce-gtid-consistency參數
五、sql-slave-skip-counter不支持(傳統的跳過錯誤方式)
六、GTID複製環境中必需要求統一開啓和GTID或者關閉GTID
七、在mysql 5.6.7以前,使用mysql_upgrade命令會出現問題app
1. A transaction is executed and committed on the master.
This transaction is assigned a GTID using the master's UUID and the smallest nonzero transaction sequence number not yet used on this server; the GTID is written to the master's binary log (immediately preceding the transaction itself in the log).
2. After the binary log data is transmitted to the slave and stored in the slave's relay log, the slave reads the GTID and sets the value of its gtid_next system variable as this GTID. This tells the slave that the next transaction must be logged using this GTID.It is important to note that the slave sets gtid_next in a session context.
3. The slave verifies that this GTID has not already been used to log a transaction in its own binary log. If this GTID has not been used, the slave then writes the GTID, applies the transaction, and writes the transaction to its binary log. By reading and checking the transaction's GTID first, before processing the transaction itself, the slave guarantees not only that no previous transaction having this GTID has been applied on the slave, but also that no other session has already read this GTID but has not yet committed the associated transaction. In other words, multiple clients are not permitted to apply the same transaction concurrently.
4. Because gtid_next is not empty, the slave does not attempt to generate a GTID for this transaction but instead writes the GTID stored in this variable—that is, the GTID obtained from the master—immediately preceding the transaction in its binary log.
總結:有了GTID大大的簡化了複製的過程,下降了維護的難度ide
在生產環境中,大多數狀況下使用的MySQL5.6基本上都是從5.5或者更低的版本升級而來,這就意味着以前的mysql replication方案是基於傳統的方式部署,而且已經在運行,所以,接下來咱們就利用已有的環境升級至基於GITDs的Replication測試
傳統的方案部署參考:http://www.javashuo.com/article/p-fnkusxgp-bc.htmlui
注意:
一、開啓GITDs須要在master和slave上都配置gtid-mode,log-bin,log-slave-updates,enforce-gtid-consistency(該參數在5.6.9以前是--disable-gtid-unsafe-statement)
二、其次,slave還須要增長skip-slave-start參數,目的是啓動的時候,先不要把slave起來,須要作一些配置
詳細操做步驟:
當前環境是傳統的AB複製轉換成GTID模式
master:192.168.1.166
slave:192.168.1.114
一、將master和slave服務器都設置爲read-only
mysql>set @@global.read_only=ON;
二、中止兩臺服務器的mysql服務
三、配置master
master: [root@master ~]# vim /etc/my.cnf log-bin=mysql-bin gtid-mode=on log-slave-updates enforce-gtid-consistency [root@master ~]# service mysqld restart
四、配置slave
slave: [root@slave1 ~]# vim /etc/my.cnf gtid-mode=on log-bin log-slave-updates enforce-gtid-consistency skip-slave-start [root@slave1 ~]# service mysqld restart mysql> change master to master_host='192.168.1.166',master_port=3306,master_user='slave',master_password='123',master_auto_position=1; mysql> start slave; mysql> show slave status \G; Auto_Position: 1
五、關閉read-only模式
mysql> set @@global.read_only=OFF;
六、測試
master查看: mysql> select * from db01.table03; +------+------+ | id | name | +------+------+ | 1 | haha | | 2 | wowo | | 4 | yoyo | | 1 | haha | | 2 | wowo | | 4 | yoyo | +------+------+ 6 rows in set (0.07 sec) slave查看: mysql> select * from db01.table03; +------+------+ | id | name | +------+------+ | 1 | haha | | 2 | wowo | | 4 | yoyo | | 1 | haha | | 2 | wowo | | 4 | yoyo | +------+------+ 6 rows in set (0.07 sec) master插入數據並查看: mysql> insert into db01.table03 values(5,'ouou'); Query OK, 1 row affected (0.04 sec) mysql> select * from db01.table03; +------+------+ | id | name | +------+------+ | 1 | haha | | 2 | wowo | | 4 | yoyo | | 1 | haha | | 2 | wowo | | 4 | yoyo | | 5 | ouou | +------+------+ 7 rows in set (0.00 sec) slave查看: mysql> select * from db01.table03; +------+------+ | id | name | +------+------+ | 1 | haha | | 2 | wowo | | 4 | yoyo | | 1 | haha | | 2 | wowo | | 4 | yoyo | | 5 | ouou | +------+------+ 7 rows in set (0.00 sec) 而且master上面操做後查看slave的狀態,下面就會有事務產生 mysql> show slave status\G; Retrieved_Gtid_Set: 5624c184-5b55-11e8-b117-000c293dfd08:1 Executed_Gtid_Set: 5624c184-5b55-11e8-b117-000c293dfd08:1 Auto_Position: 1