80后聊架構(gòu):必知必會(huì),三類數(shù)據(jù)庫(kù)高可用與一致性架構(gòu)實(shí)踐
上一篇《數(shù)據(jù)庫(kù)擴(kuò)展性架構(gòu)實(shí)踐》聊的是數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)中的scalability實(shí)踐,并沒(méi)有解決availability與consistency的問(wèn)題。
數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)的過(guò)程中,如何折衷高可用與一致性的問(wèn)題呢?
前面的文章聊過(guò),高可用的核心方法論是:冗余(replication) + 故障自動(dòng)轉(zhuǎn)移(fail-over)。
最容易想到的,是數(shù)據(jù)庫(kù)主從集群,每份數(shù)據(jù)都進(jìn)行復(fù)制,每個(gè)實(shí)例都獨(dú)享 DISK/MEM/CPU 資源,避免實(shí)例之間的資源競(jìng)爭(zhēng)。
如上圖所示:
- 把整體數(shù)據(jù)存儲(chǔ)分復(fù)制了N份,每份之間數(shù)據(jù)都一樣;
- 每份數(shù)據(jù)的 DISK/MEM/CPU 都在一個(gè)DBMS進(jìn)程內(nèi),部署在一臺(tái)服務(wù)器上;
- 每份數(shù)據(jù)的資源之間的沒(méi)有競(jìng)爭(zhēng);
理想很豐滿,現(xiàn)實(shí)很骨感,思路沒(méi)問(wèn)題,但實(shí)際執(zhí)行“復(fù)制”的過(guò)程中,會(huì)碰到一些問(wèn)題。
以MySQL為例,有3種常見的復(fù)制方式:
- 異步復(fù)制;
- 半同步復(fù)制;
- 組復(fù)制;
第一種,異步復(fù)制(Asynchronous Replication)
又叫主從復(fù)制(Primary-Secondary Replication),是互聯(lián)網(wǎng)公司用的最多的數(shù)據(jù)復(fù)制與數(shù)據(jù)庫(kù)集群化方法,它的思路是,從庫(kù)執(zhí)行串行化后的主庫(kù)事務(wù)。
其核心原理如上圖所示:
(1) 第一條時(shí)間線:主庫(kù)時(shí)間線;
- 主庫(kù)執(zhí)行事務(wù)
- 主庫(kù)事務(wù)串行化binlog
- binlog同步給從庫(kù)
- 主庫(kù)事務(wù)提交完成
(2) 第二條/第三條時(shí)間線:從庫(kù)時(shí)間線;
- 收到relay log
- 執(zhí)行和主庫(kù)一樣的事務(wù)
- 生成自己的binlog(還可以繼續(xù)二級(jí)從庫(kù))
- 從庫(kù)事務(wù)提交完成
從這個(gè)時(shí)間線可以看到:
- 主庫(kù)事務(wù)提交;
- 從庫(kù)事務(wù)執(zhí)行;
是并行執(zhí)行的,主庫(kù)并不能保證從庫(kù)的事務(wù)一定執(zhí)行成功,甚至不能保證從庫(kù)一定收到相關(guān)的請(qǐng)求,這也是其稱作“異步復(fù)制”的原因。
第二種,半同步復(fù)制(Semi-synchronous Replication)
為了解決異步復(fù)制中“不能保證從庫(kù)一定收到請(qǐng)求”等問(wèn)題,對(duì)異步復(fù)制做了升級(jí)。
其核心原理如上圖所示:
(1) 第一條時(shí)間線:主庫(kù)時(shí)間線;
- 主庫(kù)執(zhí)行事務(wù)
- 主庫(kù)事務(wù)串行化binlog
- binlog同步給從庫(kù)
- 等從庫(kù)確認(rèn)收到請(qǐng)求,主庫(kù)事務(wù)才提交完成
(2) 第二條/第三條時(shí)間線:從庫(kù)時(shí)間線;
- 收到relay log
- 執(zhí)行和主庫(kù)一樣的事務(wù),并給主庫(kù)一個(gè)確認(rèn)
- 生成自己的binlog(還可以繼續(xù)二級(jí)從庫(kù))
- 從庫(kù)事務(wù)提交完成
從這個(gè)時(shí)間線可以看到:
- 主庫(kù)收到從庫(kù)的ACK,才會(huì)提交;
- 從庫(kù)收到請(qǐng)求后,事務(wù)提交前,會(huì)給主庫(kù)一個(gè)ACK;
半同步復(fù)制存在什么問(wèn)題呢?
- 主庫(kù)的性能,會(huì)受到較大的影響,事務(wù)提交之前,中間至少要等待2個(gè)主從之間的網(wǎng)絡(luò)TTL;
- 從庫(kù)仍然有延時(shí),主從之間數(shù)據(jù)仍然不一致;
- 主從角色有差異,主節(jié)點(diǎn)仍然是單點(diǎn);
大數(shù)據(jù)量,高并發(fā)量的互聯(lián)網(wǎng)業(yè)務(wù),一般不使用“半同步復(fù)制”,更多的公司仍然使用“異步復(fù)制”的模式。
最后是MySQL5.7里,新提出的MySQL組復(fù)制。
第三種,組復(fù)制(MySQL Group Replication,MGR)
MGR有一些帥氣的能力:
- 解決了單點(diǎn)寫入的問(wèn)題,一個(gè)分組內(nèi)的所有節(jié)點(diǎn)都能夠?qū)懭耄?/li>
- 最終一致性,緩解了一致性問(wèn)題,可以認(rèn)為大部分實(shí)例的數(shù)據(jù)都是最新的;
- 高可用,系統(tǒng)故障時(shí)(即使是腦裂),系統(tǒng)依然可用;
如上圖所示:
- 首先,分組內(nèi)的MySQL實(shí)例不再是“主從”關(guān)系,而是對(duì)等的“成員”關(guān)系,故每個(gè)節(jié)點(diǎn)都可以寫入;
- 其次,增加了一個(gè)協(xié)商共識(shí)的認(rèn)證(certify)環(huán)節(jié),多數(shù)節(jié)點(diǎn)達(dá)成一致的事務(wù)才能提交;
畫外音:Garela也是此類機(jī)制。
結(jié)尾稍作總結(jié),為了折衷數(shù)據(jù)庫(kù)高可用,一致性,性能等架構(gòu)設(shè)計(jì)要素,一般有三類常見復(fù)制方式:
- 異步復(fù)制,傳統(tǒng)主從,互聯(lián)網(wǎng)公司最常用;
- 半同步復(fù)制,從庫(kù)確認(rèn),主庫(kù)才提交;
- 組復(fù)制,MySQL 5.7的新功能,核心在于分布式共識(shí)算法;
知其然,知其所以然。
思路比結(jié)論更重要。