在生產(chǎn)環(huán)境部署數(shù)據(jù)庫時,往往會搭建多個副本(Replica),保證數(shù)據(jù)庫集群的高可用性以及數(shù)據(jù)的持久性。傳統(tǒng)的部署方式是一主一備,即主備間通過日志同步數(shù)據(jù)變更。但是主備復(fù)制存在先天性缺陷,以常見的MySQL半同步復(fù)制為例,一旦網(wǎng)絡(luò)延遲超出閾值,同步就會退化到異步復(fù)制。此時如果主節(jié)點(diǎn)宕機(jī),副本可能丟失已提交的數(shù)據(jù),也就是常說的副本不一致。
為了保證副本間的強(qiáng)一致性,現(xiàn)代數(shù)據(jù)庫往往采用以Paxos為代表的多數(shù)派復(fù)制協(xié)議。Paxos通常要求集群中至少存3個節(jié)點(diǎn),每次寫入都要獲得超過半數(shù)節(jié)點(diǎn)的確認(rèn),即便其中1個節(jié)點(diǎn)宕機(jī),集群也仍然能正常提供服務(wù)。Paxos算法能夠保證副本間的強(qiáng)一致性,徹底解決副本不一致問題。
PolarDB-X在副本復(fù)制方面采用了X-Paxos。X-Paxos是阿里巴巴自研的Paxos協(xié)議實(shí)現(xiàn),起源于AliSQL(阿里內(nèi)部的 MySQL 分支)。基于樸素的Paxos實(shí)現(xiàn),它在功能、性能上都做了大量優(yōu)化,且經(jīng)歷了數(shù)十載的雙十一考驗(yàn),穩(wěn)定可靠。
X-Paxos實(shí)現(xiàn)了Multi-Paxos算法,通常存在一個相對穩(wěn)定的Leader節(jié)點(diǎn)用于處理讀寫請求。如果Leader節(jié)點(diǎn)因?yàn)槟承┮馔馇闆r發(fā)生宕機(jī)或超時,F(xiàn)ollower節(jié)點(diǎn)就會重新發(fā)起選主投票,如果得到超過半數(shù)的選票則成為新的Leader。Logger節(jié)點(diǎn)只負(fù)責(zé)保存日志以及參與Paxos投票。Learner節(jié)點(diǎn)通常用在只讀實(shí)例中,它僅僅接受主機(jī)群的變更日志,不參與Paxos投票。
此外,X-Paxos還支持動態(tài)添加刪除節(jié)點(diǎn)、權(quán)重化選主、Leader主動回切等企業(yè)級特性,允許用戶根據(jù)業(yè)務(wù)需求靈活定義部署方式。
多機(jī)房部署
基于Paxos復(fù)制協(xié)議,PolarDB-X可以部署到多個機(jī)房中,以實(shí)現(xiàn)機(jī)房級容災(zāi)。常見的部署方式有同城三機(jī)房、兩地三中心等,其中后者主要應(yīng)用在混合云部署中。由于Paxos協(xié)議的特性,通常三個機(jī)房中有一個主機(jī)房負(fù)責(zé)對外提供服務(wù)。
跨地域多活
如果業(yè)務(wù)有多活需求,出于性能考慮,通常建議在不同地域分別部署PolarDB-X實(shí)例,彼此之間通過數(shù)據(jù)同步工具相連接。數(shù)據(jù)要根據(jù)實(shí)際業(yè)務(wù)需求做合理的分區(qū),以保證各個地域的數(shù)據(jù)不會相互沖突。