為了使系統(tǒng)盡量能夠達(dá)到 CAP蔑穴,于是有了 BASE 協(xié)議,而 BASE 協(xié)議是在可用性和一致性之間做的取舍和妥協(xié)惧浴。
人們往往需要在系統(tǒng)的可用性和數(shù)據(jù)一致性之間反復(fù)的權(quán)衡存和。于是呢,就產(chǎn)生我們標(biāo)題中的一致性協(xié)議衷旅。為了解決分布式問(wèn)題捐腿,涌現(xiàn)了很多經(jīng)典的算法和協(xié)議,最著名的就是二階段提交協(xié)議柿顶,三階段提交協(xié)議茄袖,Paxos 算法。
2PC(二階段提交)
2PC 嘁锯,不是 2 個(gè) pc 機(jī)的意思宪祥,而是 Two-Phase Commit 〖页耍可以認(rèn)為是一種算法蝗羊,也可以認(rèn)為是一種協(xié)議,主要目的就是為了保證分布式系統(tǒng)數(shù)據(jù)的一致性仁锯。顧名思義耀找,二階段提交就是講事務(wù)的提交過(guò)程分成了兩個(gè)階段來(lái)進(jìn)行處理。
在分布式系統(tǒng)中业崖,會(huì)有多個(gè)機(jī)器節(jié)點(diǎn)涯呻,因此需要一個(gè) “協(xié)調(diào)者” 凉驻,而各個(gè)節(jié)點(diǎn)就是 “參與者”,協(xié)調(diào)者統(tǒng)一調(diào)度所有分布式節(jié)點(diǎn)的執(zhí)行邏輯复罐,這些被調(diào)度的分布式節(jié)點(diǎn)就是 “參與者”涝登。
協(xié)調(diào)者最終決定這些參與者是否要把事務(wù)真正進(jìn)行提交。正是基于這個(gè)思想效诅,有了二階段提交和 三階段提交胀滚。
階段一
- 事務(wù)詢問(wèn)
協(xié)調(diào)者向所有的參與者詢問(wèn),是否準(zhǔn)備好了執(zhí)行事務(wù)乱投,并開(kāi)始等待各參與者的響應(yīng)咽笼。 - 執(zhí)行事務(wù)
各參與者節(jié)點(diǎn)執(zhí)行事務(wù)操作,并將 Undo 和 Redo 信息記入事務(wù)日志中戚炫。 - 各參與者向協(xié)調(diào)者反饋事務(wù)詢問(wèn)的響應(yīng)
如果參與者成功執(zhí)行了事務(wù)操作剑刑,那么就反饋給協(xié)調(diào)者 Yes 響應(yīng),表示事務(wù)可以執(zhí)行双肤;如果參與者沒(méi)有成功執(zhí)行事務(wù)施掏,就返回 No 給協(xié)調(diào)者,表示事務(wù)不可以執(zhí)行茅糜。
階段二
在階段二中七芭,會(huì)根據(jù)階段一的結(jié)果執(zhí)行 2 種操作:執(zhí)行事務(wù)提交或者中斷事務(wù)。
執(zhí)行事務(wù)提交步驟如下:
- 發(fā)送提交請(qǐng)求:協(xié)調(diào)者向所有參與者發(fā)出 commit 請(qǐng)求蔑赘。
- 事務(wù)提交:參與者收到 commit 請(qǐng)求后狸驳,會(huì)正式執(zhí)行事務(wù)提交操作,并在完成提交之后釋放整個(gè)事務(wù)執(zhí)行期間占用的事務(wù)資源缩赛。
- 反饋事務(wù)提交結(jié)果:參與者在完成事務(wù)提交之后耙箍,向協(xié)調(diào)者發(fā)送 Ack 信息。
- 協(xié)調(diào)者接收到所有參與者反饋的 Ack 信息后酥馍,完成事務(wù)究西。
中斷事務(wù)步驟如下:
- 發(fā)送回滾請(qǐng)求:協(xié)調(diào)者向所有參與者發(fā)出 Rollback 請(qǐng)求。
- 事務(wù)回滾:參與者接收到 Rollback 請(qǐng)求后物喷,會(huì)利用其在階段一種記錄的 Undo 信息來(lái)執(zhí)行事務(wù)回滾操作卤材,并在完成回滾之后釋放在整個(gè)事務(wù)執(zhí)行期間占用的資源。
- 反饋事務(wù)回滾結(jié)果:參與者在完成事務(wù)回滾之后峦失,想?yún)f(xié)調(diào)者發(fā)送 Ack 信息扇丛。
- 中斷事務(wù):協(xié)調(diào)者接收到所有參與者反饋的 Ack 信息后,完成事務(wù)中斷尉辑。
2PC不足之處
缺點(diǎn):同步阻塞帆精,單點(diǎn)問(wèn)題,數(shù)據(jù)不一致,過(guò)于保守
同步阻塞:
在二階段提交的過(guò)程中卓练,所有的節(jié)點(diǎn)都在等待其他節(jié)點(diǎn)的響應(yīng)隘蝎,無(wú)法進(jìn)行其他操作。這種同步阻塞極大的限制了分布式系統(tǒng)的性能襟企。單點(diǎn)問(wèn)題:
協(xié)調(diào)者在整個(gè)二階段提交過(guò)程中很重要嘱么,如果協(xié)調(diào)者在提交階段出現(xiàn)問(wèn)題,那么整個(gè)流程將無(wú)法運(yùn)轉(zhuǎn)顽悼,更重要的是:其他參與者將會(huì)處于一直鎖定事務(wù)資源的狀態(tài)中曼振,而無(wú)法繼續(xù)完成事務(wù)操作。數(shù)據(jù)不一致:
假設(shè)當(dāng)協(xié)調(diào)者向所有的參與者發(fā)送 commit 請(qǐng)求之后蔚龙,發(fā)生了局部網(wǎng)絡(luò)異潮溃或者是協(xié)調(diào)者在尚未發(fā)送完所有 commit 請(qǐng)求之前自身發(fā)生了崩潰,導(dǎo)致最終只有部分參與者收到了 commit 請(qǐng)求木羹。這將導(dǎo)致嚴(yán)重的數(shù)據(jù)不一致問(wèn)題甲雅。過(guò)于保守:
如果在二階段提交的提交詢問(wèn)階段中,參與者出現(xiàn)故障而導(dǎo)致協(xié)調(diào)者始終無(wú)法獲取到所有參與者的響應(yīng)信息的話坑填,這時(shí)協(xié)調(diào)者只能依靠其自身的超時(shí)機(jī)制來(lái)判斷是否需要中斷事務(wù)抛人,顯然,這種策略過(guò)于保守穷遂。換句話說(shuō),二階段提交協(xié)議沒(méi)有設(shè)計(jì)較為完善的容錯(cuò)機(jī)制娱据,任意一個(gè)節(jié)點(diǎn)是失敗都會(huì)導(dǎo)致整個(gè)事務(wù)的失敗蚪黑。