1、二階段提交協(xié)議:
二階段協(xié)議分為兩步庙洼,分別是投票階段顿痪、提交階段。
- 投票階段:事務(wù)提議的協(xié)調(diào)者向所有參與者發(fā)出事務(wù)請(qǐng)求油够,參與者記錄事務(wù)日志蚁袭,并返回ok;或者事務(wù)不可執(zhí)行石咬,返回fail揩悄。
- 提交階段:協(xié)調(diào)者收到參與者的ack后,發(fā)出提交請(qǐng)求鬼悠,參與者收到后執(zhí)行事務(wù)删性,并返回ack。若收到參與者返回的fail消息或者等待參與者確認(rèn)消息超時(shí)焕窝,協(xié)調(diào)者發(fā)出rollback消息蹬挺,所有參與者執(zhí)行事務(wù)回滾。
- 存在問題:若在回滾過程中或提交過程中協(xié)調(diào)者宕機(jī)它掂,那么只有部分參與者收到回滾消息或提交消息巴帮,這將導(dǎo)致系統(tǒng)消息不一致。整個(gè)過程中協(xié)調(diào)者虐秋、參與者都在阻塞等待榕茧,性能較低。協(xié)調(diào)者存在單點(diǎn)問題客给。
2用押、三階段提交協(xié)議
三階段提交協(xié)議相比二階段提交協(xié)議多了一個(gè)詢問步驟,并且參與者在完成寫事務(wù)日志發(fā)出確認(rèn)消息后靶剑,若沒有收到提交消息將自動(dòng)執(zhí)行提交蜻拨。
- 詢問階段:協(xié)調(diào)者向所有參與者發(fā)出事務(wù)詢問請(qǐng)求,參與者返回確認(rèn)消息ok桩引。
- preCommit階段:協(xié)調(diào)者向參與者發(fā)送事務(wù)官觅,參與者寫事務(wù)日志,返回ack阐污。
- commit階段:協(xié)調(diào)者收到確認(rèn)消息后休涤,向所有參與者發(fā)送commit消息,所有參與者執(zhí)行事務(wù),返回ack功氨。
- 相比二階段提交改進(jìn):減少了事務(wù)的等待過程序苏。解決了協(xié)調(diào)者單點(diǎn)問題。
- 存在問題:與二階段提交相似捷凄,若在preCommit階段出現(xiàn)網(wǎng)絡(luò)問題忱详,那么沒有收到提交請(qǐng)求的參與者將自動(dòng)提交事務(wù),此時(shí)協(xié)調(diào)者可能正在回滾事務(wù)跺涤,將導(dǎo)致事務(wù)一致性問題匈睁。
3、paxos協(xié)議
paxos提出提出了“過半數(shù)”有效的概念桶错,即超過半數(shù)節(jié)點(diǎn)存在就能正常提供服務(wù)航唆。
- 針對(duì)二階段、三階段提交協(xié)議的一致性問題:
paxos為每個(gè)提議增加了遞增的編號(hào)m院刁,編號(hào)越大說明提議越新糯钙,系統(tǒng)應(yīng)該以最新的提議編號(hào)為最終一致性值。
提議的流程分為prepare和accept兩階段:
1退腥、協(xié)調(diào)者生成增長(zhǎng)的編號(hào)m任岸,向所有參與者發(fā)送prepare(m)。
2狡刘、參與者若接收過提議享潜,則返回已接收的所有提議編號(hào)最大值m‘和提議內(nèi)容v‘;若沒有接收過提議則返回空表示接收提議嗅蔬。
3米碰、協(xié)調(diào)者若收到參與則通過數(shù)據(jù)超過一半則進(jìn)入accept階段,否則從返回結(jié)果中選出最大值m’并更新提議內(nèi)容v’购城,使用更新后的提議(m‘,v’)返回步驟1虐译。
4瘪板、協(xié)調(diào)者進(jìn)入accept階段后,發(fā)送accept(m漆诽,v)侮攀。
5、參與者需要判斷提議編號(hào)m厢拭,若m大等于自己記錄的值則通過提議兰英,返回ok;否者不接受提議供鸠,返回對(duì)應(yīng)編號(hào)和內(nèi)容(m‘畦贸,v’)。
6、提議者根據(jù)步驟5結(jié)果判斷通過數(shù)量是否超過一半薄坏,超過則表示提議通過趋厉;否從返回值中選出最大m‘并更新v‘,返回步驟1胶坠。
這個(gè)算法流程怎么實(shí)現(xiàn)一致性的君账?
綜合上述流程,通過參與者的不斷比對(duì)反饋沈善,最終只有一個(gè)提議會(huì)被超過半數(shù)的參與者通過乡数,可以確定在進(jìn)行中的提議都會(huì)最終達(dá)成一致,并更新到所有參與者中去闻牡。
另外净赴,當(dāng)出現(xiàn)更大編號(hào)提議時(shí),協(xié)調(diào)者需要更新提議重復(fù)發(fā)出提議澈侠,如果更大編號(hào)被不斷提出劫侧,那么可能使得協(xié)議一直不能達(dá)成一致,這就導(dǎo)致活鎖問題哨啃。
參考:
- 《從paxos到zookeeper》
- https://www.zhihu.com/question/19787937