基于GTID的復(fù)制是從Mysql5.6開始支持的一種新的復(fù)制方式烦粒,此方式與傳統(tǒng)基于日志的方式存在很大的差異祝高,在原來的基于日志的復(fù)制中恬偷,從服務(wù)器連接到主服務(wù)器并告訴主服務(wù)器要從哪個二進(jìn)制日志的偏移量開始執(zhí)行增量同步供炎,這時我們?nèi)绻付ǖ娜罩酒屏坎粚Χ罨@與可能造成主從數(shù)據(jù)的不一致妙啃,而基于GTID的復(fù)制會避免。
在基于GTID的復(fù)制中俊戳,首先從服務(wù)器會告訴主服務(wù)器已經(jīng)在從服務(wù)器執(zhí)行完了哪些事務(wù)的GTID值揖赴,然后主庫會有把所有沒有在從庫上執(zhí)行的事務(wù),發(fā)送到從庫上進(jìn)行執(zhí)行抑胎,并且使用GTID的復(fù)制可以保證同一個事務(wù)只在指定的從庫上執(zhí)行一次燥滑,這樣可以避免由于偏移量的問題造成數(shù)據(jù)不一致。
什么是GTID圆恤,也就是全局事務(wù)ID突倍,其保證為每一個在主上提交的事務(wù)在復(fù)制集群中可以生成一個唯一的ID。
一個GITD由兩部分組成的盆昙,分別是source_id 和transaction_id羽历,GTID=source_id:transaction_id,其中source_id就是執(zhí)行事務(wù)的主庫的server-uuid值淡喜,server-uuid值是在mysql服務(wù)首次啟動生成的秕磷,保存在數(shù)據(jù)庫的數(shù)據(jù)目錄中,在數(shù)據(jù)目錄中有一個auto.conf文件炼团,這個文件保存了server-uuid值(唯一的)澎嚣。而事務(wù)ID則是從1開始自增的序列疏尿,表示這個事務(wù)是在主庫上執(zhí)行的第幾個事務(wù),Mysql會保證這個事務(wù)和GTID是一比一的關(guān)系易桃。
配置主數(shù)據(jù)庫服務(wù)器需要做的大概和傳統(tǒng)的主從配置差不多褥琐,需要起碼的在主服務(wù)器上建立復(fù)制賬號,還要配置數(shù)據(jù)庫日志文件的目錄晤郑,這是必須的啟動bin_log日志敌呈。
可以指定bin_log存放目錄,而不是用數(shù)據(jù)目錄造寝,分開存儲是個好習(xí)慣磕洪,特別是如果把日志和數(shù)據(jù)放在不同的磁盤分區(qū)上,這樣不但可以避免日志的增長把數(shù)據(jù)磁盤分區(qū)占滿诫龙,也可以提高了磁盤IO析显。如bin_log = /usr/local/mysql/log/mysql-bin。
優(yōu)點(diǎn)
? ?A:很方便的進(jìn)行故障轉(zhuǎn)移签赃,因?yàn)镚TID是全局唯一的標(biāo)識符谷异,所以就很簡單知道哪些事務(wù)在從服務(wù)器沒有執(zhí)行,在多個從服務(wù)器也沒必要進(jìn)行多個日志偏移量配置了.
? ?B:從庫和主庫的數(shù)據(jù)一致性姊舵。
缺點(diǎn)
? A:故障處理比日志處理復(fù)雜晰绎。
? B:執(zhí)行語句的一些限制。
開始配置GTID主從復(fù)制
虛擬機(jī)IP:192.168.136.142(Master)括丁、192.168.136.143(Slave)
Mysql版本:5.6(5.7的配置與5.6稍微有些不一樣荞下,如果你的Mysql版本是5.7,可以參考其他文章)
首先配置一下主服務(wù)器史飞,編輯/etc/my.cnf
[mysqld]
port =3306socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /data/mysql
pid-file = /data/mysql/mysql.pidserver-id =142log_bin = mysql-bin
bin_log = /usr/local/mysql/log/mysql-bin
binlog_format = ROW //建議row
log-slave-updates=true //在從服務(wù)器進(jìn)入主服務(wù)器傳入過來的修改日志所使用尖昏,在Mysql5.7之前主從架構(gòu)上使用gtid模式的話,必須使用此選項(xiàng)构资,在Mysql5.7取消了抽诉,會增加系統(tǒng)負(fù)載。
enforce-gtid-consistency=true? //?強(qiáng)制gtid一直性吐绵,用于保證啟動gitd后事務(wù)的安全迹淌;
gtid-mode=on //開啟gtid模式
master_info_repository=TABLE
relay_log_info_repository=TABLE //指定中繼日志的存儲方式,默認(rèn)是文件己单,這樣配置是使用了 兩個表唉窃,是INNODB存儲引擎,好處是當(dāng)出現(xiàn)數(shù)據(jù)庫崩潰時纹笼,利用INNODE事務(wù)引擎的特點(diǎn)纹份,對這兩個表進(jìn)行恢復(fù),以保證從服務(wù)器可以從正確位置恢復(fù)數(shù)據(jù)。
sync-master-info=1//同步master_info,任何事物提交以后都必須要把事務(wù)提交以后的二進(jìn)制日志事件的位置對應(yīng)的文件名稱蔓涧,記錄到master_info中件已,下次啟動自動讀取,保證數(shù)據(jù)無丟失
slave-parallel-workers=2//設(shè)定從服務(wù)器的啟動線程數(shù)元暴,0表示不啟動
binlog-checksum=CRC32? ? ? ? ? //主服務(wù)端在啟動的時候要不要校驗(yàn)bin-log本身的校驗(yàn)碼
master-verify-checksum=1//都是在服務(wù)器出現(xiàn)故障情況下篷扩,讀取對服務(wù)器有用的數(shù)據(jù)
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1//啟用后,可用于在二進(jìn)制日志記錄事件相關(guān)信息昨寞,可降低故障排除復(fù)雜度(并非強(qiáng)制啟動)
report-port=3306
report-host=192.168.136.142
配置完成之后別忘了重啟Mysql瞻惋。
查看一下master狀態(tài),多了一項(xiàng)援岩。
主服務(wù)進(jìn)入Mysql,命令行執(zhí)行授權(quán)
grant replication client,replication slave on *.* to root@'192.168.136.%'identified by'root123';? //ip段與賬號密碼
flush privileges;? //刷新權(quán)限
show grantsforroot@'192.168.136.%';
啟動配置之前掏导,我們同樣需要對從服務(wù)器進(jìn)行初始化享怀。對從服務(wù)器初始化的方法基本和基于日志點(diǎn)是相同的,只不過在啟動了GTID模式后趟咆,在備份中所記錄的就不是備份時的二進(jìn)制日志文件名和偏移量了添瓷,而是記錄的是備份時最后的GTID值。
查看一下有哪些數(shù)據(jù)庫值纱,退出Mysql終端鳞贷,進(jìn)入一個目錄,把目標(biāo)庫備份一下虐唠,這里是testdb
mysqldump --single-transaction --master-data=2--triggers --routines --database testdb -uroot -p > testdb.sql
備份完成之后搀愧,查看一下sql文件內(nèi)容。
然后把當(dāng)前sql文件拷貝到從服務(wù)器疆偿,這里使用scp命令咱筛。
scp -P22 testdb.sql root@192.168.136.143:/data/mysql/
拷貝完之后,進(jìn)入從服務(wù)器Mysql終端杆故,創(chuàng)建目標(biāo)數(shù)據(jù)庫迅箩,然后倒入到從庫。
mysql -uroot -p testdb < testdb.sql
倒入成功之后处铛,接下來配置從服務(wù)器饲趋,與主服務(wù)器配置大概一致,從服務(wù)器可以在配置文件里面添加 read_only=ON ,使從服務(wù)器只能進(jìn)行讀取操作撤蟆,此參數(shù)對超級用戶無效奕塑,并且不會影響從服務(wù)器的復(fù)制;
port =3306socket = /tmp/mysql.sock
basedir
= /usr/local/mysql
datadir = /data/mysql
pid-file = /data/mysql/mysql.pid
user = mysql
bind-address =0.0.0.0server-id =143
log_bin = mysql-bin
bin_log = /usr/local/mysql/log/mysql-bin
binlog_format = ROW? ? //建議row
log-slave-updates=trueenforce-gtid-consistency=truegtid-mode=on
master_info_repository=TABLE?
relay_log_info_repository=TABLE? //指定中繼日志的存儲方式枫疆,默認(rèn)是文件爵川,這樣配置是使用了 兩個表,是INNODB存儲引擎息楔,好處是當(dāng)出現(xiàn)數(shù)據(jù)庫崩潰時寝贡,利用INNODE事務(wù)引擎的特點(diǎn)扒披,對這兩個表進(jìn)行恢復(fù),以保證從服務(wù)器可以從正確位置恢復(fù)數(shù)據(jù)圃泡。
sync-master-info=1slave-parallel-workers=2? //開啟線程數(shù)碟案,0就表示禁用線程binlog-checksum=CRC32
master-verify-checksum=1slave-sql-verify-checksum=1binlog-rows-query-log_events=1report-port=3306report-host=192.168.136.143
read_only = on //這個參數(shù)主要保證從服務(wù)器的數(shù)據(jù)安全性
別忘了重啟mysql。
然后進(jìn)入mysql終端颇蜡,使用change master 配置主從
change master to master_host='192.168.136.142',master_user='root',master_passwrd='root123',master_auto_position=1;
start slave;? //配置完成啟動slave
?在主數(shù)據(jù)庫端查看一下
配置成功了价说。然后試著在主庫上執(zhí)行一條insert 語句,在從庫上查看风秤,OK鳖目,數(shù)據(jù)也有了~~~