Mysql主從複製之GTID新特性
n 1 GTID複製原理
GTID是一個基於原始mysql服務器生成的一個已經被成功執行的全局事務ID,它由服務器ID以及事務ID組合而成。這個全局事務ID不僅僅在原始服務器器上唯一,在所有存在主從關係的mysql服務器上也是唯一的。正是因爲這樣一個特性使得mysql的主從複製變得更加簡單,以及數據庫一致性更可靠。
n 1.1當一個事務在主庫端執行並提交時,產生GTID,一同記錄到binlog日誌中。
n 1.2 當binlog傳輸到slave,並存儲到slave的relaylog後,讀取這個GTID的這個值設置gtid_next變量,即告訴Slave,下一個要執行的GTID值。
n 1.3 sql線程從relay log中獲取GTID,然後對比slave端的binlog是否有該GTID。
n 1.4 如果有記錄,說明該GTID的事務已經執行,slave會忽略。
n 1.5 如果沒有記錄,slave就會執行該GTID事務,並記錄該GTID到自身的binlog,在讀取執行事務前會先檢查其他session持有該GTID,確保不被重複執行。
n 1.6在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。
n 2 GTID複製實現過程
n 2.1 試驗環境
[root@mysqlserver ~]# cat/etc/redhat-release
CentOS release 6.6 (Final)
Master : 192.168.200.134
Slave1 : 192.168.200.136
Slave2 : 192.168.200.137
n 2.2 安裝mysql
下載好Mysql源:mysql57-community-release-el6-8.noarch.rpm
Yum安裝mysql源
[root@mysqlserver software]# yumlocalinstall mysql57-community-release-el6-8.noarch.rpm –y
Yum安裝mysql
[root@mysqlserver software]# yuminstall mysql-community-server –y
這裏安裝的是最新版的mysql-5.7
到這裏已經安裝好了,啓動mysql的方式和以前一樣
在啓動mysql之前我們先將selinux關掉
[root@mysqlserver ~]# vim/etc/selinux/config
SELINUX=disabled
[root@mysqlserver ~]# setenforce 0
在防火牆上開啓3306端口
[root@mysqlserver ~]# iptables -AINPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
然後開始啓動mysql
[root@mysqlserver software]#service mysqld start
Mysql的5.7版本對進入數據庫的root密碼要求很高,要求要改兩次密碼
首先確保數據庫的狀態是關閉的
[root@mysqlserver software]#service mysqld stop
先跳過授權表直接進入數據庫
[root@mysqlserver ~]# mysqld_safe--user=mysql --skip-grant-tables &
[root@mysqlserver ~]# mysql –uroot –p
直接回車進去
mysql>update mysql.user setauthentication_string=password(‘abc123ABC’) where user='root';
mysql>flush privileges;
mysql>quit
[root@mysqlserver ~]# mysql –uroot –pabc123ABC
mysql> set globalvalidate_password_policy=0;
mysql> alter mysql.userroot@localhost identified by 'abc123ABC';
n 2.3 GTID實現過程
n 2.3.1 主從庫開啓gtid
[root@mysqlserver ~]# vim/etc/my.cnf
需要添加如下三條記錄
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
n 2.3.2 主從庫均開啓bin log
log-bin=/var/lib/mysql/mysql-bin
binlog_format = row
n 2.3.4主庫授權用戶
mysql>grant replication slave on*.* to yang@’192.168.200.%’ identified by ‘abc123ABC’;
mysql>flush privileges;
n 2.3.5從庫change master連主庫
[root@mysqlslave1 ~]# mysql -uroot-pabc123ABC
mysql> change master tomaster_host='192.168.200.134',master_user='yang',master_password='abc123ABC',master_auto_position=1;
n 2.3.6 打開從庫連接主庫的開關
mysql> start slave;
n 3 實驗測試
從庫1:
從庫2:
主從同步:
主庫:
從庫1:
從庫2:
n 4 壓力測試
每次100個併發連接數,執行5次
首先測試一主一從
主庫:
然後測試一主二從
主庫:
最後測試一主三從
主庫:
通過測試可以看出來,GTID的主從複製在一主一從的時候主數據庫的性能較好,一主二從的時候主數據庫的性能也還好,但是一主三從的時候主庫的性能就降低了不少,通過不斷壓力測試,最低的查詢時間都比前兩種要高,主服務器的性能降低了。
經典的mysql主從複製,需要主服務器先備份出所有的數據,然後上傳到從服務器,從服務器將主庫備份的數據導入本地數據庫,然後纔開始主從複製。因爲這種方式從庫需要知道主庫的bin log以及還原點。
GTID這種主從複製,從庫的數據庫可以什麼都沒有,它會自動將主庫中所有的數據同步到本地,最後從庫和主庫的數據一模一樣。