Mysql主主復(fù)制原理
主主復(fù)制的原理實(shí)際上是主從復(fù)制的原理柱恤,讓兩臺(tái)服務(wù)器互為主從数初,就實(shí)現(xiàn)了主主復(fù)制。以下介紹主從復(fù)制原理:
主從復(fù)制
如圖:
主從復(fù)制過(guò)程存在三個(gè)線程梗顺,Master端的I/O線程泡孩,Slave的I/O線程與SQL線程。Master端需要開(kāi)啟binlog日志寺谤,Slave端需要開(kāi)啟relaylog仑鸥。
1、Slave端的I/O讀取master.info文件变屁,獲取binlog文件名和位置點(diǎn)眼俊,然后向Master端的I/O線程請(qǐng)求,該binlog文件名和位置點(diǎn)的binlog信息粟关。
(master.info文件在配置主從復(fù)制時(shí)使用change master命令來(lái)指定生成)
2疮胖、Master端的I/O線程會(huì)根據(jù)Slave端的I/O線程請(qǐng)求的信息來(lái)讀取Master的binlog日志信息與及讀取到最新的binlog文件名和位置點(diǎn)一同返回給Slave的I/O線程。
3誊役、Slave端的I/O線程會(huì)把獲取到的binlog日志寫(xiě)入relaylog(中繼日志)文件中获列,并且更新master.info文件信息。(把讀取到Master最新的binlog日志文件名和位置點(diǎn)更新到master.info文件中蛔垢,下一次當(dāng)前位置去讀取Master的binlog日志)
4击孩、Slave端的SQL線程會(huì)定期讀取relaylog,把二進(jìn)制的日志解析成SQL語(yǔ)句鹏漆,并執(zhí)行這些SQL語(yǔ)句巩梢,同步數(shù)據(jù)到從庫(kù)中。
注意:mysql主從復(fù)制要求主從兩個(gè)數(shù)據(jù)庫(kù)版本相同艺玲,或者從機(jī)比主機(jī)版本高括蝠;要實(shí)現(xiàn)主主復(fù)制,則需要兩個(gè)數(shù)據(jù)庫(kù)版本相同饭聚。
使用mysqlbinlog命令查看logbin文件忌警,結(jié)果如下:
復(fù)制模式
1.? 異步模式(mysql async-mode)
主節(jié)點(diǎn)不會(huì)主動(dòng)push bin
log到從節(jié)點(diǎn),這樣有可能導(dǎo)致failover的情況下秒梳,也許從節(jié)點(diǎn)沒(méi)有即時(shí)地將最新的bin
log同步到本地法绵。
2.? 半同步模式(mysql semi-sync)
????? 主節(jié)點(diǎn)只需要接收到其中一臺(tái)從節(jié)點(diǎn)的返回信息箕速,就會(huì)commit;否則需要等待直到超時(shí)時(shí)間然后切換成異步模式再提交朋譬;這樣做的目的可以使主從數(shù)據(jù)庫(kù)的數(shù)據(jù)延遲縮小盐茎,可以提高數(shù)據(jù)安全性,確保了事務(wù)提交后徙赢,binlog至少傳輸?shù)搅艘粋€(gè)從節(jié)點(diǎn)上字柠,不能保證從節(jié)點(diǎn)將此事務(wù)更新到db中。性能上會(huì)有一定的降低狡赐,響應(yīng)時(shí)間會(huì)變長(zhǎng)窑业。
3.? 全同步模式
主節(jié)點(diǎn)和從節(jié)點(diǎn)全部執(zhí)行了commit并確認(rèn)才會(huì)向客戶端返回成功。
4.? GTID復(fù)制模式
在傳統(tǒng)的復(fù)制里面枕屉,當(dāng)發(fā)生故障数冬,需要主從切換,需要找到binlog和pos點(diǎn)搀庶,然后將主節(jié)點(diǎn)指向新的主節(jié)點(diǎn),相對(duì)來(lái)說(shuō)比較麻煩铜异,也容易出錯(cuò)哥倔。在MySQL 5.6里面,不用再找binlog和pos點(diǎn)揍庄,我們只需要知道主節(jié)點(diǎn)的ip咆蒿,端口,以及賬號(hào)密碼就行蚂子,因?yàn)閺?fù)制是自動(dòng)的沃测,MySQL會(huì)通過(guò)內(nèi)部機(jī)制GTID自動(dòng)找點(diǎn)同步。
多線程復(fù)制(基于庫(kù))食茎,在MySQL 5.6以前的版本蒂破,slave的復(fù)制是單線程的。一個(gè)事件一個(gè)事件的讀取應(yīng)用别渔。而master是并發(fā)寫(xiě)入的附迷,所以延時(shí)是避免不了的。唯一有效的方法是把多個(gè)庫(kù)放在多臺(tái)slave哎媚,這樣又有點(diǎn)浪費(fèi)服務(wù)器喇伯。在MySQL 5.6里面,我們可以把多個(gè)表放在多個(gè)庫(kù)拨与,這樣就可以使用多線程復(fù)制稻据。
基于GTID復(fù)制實(shí)現(xiàn)的工作原理
主節(jié)點(diǎn)更新數(shù)據(jù)時(shí),會(huì)在事務(wù)前產(chǎn)生GTID买喧,一起記錄到binlog日志中捻悯。
從節(jié)點(diǎn)的I/O線程將變更的bin log匆赃,寫(xiě)入到本地的relay log中。
SQL線程從relay log中獲取GTID秋度,然后對(duì)比本地binlog是否有記錄(所以MySQL從節(jié)點(diǎn)必須要開(kāi)啟binary log)炸庞。
如果有記錄,說(shuō)明該GTID的事務(wù)已經(jīng)執(zhí)行荚斯,從節(jié)點(diǎn)會(huì)忽略埠居。
如果沒(méi)有記錄,從節(jié)點(diǎn)就會(huì)從relay log中執(zhí)行該GTID的事務(wù)事期,并記錄到bin log滥壕。
在解析過(guò)程中會(huì)判斷是否有主鍵,如果沒(méi)有就用二級(jí)索引兽泣,如果有就用全部掃描绎橘。
復(fù)制方式
1、基于語(yǔ)句的復(fù)制在Master上執(zhí)行的SQL語(yǔ)句唠倦,在Slave上執(zhí)行同樣的語(yǔ)句称鳞。MySQL默認(rèn)采用基于語(yǔ)句的復(fù)制,效率比較高稠鼻。一旦發(fā)現(xiàn)沒(méi)法精確復(fù)制時(shí)冈止,會(huì)自動(dòng)選著基于行的復(fù)制
2、基于行的復(fù)制把改變的內(nèi)容復(fù)制到Slave候齿,而不是把命令在Slave上執(zhí)行一遍熙暴。從MySQL5.0開(kāi)始支持
3、混合類(lèi)型的復(fù)制默認(rèn)采用基于語(yǔ)句的復(fù)制慌盯,一旦發(fā)現(xiàn)基于語(yǔ)句的無(wú)法精確的復(fù)制時(shí)周霉,就會(huì)采用基于行的復(fù)制
相應(yīng)地,binlog的格式也有三種:STATEMENT亚皂,ROW俱箱,MIXED。
mysql主主復(fù)制配置
???????? 本方案使用基于GTID的復(fù)制模式孕讳,配置過(guò)程如下:
1. 兩臺(tái)數(shù)據(jù)庫(kù)服務(wù)器匠楚,IP分別為 192.168.216.128 和 192.168.216.129,在服務(wù)器上裝MYSQL(我的配置版本為5.5.56)
2. 打開(kāi) 192.168.216.128 服務(wù)器上的MYSQL的配置文件 /etc/my.cnf (路徑根據(jù)自己服務(wù)器的情況來(lái)看)厂财,將其中的 server-id 設(shè)為1(默認(rèn)為1芋簿,總之兩臺(tái)服務(wù)器要設(shè)置為不同的ID),然后重啟MYSQL服務(wù)
3. 打開(kāi)?192.168.216.129 服務(wù)器上的MYSQL的配置文件 /etc/my.cnf (路徑根據(jù)自己服務(wù)器的情況來(lái)看),將其中的 server-id 設(shè)為2(默認(rèn)為1)璃饱,然后重啟MYSQL服務(wù)
4. 設(shè)?192.168.216.128 為主服務(wù)器与斤,那么在主服務(wù)器上加一個(gè)從服務(wù)器可以登錄的用戶,語(yǔ)句如下:
GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.216.129'IDENTIFIED BY 'raisecom@123';
FLUSH PRIVILEGES;
建好后,在192.168.216.129 服務(wù)器上執(zhí)行以下語(yǔ)句
mysql -h 192.168.216.128 -uroot
-praisecom@123
然后試一下可不可以連上撩穿,如果可以磷支,則正確,如果連不上食寡,看一下什么原因雾狈,是否是防火墻的原因,如果是則去配置防火墻的規(guī)則抵皱。
5. 以上完成后在主服務(wù)器上執(zhí)行以下語(yǔ)句善榛,查詢master的狀態(tài)
show masterstatus;
可以看到以上結(jié)果,這兒我們使用master_auto_position配置呻畸,因此不需要關(guān)注File 和 Position移盆,其它的兩個(gè)分別是白名單和黑名單,意思為同步哪幾個(gè)數(shù)據(jù)庫(kù)和不同步哪幾個(gè)數(shù)據(jù)庫(kù)伤为,可自行根據(jù)需求進(jìn)行設(shè)置咒循。在從庫(kù)上執(zhí)行以下語(yǔ)句:
CHANGE MASTER TO
MASTER_HOST='192.168.216.128',
MASTER_USER='root',
MASTER_PASSWORD='raisecom@123',
MASTER_AUTO_POSITION=1;
6. 執(zhí)行完畢后,在從庫(kù)上繼續(xù)執(zhí)行如下語(yǔ)句:
slave start;
show slavestatus\G
這樣绞愚,查看從服務(wù)器的狀態(tài)叙甸,如果狀態(tài)中的用紅線標(biāo)出來(lái)兩個(gè)參數(shù)的值都為YES,那證明配置已經(jīng)成功位衩,否則可以檢查一下具體問(wèn)題出現(xiàn)在什么地方蚁署。
這樣,就算配置完成了蚂四。在主庫(kù)中新建數(shù)據(jù)庫(kù),新建一張表哪痰,插幾條數(shù)據(jù)遂赠,到從庫(kù)上查詢一下看是否已經(jīng)同步過(guò)來(lái)。
如果失敗晌杰,可以從以下幾個(gè)方面去排查問(wèn)題:
1.首先試一下主從服務(wù)器相互之間是否PING 得通
2.試一下遠(yuǎn)程連接是否正確跷睦,如果連不上,則有可能是網(wǎng)卡不一致肋演、防火墻沒(méi)有放行3306 端口
3.server-id 是否配成一致抑诸,主從不能一致
4.bin-log 的信息是否正確
二、如何配置MYSQL的主主復(fù)制爹殊?
上面說(shuō)了主從復(fù)制的配置方法蜕乡,現(xiàn)在接著上面的配置繼續(xù),然后實(shí)現(xiàn)雙主復(fù)制梗夸,讓以上的兩個(gè)服務(wù)器互為主從层玲。
1. 在主服務(wù)器上配置 /etc/my.cnf 文件,配置如下:
binlog_format=mixed
auto_increment_increment=2???????? #步進(jìn)值auto_imcrement。一般有n臺(tái)主MySQL就填n
auto_increment_offset=1??????????? #起始值辛块。一般填第n臺(tái)主MySQL畔派。此時(shí)為第一臺(tái)主MySQL
binlog-ignore=mysql??????????????? #忽略mysql庫(kù)【我一般都不寫(xiě)】
binlog-ignore=information_schema?? #忽略information_schema庫(kù)【我一般都不寫(xiě)】
gtid-mode = on
配置之后重啟MYSQL服務(wù)
2.在從服務(wù)器上配置 /etc/my.cnf 文件,配置如下
binlog_format=mixed
auto_increment_increment=2?? #步進(jìn)值auto_imcrement润绵。一般有n臺(tái)主MySQL就填n
auto_increment_offset=2?? #起始值线椰。一般填第n臺(tái)主MySQL。此時(shí)為第二臺(tái)主MySQL
binlog-ignore=mysql?? #忽略mysql庫(kù)【我一般都不寫(xiě)】
binlog-ignore=information_schema?? #忽略information_schema庫(kù)【我一般都不寫(xiě)】
gtid-mode = on
配置之后重啟MYSQL服務(wù)
3. 在從服務(wù)器上添加一個(gè)主服務(wù)器可以訪問(wèn)的用戶尘盼,命令如下:
GRANT REPLICATION
SLAVE ON *.* TO 'root'@'192.168.216.128'IDENTIFIED BY 'raisecom@123';
FLUSH PRIVILEGES
建好后憨愉,在192.168.216.128 服務(wù)器上執(zhí)行以下語(yǔ)句
mysql -h 192.168.216.129-uroot -praisecom@123
如果可以連上,則進(jìn)行下一步悔叽,連不上的話莱衩,參考上面進(jìn)行問(wèn)題排查。
4. 因?yàn)橐橹鲝慕颗欤袁F(xiàn)在從服務(wù)器也是master 笨蚁,所以也要查看一下?tīng)顟B(tài)
show masterstatus;
查到相應(yīng)的信息后,在原來(lái)的主服務(wù)器上執(zhí)行以下命令(因?yàn)楝F(xiàn)在它現(xiàn)在也是另一臺(tái)的從服務(wù)器)
CHANGE MASTER TO
MASTER_HOST='192.168.216.129',
MASTER_USER='root',
MASTER_PASSWORD='raisecom@123',
MASTER_AUTO_POSITION=1;
5. 執(zhí)行完畢后趟庄,在原主庫(kù)上繼續(xù)執(zhí)行如下語(yǔ)句:
start slave;
show slavestatus\G;
同上括细,如果出現(xiàn)如下畫(huà)面,則證明配置成功戚啥。
6. 在兩臺(tái)服務(wù)器的MYSQL中分別進(jìn)行一些建庫(kù)奋单、建表、插入猫十、更新等操作览濒,看一下另一臺(tái)會(huì)不會(huì)進(jìn)行同步,如果可以則證明主主配置成功拖云,否則還是上面的排錯(cuò)方法贷笛,進(jìn)行錯(cuò)誤排查。