mysql GTID主從複製

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:

wKioL1fPtM-z-W2pAAFw0TKkMMs280.png-wh_50

 

從庫2:

wKioL1fPtN7wirVjAAFmfq57Pk4989.png-wh_50

 

主從同步:

   主庫:

wKiom1fPtPHRwGKXAAA-E0Dy984820.png-wh_50

 

從庫1:

wKioL1fPtP2SSDq6AAAqtQkRyck641.png-wh_50

 

從庫2:

wKioL1fPtQvzg7RAAAAsn8steFM100.png-wh_50

 

n  4 壓力測試

 

每次100個併發連接數,執行5次

 

首先測試一主一從

主庫:

wKiom1fPtWzyfte3AAC6MbCaOxE006.png-wh_50

 

然後測試一主二從

主庫:

wKiom1fPtXmSYXE6AAC5vCQZrIw901.png-wh_50

 

最後測試一主三從

主庫:

wKiom1fPtYmwHziwAAC4mBvMc9Y655.png-wh_50

 

通過測試可以看出來,GTID的主從複製在一主一從的時候主數據庫的性能較好,一主二從的時候主數據庫的性能也還好,但是一主三從的時候主庫的性能就降低了不少,通過不斷壓力測試,最低的查詢時間都比前兩種要高,主服務器的性能降低了。

 

 

   經典的mysql主從複製,需要主服務器先備份出所有的數據,然後上傳到從服務器,從服務器將主庫備份的數據導入本地數據庫,然後纔開始主從複製。因爲這種方式從庫需要知道主庫的bin log以及還原點。

   GTID這種主從複製,從庫的數據庫可以什麼都沒有,它會自動將主庫中所有的數據同步到本地,最後從庫和主庫的數據一模一樣。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章