2PC协议(2-phase-commit protocol)
一、協(xié)議概述
兩階段提交協(xié)議(2-phase-commit protocol,2PC)可以保證數(shù)據(jù)的強(qiáng)一致性,許多分布式關(guān)系型數(shù)據(jù)管理系統(tǒng)采用此協(xié)議來(lái)完成分布式事務(wù)。它是協(xié)調(diào)所有分布式原子事務(wù)參與者,并決定提交或回滾的分布式算法。也是解決一致性問(wèn)題的一致性算法。為了能夠使參與者從故障在恢復(fù),采用日志記錄協(xié)議的狀態(tài),雖然使用日志降低了性能但是節(jié)點(diǎn)能從故障中恢復(fù)。
在2PC中,系統(tǒng)一般含兩類(lèi)節(jié)點(diǎn):
① 協(xié)調(diào)者 coordinator,通常一個(gè)系統(tǒng)中只有一個(gè)
② 參與者 workers,一般含多個(gè),在數(shù)據(jù)存儲(chǔ)系統(tǒng)中可以理解為數(shù)據(jù)副本的個(gè)數(shù)
協(xié)議中假設(shè):
① 每個(gè)節(jié)點(diǎn)都記錄寫(xiě)前日志并持久性存儲(chǔ),即使節(jié)點(diǎn)故障日志也不會(huì)丟失
② 節(jié)點(diǎn)不會(huì)發(fā)生永久性故障且任意兩個(gè)節(jié)點(diǎn)間可以相互通信
當(dāng)事務(wù)最后一步完成,協(xié)調(diào)者執(zhí)行協(xié)議,參與者根據(jù)本地事務(wù),能夠成功完成回復(fù)同意提交事務(wù)或者回滾事務(wù)。
?
二、執(zhí)行過(guò)程
兩階段提交由兩個(gè)階段組成:
1. 請(qǐng)求階段(commit-request phase)
在此階段,協(xié)調(diào)者通知事務(wù)參與者準(zhǔn)備提交或回滾事務(wù),然后進(jìn)入表決過(guò)程:在表決過(guò)程中,參與者將告知協(xié)調(diào)者自己的決策:同意(事務(wù)參與者本地作業(yè)執(zhí)行成功)或回滾(本地作業(yè)執(zhí)行故障)
2. 提交階段(commit phase)
在該階段,協(xié)調(diào)者基于第一個(gè)階段的結(jié)果進(jìn)行決策:提交或取消。當(dāng)且僅當(dāng)所有參與者回復(fù)同意,才通知所有事務(wù)參與者提交事務(wù),否則協(xié)調(diào)者將通知事務(wù)參與者回滾事務(wù)。參與者在接收到協(xié)調(diào)者發(fā)來(lái)的消息后執(zhí)行相應(yīng)的操作。
?
三、協(xié)議的特點(diǎn)
兩階段提交系統(tǒng)通過(guò)阻塞完成協(xié)議,在節(jié)點(diǎn)等待消息的時(shí)候處于阻塞狀態(tài),節(jié)點(diǎn)中其他進(jìn)程需等待阻塞進(jìn)程釋放資源才能使用。如果協(xié)調(diào)器發(fā)生了故障,那么事務(wù)參與者則會(huì)一直等待。以下情況可能會(huì)導(dǎo)致節(jié)點(diǎn)發(fā)生永久阻塞:
(1) 參與者發(fā)送同意提交消息給協(xié)調(diào)者,進(jìn)程將阻塞直到協(xié)調(diào)者發(fā)消息。若協(xié)調(diào)者永久故障,參與者將一直等待。此問(wèn)題可通過(guò)備份協(xié)調(diào)器解決。
(2)若協(xié)調(diào)器發(fā)送“請(qǐng)求提交”給所有參與者,它將被阻塞直到所有參與者回復(fù)。若某參與者永久故障,那么協(xié)調(diào)器也不會(huì)一直阻塞。在某一時(shí)間內(nèi)還未收到某參與者消息,它將通知其他參與者回滾事務(wù)。
2PL沒(méi)有容錯(cuò)機(jī)制,一個(gè)節(jié)點(diǎn)故障整個(gè)事務(wù)都回滾,代價(jià)較大。
?
四、工作過(guò)程
通過(guò)一個(gè)例子說(shuō)明兩階段提交協(xié)議的工作過(guò)程:
A是保險(xiǎn)公司銷(xiāo)售小組組長(zhǎng),負(fù)責(zé)召開(kāi)會(huì)議,B,C,D是苦逼的保險(xiǎn)推銷(xiāo)員。公司規(guī)定由組長(zhǎng)召開(kāi)小組會(huì)議,必須全員到場(chǎng)。A在星期六晚上發(fā)送下周一召開(kāi)會(huì)議的通知給B,C,D。如果所有人周一都有時(shí)間來(lái)開(kāi)會(huì),那么會(huì)議將如期開(kāi)展;若有任何一個(gè)有事不能在現(xiàn)場(chǎng),則會(huì)議取消另定時(shí)間。用2PC算法解決過(guò)程:
A是協(xié)調(diào)者,B,C,D是該會(huì)議的參與者:
(1)請(qǐng)求階段:
① A發(fā)送郵件給B,C,D,通知周一舉行會(huì)議,詢(xún)問(wèn)是否都能到場(chǎng)。A此時(shí)等待B,C,D的回復(fù)郵件
② B,C,D分別查看自己的日程按排。B,C發(fā)現(xiàn)周一沒(méi)有約見(jiàn)客戶(hù)的日程安排,身為苦逼的員工當(dāng)然得去開(kāi)會(huì)!于是發(fā)郵件告訴A,會(huì)按時(shí)到場(chǎng)。由于某種原因,D白天沒(méi)有查看郵件。那么此時(shí)A,B,C都需要等待。到晚上D發(fā)現(xiàn)了A的郵件,查看自己的日程安排,發(fā)現(xiàn)周一正好要去見(jiàn)客戶(hù),那么D就回復(fù)A:我要出外勤,無(wú)法參會(huì),會(huì)議能不能改天?
(2)提交階段(commit phase)
① A已經(jīng)收到所有參與者的郵件,發(fā)現(xiàn)D因?yàn)楣聼o(wú)法參加周一的會(huì)議,于是 A發(fā)郵件通知 B,C,D。下周一的會(huì)議取消。
② 此時(shí) B,C心里樂(lè)開(kāi)了花,不用開(kāi)會(huì)。至此事務(wù)結(jié)束。
?
通過(guò)上面的例子可以發(fā)現(xiàn),2PC存在一定問(wèn)題。如果D一直不回復(fù)郵件,那么A,B,C將一直處于等待狀態(tài)。而且B,C所持有的資源,即周一不可以安排其他活動(dòng)(見(jiàn)客戶(hù),上門(mén)推銷(xiāo)保險(xiǎn)...),一直不能釋放。其他等待該資源釋放的活動(dòng)也不得不處于等待狀態(tài)。
?
部分引用自:https://www.cnblogs.com/sunddenly/articles/4072882.html
總結(jié)
以上是生活随笔為你收集整理的2PC协议(2-phase-commit protocol)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 并行数据库 分布式数据库
- 下一篇: RDBMS运行过程示例