1)mysql支持的幾種復(fù)制形式:
異步復(fù)制(Asynchronous replication)
MySQL默認(rèn)的復(fù)制即是異步的耳贬,主庫在執(zhí)行完客戶端提交的事務(wù)后會(huì)立即將結(jié)果返給給客戶端,并不關(guān)心從庫是否已經(jīng)接收并處理悲没,這樣就會(huì)有一個(gè)問題,主如果crash掉了亿汞,此時(shí)主上已經(jīng)提交的事務(wù)可能并沒有傳到從上亮垫,如果此時(shí),強(qiáng)行將從提升為主躺涝,可能導(dǎo)致新主上的數(shù)據(jù)不完整厨钻。
全同步復(fù)制(Fully synchronous replication)
指當(dāng)主庫執(zhí)行完一個(gè)事務(wù),所有的從庫都執(zhí)行了該事務(wù)才返回給客戶端坚嗜。因?yàn)樾枰却袕膸靾?zhí)行完該事務(wù)才能返回夯膀,所以全同步復(fù)制的性能必然會(huì)收到嚴(yán)重的影響。
半同步復(fù)制(Semisynchronous replication)
介于異步復(fù)制和全同步復(fù)制之間苍蔬,主庫在執(zhí)行完客戶端提交的事務(wù)后不是立刻返回給客戶端诱建,而是等待至少一個(gè)從庫接收到并寫到relay log中才返回給客戶端。相對(duì)于異步復(fù)制碟绑,半同步復(fù)制提高了數(shù)據(jù)的安全性涂佃,同時(shí)它也造成了一定程度的延遲,這個(gè)延遲最少是一個(gè)TCP/IP往返的時(shí)間蜈敢。所以辜荠,半同步復(fù)制最好在低延時(shí)的網(wǎng)絡(luò)中使用。
2)半同步復(fù)制的原理:
在復(fù)制繼續(xù)運(yùn)行之前抓狭,確保至少有一個(gè)slave將變更寫到磁盤伯病。也就是說,對(duì)每個(gè)連接來說否过,如果發(fā)生master崩潰午笛,至多只有一個(gè)事務(wù)丟失。參考下圖:
3)苗桂、半同步復(fù)制的基本流程:
MySQL半同步復(fù)制的實(shí)現(xiàn)是建立在MySQL異步復(fù)制的基礎(chǔ)上的药磺。MySQL支持兩種略有不同的半同步復(fù)制:AFTER_SYNC和AFTER_COMMIT(受rpl_semi_sync_master_wait_wait_point控制)。
開啟半同步復(fù)制時(shí)煤伟,Master在返回之前會(huì)等待Slave的響應(yīng)或超時(shí)癌佩。當(dāng)Slave超時(shí)時(shí)木缝,半同步復(fù)制退化成異步復(fù)制。這也是MySQL半同步復(fù)制存在的一個(gè)問題
AFTER_SYNC模式是MySQL 5.7才支持的半同步復(fù)制方式围辙,也是MySQL5.7默認(rèn)的半同步復(fù)制方式
1我碟、Prepare thetransaction in the storage engine(s).
2、Write thetransaction to the binlog, flush the binlog to disk.
3姚建、Wait for atleast one slave to acknowledge the reception for the binlog events for thetransaction.
4矫俺、Commit thetransaction to the storage engine(s).
半同步復(fù)制AFTER_COMMIT模式的基本流程
MySQL 5.5和5.6的半同步復(fù)制只支持AFTER_COMMIT:
1、Prepare thetransaction in the storage engine(s).
2掸冤、Write thetransaction to the binlog, flush the binlog to disk.
3厘托、Commit thetransaction to the storage engine(s).
4、Wait for atleast one slave to acknowledge the reception for the binlog events for thetransaction.
兩種方式小結(jié):1稿湿、after_sync:日志先復(fù)制到slave催烘,然后master再commit,after_commit:先在master上commit缎罢,然后將日志復(fù)制到slave伊群。2、after_sync方式下:所有復(fù)制到slave的事務(wù)不一定在master上commit; after_commit方式下策精,所以復(fù)制到slave上的日志一定在master上commit,但在master上commit的日志不一定復(fù)制到了slave舰始。3、after_commit方式下:在master宕機(jī)的情況下咽袜,無法保證數(shù)據(jù)的一致性
4)配置半同步復(fù)制
配置基礎(chǔ)是在已經(jīng)配置好異步復(fù)制丸卷。
主服務(wù)器操作:
1、安裝半同步插件:
mysql>install plugin rpl_semi_sync_master soname'semisync_master.so';
2询刹、查看插件安裝是否成功:
3谜嫉、編輯配置文件,啟動(dòng)半同步服務(wù):停止mysqld服務(wù)凹联,編輯/etc/my.cnf文件沐兰,添加如下內(nèi)容:
rpl_semi_sync_master_enabled = 1#啟用半同步服務(wù)
rpl_semi_sync_master_timeout = 1000#超時(shí)設(shè)置,如果master在超時(shí)之后收不到任何確認(rèn)蔽挠,就還原為民步復(fù)制繼續(xù)操作住闯,不再使用半同步復(fù)制煌珊。
以上兩個(gè)選項(xiàng)也可以在mysql命令行通過變量設(shè)置兼蜈,如下:
mysql> set global rpl_semi_sync_master_enabled =1;
mysql> set rpl_semi_sync_master_timeout 1000;
4、啟動(dòng)myslqd服務(wù)婶熬,主服務(wù)器配置完成杠巡。
5量窘、查看配置的相關(guān)信息。
配置slave服務(wù)器:
1氢拥、安裝插件:
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
2蚌铜、確認(rèn)插件安裝是否成功:
3锨侯、編輯配置文件,啟動(dòng)半同步服務(wù):停止mysqld服務(wù)厘线,編輯/etc/my.cnf文件识腿,添加如下內(nèi)容:
rpl_semi_sync_slave_enabled = 1
同樣也可以在命令進(jìn)行設(shè)置:
set global rpl_semi_sync_master_enabled =1;
4出革、啟動(dòng)mysqld服務(wù)造壮,從服務(wù)器配置完成。
5骂束、相看配置的相關(guān)信息
6耳璧、完成配置后,重啟同步進(jìn)程展箱,查看同步狀態(tài)信息旨枯。
在主服務(wù)器執(zhí)行show global status like 'rpl_semi%';可以看到有兩個(gè)從服務(wù)器連接上來
1)監(jiān)控半同步狀態(tài):可以使用以下命令查看半同步的狀態(tài)信息:
在master上:
mysql> show global status like 'rpl_semi%';
Rpl_semi_sync_master_clients表示啟用半同步的slave的數(shù)目
Rpl_semi_sync_master_status表示主服務(wù)器半同步服務(wù)的狀態(tài)
從服務(wù)器上:
mysql> show global status like 'rpl_semi%';
Rpl_semi_sync_slave_statu:表示從服務(wù)器上半同步的狀態(tài)。