Mysql主從三種復(fù)制模式(異步復(fù)制,半同步復(fù)制,組復(fù)制)
MySQL異步復(fù)制
MySQL異步復(fù)制是主從復(fù)制過程中默認(rèn)的復(fù)制模式。主從復(fù)制涉及三個(gè)線程,master I/O線程、slave I/O線程、slave sql線程。因?yàn)槭钱惒綇?fù)制,所以master事務(wù)的提交,不需要經(jīng)過slave的確認(rèn),即master I/O線程提交事務(wù)后,不需要等待slave I/O線程的回復(fù)確認(rèn),master并不保證binlog一定寫入到了relay log中;而slave I/O把binlog寫入relay log后,由slave sql線程異步執(zhí)行應(yīng)用到slave mysql中,slave I/O也不需要slave sql的回復(fù)確認(rèn),并不保證relay log日志完整寫入到了mysql中。

半同步復(fù)制
基于傳統(tǒng)異步存在的缺陷,mysql在5.5版本推出半同步復(fù)制,是對(duì)傳統(tǒng)異步復(fù)制的改進(jìn)。在master事務(wù)commit前,必須確保binlog日志已經(jīng)寫入slave 的relay log日志中,收到slave給master的響應(yīng)后,才能進(jìn)行事務(wù)的commit。但是后半部分的relay log到sql線程仍然屬于異步執(zhí)行。

組復(fù)制
基于傳統(tǒng)異步復(fù)制和半同步復(fù)制的缺陷——數(shù)據(jù)的一致性問題無法保證,MySQL官方在5.7.17版本正式推出組復(fù)制(MySQL Group Replication,簡(jiǎn)稱MGR)。
由若干個(gè)節(jié)點(diǎn)共同組成一個(gè)復(fù)制組,一個(gè)事務(wù)的提交,必須經(jīng)過組內(nèi)大多數(shù)節(jié)點(diǎn)(N / 2 + 1)決議并通過,才能得以提交。如上圖所示,由3個(gè)節(jié)點(diǎn)組成一個(gè)復(fù)制組,Consensus層為一致性協(xié)議層,在事務(wù)提交過程中,發(fā)生組間通訊,由2個(gè)節(jié)點(diǎn)決議(certify)通過這個(gè)事務(wù),事務(wù)才能夠最終得以提交并響應(yīng)。
引入組復(fù)制,主要是為了解決傳統(tǒng)異步復(fù)制和半同步復(fù)制可能產(chǎn)生數(shù)據(jù)不一致的問題。組復(fù)制依靠分布式一致性協(xié)議(Paxos協(xié)議的變體),實(shí)現(xiàn)了分布式下數(shù)據(jù)的最終一致性,提供了真正的數(shù)據(jù)高可用方案(是否真正高可用還有待商榷)。其提供的多寫方案,給我們實(shí)現(xiàn)多活方案帶來了希望。
MGR環(huán)境下,服務(wù)器數(shù)量必須是3臺(tái)以上,并且是單數(shù),實(shí)現(xiàn)2/n+1的算法。

一個(gè)復(fù)制組由若干個(gè)節(jié)點(diǎn)(數(shù)據(jù)庫(kù)實(shí)例)組成,組內(nèi)各個(gè)節(jié)點(diǎn)維護(hù)各自的數(shù)據(jù)副本(Share Nothing),通過一致性協(xié)議實(shí)現(xiàn)原子消息和全局有序消息,來實(shí)現(xiàn)組內(nèi)實(shí)例數(shù)據(jù)的一致。
MGR的解決方案現(xiàn)在具備的特性
數(shù)據(jù)一致性保障:確保集群中大部分節(jié)點(diǎn)收到日志
多節(jié)點(diǎn)寫入支持:多寫模式下支持集群中的所有節(jié)點(diǎn)都可以寫入(但是考慮1到高并發(fā)場(chǎng)景下,保證數(shù)據(jù)高度一致性,生產(chǎn)并沒有選擇多主寫入,使用單主集群)
Fault Tolerance: 確保系統(tǒng)發(fā)生故障(包括腦裂)依然可用,雙寫對(duì)系統(tǒng)無影響
MGR的解決方案目前的影響
- 僅支持InnoDB表,并且每張表一定要有一個(gè)主鍵,用于做write set的沖突檢測(cè);
- 必須打開GTID特性,二進(jìn)制日志格式必須設(shè)置為ROW,用于選主與write set
- COMMIT可能會(huì)導(dǎo)致失敗,類似于快照事務(wù)隔離級(jí)別的失敗場(chǎng)景
- 目前一個(gè)MGR集群最多支持9個(gè)節(jié)點(diǎn)
- 不支持外鍵于save point特性,無法做全局間的約束檢測(cè)與部分部分回滾
- 二進(jìn)制日志不支持binlog event checksum
到此這篇關(guān)于Mysql主從三種復(fù)制模式(異步復(fù)制,半同步復(fù)制,組復(fù)制)的文章就介紹到這了,更多相關(guān)Mysql主從復(fù)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql中如何用varchar字符串按照數(shù)字排序
這篇文章主要介紹了mysql中用varchar字符串按照數(shù)字排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
MySQL left join操作中on和where放置條件的區(qū)別介紹
這篇文章主要給大家介紹了關(guān)于MySQL left join操作中on和where放置條件的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
MySQL Aborted connection告警日志的分析
這篇文章主要介紹了MySQL Aborted connection告警日志的分析,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下2020-08-08
MYSQL每隔10分鐘進(jìn)行分組統(tǒng)計(jì)的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了如何利用MYSQL實(shí)現(xiàn)每隔10分鐘進(jìn)行分組統(tǒng)計(jì)的方法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。2016-12-12
連接mysql連接超時(shí)報(bào)錯(cuò)問題以及解決
這篇文章主要介紹了連接mysql連接超時(shí)報(bào)錯(cuò)問題以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
MySQL之union和union all的使用及區(qū)別說明
這篇文章主要介紹了MySQL之union和union all的使用及區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
mysql導(dǎo)出查詢結(jié)果到csv的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猰ysql導(dǎo)出查詢結(jié)果到csv的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04

