OpenBase关于一致性,可用性,分区容错性(CAP)分析
OceanBase 的 CAP 分析
單元化架構(gòu)中的成千山萬(wàn)的應(yīng)用就像是計(jì)算器,本身無(wú) CAP 限制,其 CAP 限制下沉到了其數(shù)據(jù)庫(kù)層,也就是螞蟻?zhàn)匝械姆植际綌?shù)據(jù)庫(kù) OceanBase(本節(jié)簡(jiǎn)稱 OB)。
在 OB 體系中,每個(gè)數(shù)據(jù)庫(kù)實(shí)例都具備讀寫(xiě)能力,具體是讀是寫(xiě)可以動(dòng)態(tài)配置。
實(shí)際情況下大部分時(shí)候,對(duì)于某一類數(shù)據(jù)(固定用戶號(hào)段的數(shù)據(jù))任意時(shí)刻只有一個(gè)單元會(huì)負(fù)責(zé)寫(xiě)入某個(gè)節(jié)點(diǎn),其他節(jié)點(diǎn)要么是實(shí)時(shí)庫(kù)間同步,要么是異步數(shù)據(jù)同步。
OB 也采用了 PAXOS 共識(shí)協(xié)議。實(shí)時(shí)庫(kù)間同步的節(jié)點(diǎn)(包含自己)個(gè)數(shù)至少需要 (N/2)+1 個(gè),這樣就可以解決分區(qū)容忍性問(wèn)題。
下面我們舉個(gè)馬老師改英文名的例子來(lái)說(shuō)明 OB 設(shè)計(jì)的精妙之處:假設(shè)數(shù)據(jù)庫(kù)按照用戶 ID 分庫(kù)分表,馬老師的用戶 ID 對(duì)應(yīng)的數(shù)據(jù)段在 [0-9],開(kāi)始由單元 A 負(fù)責(zé)數(shù)據(jù)寫(xiě)入。
假如馬老師(用戶 ID 假設(shè)為 000)正在用支付寶 App 修改自己的英文名,馬老師一開(kāi)始打錯(cuò)了,打成了 Jason Ma,A 單元收到了這個(gè)請(qǐng)求。
這時(shí)候發(fā)生了分區(qū)(比如 A 網(wǎng)絡(luò)斷開(kāi)了),我們將單元 A 對(duì)數(shù)據(jù)段 [0,9] 的寫(xiě)入權(quán)限轉(zhuǎn)交給單元 B(更改映射),馬老師這次寫(xiě)對(duì)了,為 Jack Ma。
而在網(wǎng)絡(luò)斷開(kāi)前請(qǐng)求已經(jīng)進(jìn)入了 A,寫(xiě)權(quán)限轉(zhuǎn)交給單元 B 生效后,A 和 B 同時(shí)對(duì) [0,9] 數(shù)據(jù)段進(jìn)行寫(xiě)入馬老師的英文名。
假如這時(shí)候都允許寫(xiě)入的話就會(huì)出現(xiàn)不一致,A 單元說(shuō)我看到馬老師設(shè)置了 Jason Ma,B 單元說(shuō)我看到馬老師設(shè)置了 Jack Ma。
然而這種情況不會(huì)發(fā)生的,A 提議說(shuō)我建議把馬老師的英文名設(shè)置為 Jason Ma 時(shí),發(fā)現(xiàn)沒(méi)人回應(yīng)它。
因?yàn)槌霈F(xiàn)了分區(qū),其他節(jié)點(diǎn)對(duì)它來(lái)說(shuō)都是不可達(dá)的,所以這個(gè)提議被自動(dòng)丟棄,A 心里也明白是自己分區(qū)了,會(huì)有主分區(qū)替自己完成寫(xiě)入任務(wù)的。
同樣的,B 提出了將馬老師的英文名改成 Jack Ma 后,大部分節(jié)點(diǎn)都響應(yīng)了,所以 B 成功將 Jack Ma 寫(xiě)入了馬老師的賬號(hào)記錄。
假如在寫(xiě)權(quán)限轉(zhuǎn)交給單元 B 后 A 突然恢復(fù)了,也沒(méi)關(guān)系,兩筆寫(xiě)請(qǐng)求同時(shí)要求獲得 (N/2)+1 個(gè)節(jié)點(diǎn)的事務(wù)鎖,通過(guò) no-wait 設(shè)計(jì),在 B 獲得了鎖之后,其他爭(zhēng)搶該鎖的事務(wù)都會(huì)因?yàn)槭《貪L。
下面我們分析下 OB 的 CAP:
分區(qū)容忍性:OB 節(jié)點(diǎn)之間是有互相通信的(需要相互同步數(shù)據(jù)),所以存在分區(qū)問(wèn)題,OB 通過(guò)僅同步到部分節(jié)點(diǎn)來(lái)保證可用性。這一點(diǎn)就說(shuō)明 OB 做了分區(qū)容錯(cuò)。
可用性分區(qū)容忍性:OB 事務(wù)只需要同步到 (N/2)+1 個(gè)節(jié)點(diǎn),允許其余的一小半節(jié)點(diǎn)分區(qū)(宕機(jī)、斷網(wǎng)等),只要 (N/2)+1 個(gè)節(jié)點(diǎn)活著就是可用的。
極端情況下,比如 5 個(gè)節(jié)點(diǎn)分成 3 份(2:2:1),那就確實(shí)不可用了,只是這種情況概率比較低。
一致性分區(qū)容忍性:分區(qū)情況下意味著部分節(jié)點(diǎn)失聯(lián)了,一致性顯然是不滿足的。但通過(guò)共識(shí)算法可以保證當(dāng)下只有一個(gè)值是合法的,并且最終會(huì)通過(guò)節(jié)點(diǎn)間的同步達(dá)到最終一致性。
所以 OB 仍然沒(méi)有逃脫 CAP 魔咒,產(chǎn)生分區(qū)的時(shí)候它變成 AP+最終一致性(C)。整體來(lái)說(shuō),它是 AP 的,即高可用和分區(qū)容忍。
總結(jié)
以上是生活随笔為你收集整理的OpenBase关于一致性,可用性,分区容错性(CAP)分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: paxos协议补充
- 下一篇: 算法设计与分析-实验2