MGR簡(jiǎn)介
MySQL Group Replication(下簡(jiǎn)稱:MGR)是MySQL官方推出的一種基于Paxos協(xié)議的狀態(tài)機(jī)復(fù)制愉舔。在MGR出現(xiàn)之前,用戶常見的MySQL高可用方式房揭,無論怎么變化架構(gòu)贤笆,本質(zhì)就是Master-Slave架構(gòu)现斋。MySQL 5.7版本開始支持無損半同步復(fù)制(lossless semi-sync replication)桅打,從而進(jìn)一步提示數(shù)據(jù)復(fù)制的強(qiáng)一致性是嗜。
MGR與其他復(fù)制的對(duì)比介紹
MySQL異步復(fù)制
master事務(wù)的提交不需要經(jīng)過slave的確認(rèn),slave是否接收到master的binlog挺尾,master并不care。slave接收到master binlog后先寫relay log站绪,最后異步地去執(zhí)行relay log中的sql應(yīng)用到自身遭铺。由于master的提交不需要確保slave relay log是否被正確接受,當(dāng)slave接受master binlog失敗或者relay log應(yīng)用失敗恢准,master無法感知魂挂。
MySQL半同步復(fù)制
基于傳統(tǒng)異步存在的缺陷,mysql在5.5版本推出半同步復(fù)制馁筐⊥空伲可以說半同步復(fù)制是傳統(tǒng)異步復(fù)制的改進(jìn),在master事務(wù)的commit之前敏沉,必須確保一個(gè)slave收到relay log并且響應(yīng)給master以后果正,才能進(jìn)行事務(wù)的commit炎码。但是slave對(duì)于relay log的應(yīng)用仍然是異步進(jìn)行的,原理如下圖所示:
MySQL組復(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)多活方案帶來了希望。
一個(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)都可以寫入
- 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