生活随笔
收集整理的這篇文章主要介紹了
2pc_two phase commit详情
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1. two phase commit protocol
- 1.假設(shè)前提
- 2. 算法概述
- 3. 缺點
- 4. 詳情
- 1. coordinator 端來看
- 2. cohorts端
- 5. 正確性分析
- 6. 簡單總結(jié)
看2pc和3pc看的暈暈乎乎的,看了很多博客,感覺說的都不夠細(xì)致,看起來也容易犯暈,找到了兩篇英文文檔(不算原文),看起來好像是清楚一些,有些時候這些協(xié)議類的東西研讀,如果不是那種特別長的建議直接閱讀原文,或者原文閱讀作為輔助,可以更快的全面了解,這一篇就算是英文文檔的翻譯吧。
1. two phase commit protocol
??兩階段提交協(xié)議是一種分布式算法,它使分布式系統(tǒng)中的所有站點都同意提交事務(wù)。該協(xié)議保證即使在站點故障和消息丟失的情況下,所有節(jié)點都能統(tǒng)一保持提交或abort事務(wù)。
??但是,該協(xié)議將不能處理多個隨機站點同時故障(超過一個)的情況。該算法的兩個階段分為COMMIT-REQUEST階段和COMIT階段,在COMMIT-REQUEST階段,coordinator嘗試讓所有的cohorts完成準(zhǔn)備,在COMMIT階段,coordinator完成所有cohorts的事務(wù)。
1.假設(shè)前提
該協(xié)議以以下假設(shè)方式工作:
將一個節(jié)點指定為coordinator,即主站點,將網(wǎng)絡(luò)中的其余節(jié)點稱為cohorts(同類)。每個站點的存儲都是穩(wěn)定的以及每個節(jié)點都使用的預(yù)寫日志(先寫日志再執(zhí)行操作)。該協(xié)議還假設(shè)沒有節(jié)點永久崩潰,并且最終任何兩個節(jié)點都可以相互通信。后者并不算十分苛刻,因為通常可以重新路由網(wǎng)絡(luò)通信。前者是一個非常強的假設(shè)(想想假設(shè)機器炸毀了!)
很多博客在介紹2pc的時候這些前提假設(shè)都完全沒有提
2. 算法概述
在階段1期間
coordinator發(fā)送commit-request 給所有cohorts。然后,它等待所有cohorts的返回。對于cohorts來說,如果事務(wù)執(zhí)行成功,則該cohort將一個條目寫入undo-log,并將一個條目寫入redo-log。然后,cohorts回復(fù)一個一個agree的信息,如果事務(wù)在cohorts節(jié)點執(zhí)行失敗,則返回abort信息。
在階段2期間
如果coordinator從所有cohorts接收到同意消息,則它將提交記錄寫入其日志中,并向所有cohorts發(fā)送commit消息。如果并不是所有的cohorts回復(fù)的都是agree消息,則coordinator將發(fā)送abort消息。接下來,coordinator等待cohorts的確認(rèn)。當(dāng)收到來自所有cohorts的ack時,coordinator會將完整的記錄寫入其日志。注意,coordinator將永遠(yuǎn)等待直到所有的ack返回。如果cohorts收到的是commit消息,它將釋放在事務(wù)處理期間持有的所有鎖和資源,并將ack消息發(fā)送給協(xié)調(diào)者。如果收到的是abort消息,則將使用undo-log撤消該事務(wù),并釋放在事務(wù)期間持有的資源和鎖。然后發(fā)送一個ack消息。
上面的描述實際上還不算非常清晰,只能算是一個大概的描述,后面會更清晰的描述這個過程。
3. 缺點
兩階段提交協(xié)議的最大缺點是它是阻塞協(xié)議。節(jié)點在等待消息時將阻塞。這意味著其他進(jìn)程將不得不等待被阻塞進(jìn)程持有的鎖資源釋放。即使所有其他站點都發(fā)生故障,單個節(jié)點也將繼續(xù)等待。如果coordinator永久失敗,則某些cohorts將永遠(yuǎn)無法解決其事務(wù),這會導(dǎo)致永久占用鎖資源。
另一個缺點是該協(xié)議過于保守。它更關(guān)注abort的情況而不是agree的情況(不管有多少個agree,有一個abort就不行)
附加一些自己的理解,這里的過于保守會導(dǎo)致兩個主要的問題
1.因為某個節(jié)點不行導(dǎo)致事務(wù)無法提交
2.因為某個節(jié)點比較慢導(dǎo)致短板效應(yīng),每個事務(wù)的處理都會很慢,整個系統(tǒng)的吞吐量上不去
4. 詳情
這里更加詳細(xì)的介紹一下2pc理論的過程
1. coordinator 端來看
coordinator將prepare消息發(fā)送到每個cohort, coordinator現(xiàn)在處于準(zhǔn)備事務(wù)狀態(tài)現(xiàn)在,coordinator正在等待每個cohort的響應(yīng)。如果任何cohort響應(yīng)ABORT,則必須abort該事務(wù),會執(zhí)行步驟5。如果所有cohorts都同意,則可以提交該事務(wù),繼續(xù)執(zhí)行步驟3。如果過了一段時間,所有cohorts沒有響應(yīng),那么coordinator可以發(fā)送向所有cohort發(fā)送abort消息,或?qū)OMMIT-REQUEST消息發(fā)送給尚未響應(yīng)的cohort。無論哪種情況,coordinator最終都將進(jìn)入狀態(tài)3或狀態(tài)5。在日志中記錄一個COMPLETE,以指示事務(wù)現(xiàn)在正在進(jìn)行complete階段。然后向每個cohorts發(fā)送COMMIT消息。等待每個cohorts做出回應(yīng)。他們必須回復(fù)COMMIT。如果一段時間之后,某些cohort沒有響應(yīng),則重新發(fā)送COMMIT消息。一旦所有cohorts均已回復(fù),從永久存儲器中擦除所有執(zhí)行這次事務(wù)的相關(guān)輔助型信息。完成。向每個 cohort 發(fā)送abort信息.
2. cohorts端
如果在COHORT上收到某個事務(wù)t的COMMIT-REQUEST消息,該消息在COHORT中是無法被執(zhí)行的,回復(fù)ABORT。反之,將事務(wù)的新狀態(tài)寫入永久存儲中的UNDO和REDO日志中。這樣的話就可以完成恢復(fù)舊狀態(tài)(在以后被abort的情況下)或commit,而不用擔(dān)心崩潰。事務(wù)的讀取鎖可能在此時被釋放;但是,寫鎖仍然需要保留。然后發(fā)送agree 給coordinator。如果收到ABORT消息,則終止該事務(wù),利用undo-log恢復(fù)到事務(wù)發(fā)生之前的狀態(tài)。如果收到COMMIT消息,則說明該事務(wù)已準(zhǔn)備好提交或已經(jīng)提交。如果已準(zhǔn)備好,則執(zhí)行更新數(shù)據(jù)庫并釋放事務(wù)擁有的其余鎖。如果已經(jīng)提交,則無需采取進(jìn)一步措施。回復(fù)給coordinator。
5. 正確性分析
我們聲稱,如果一個cohort完成了事務(wù),那么所有cohort最終都會完成事務(wù)。
正確性的證明有些非正式:
如果一個COHORT正在完成一個事務(wù),那是因為coordinateor向它發(fā)送了COMMT消息。僅當(dāng)coordinator處于提交階段時才發(fā)送此消息,在這種情況下,所有COHORTS均已響應(yīng)coordinateor AGREED。這意味著所有cohorts均已準(zhǔn)備好事務(wù),這意味著此時任何崩潰都不會損害事務(wù)數(shù)據(jù),因為它的redo/undo log位于永久存儲中。coordinator完成后,在刪除coordinator的數(shù)據(jù)之前,會確保確保每個corhort都完成了。因此,coordinateor的崩潰不會影響結(jié)果。
6. 簡單總結(jié)
??這里有幾個比較重要的點
一個是幾個假設(shè)還有就是coordinator在第二個階段進(jìn)行commit的時候會等待所有節(jié)點的ack回來才結(jié)束,要不然就會一直重試的發(fā)送commit信息。因為采用的都是先記錄log后操作的方式( write ahead log),所以不用擔(dān)心宕機可能導(dǎo)致數(shù)據(jù)丟失。在開頭說的不2pc協(xié)議不會用來處理超過一個節(jié)點宕機的描述還不是很清楚,感覺好像多節(jié)點宕機也沒有問題的樣子。同樣的,在這里coordiantor宕機后不會選新的,而是等待他fail-over之后繼續(xù)擔(dān)當(dāng)coordinator。很多博客在介紹2pc的時候完全不提假設(shè),而且,交互過程完全是隨心推論,很多地方都不嚴(yán)謹(jǐn),看的我云里霧里的,大家有精力還是翻翻英文文檔吧,我這里可能有些地方翻譯的也不一定對,文末有英文原文出處鏈接。整體來看,2pc對外部環(huán)境要求非常嚴(yán)格,而且容易產(chǎn)生阻塞,所以在生產(chǎn)環(huán)境中直接使用2pc作為分布式一致性實現(xiàn)的系統(tǒng)幾乎沒有,但是很多系統(tǒng)有優(yōu)化后的實現(xiàn),比如微軟的PacificA協(xié)議的數(shù)據(jù)復(fù)制階段就是在2pc上加一改造,引入了一個ISR隊列來改善了阻塞的問題。
參考
1. 英文原文
2.wiki
總結(jié)
以上是生活随笔為你收集整理的2pc_two phase commit详情的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。