兩階段提交協議
三階段提交協議
paxos演算法
本文主要介紹前兩種協議,內容摘自書《從paxos到zookeeper》
說明:首先我們要明白,兩階段提交主要有兩個角色:協調者和參與者。兩階段提交將事務的提交分為兩個階段進行處理:
(1)提交事務請求:協調者詢問事務參與者、參與者執行事務(並且需要將一些事務的undo,redo記錄一下保證回滾的時候的操作)、各參與者向協調者反饋事務詢問的響應(成功執行事物之後的反饋),這一階段類似於「投票」。各個參與者會將事務執行的返回結果反饋給協調者。
(2)執行事務提交:如果參與者中有反饋no的,就說明此次事務不能被提交,這個時候協調者會發起中斷事務的流程,向所有的參與者發出rollback請求,參與者執行undo即事務回滾,回滾後釋放資源,再然後參與者會將回滾結果反饋給協調者。協調者接收到反饋的資訊後,事務中斷。當然如果所有的參與者都反饋yes,那麼協調者會進行事務提交的流程,向所有參與者傳送commit請求,參與者接收到commit請求後會正式執行事物提交操作,並在完成提交之後釋放資源。參與者在完成事務提交後反饋給協調者ack訊息,協調者完成事務。
如下圖所示:
2.優缺點:
優點:原理簡單,實現方便。
缺點:同步阻塞,單點問題,腦裂,太保守
(1)同步阻塞:各個參與者在等待其他參與者的過程中,將無法進行其他操作。
(2)單點問題:要是協調者出了問題,那麼代表著這個兩階段提交都無法進行而且其他參與者將會一直鎖定事務資源
(3)資料不一致:就好比我們有5個參與者,那麼當協調者傳送給前兩個參與者commit請求後,協調者突然掛掉了,那麼會造成後面的流程走不通資料會出現不一致。
(4)太保守:如果協調者給參與者傳送了訊息後,參與者出現問題,無反饋,那麼我們只能靠協調者的自動斷開機制來實現中斷。
說明:三階段提交其實是拆分了兩階段請求中的事務請求過程來達到改進目的的。三階段提交分為三個階段進行處理
(1)cancommit?:協調者向各個參與者傳送訊息詢問是否準備好了?如果參與者覺得可以了,就返回yes
(2)precommit:類似的,如果上個過程中有參與者反饋no給協調者或者協調者等待超時,那麼協調者就會傳送中斷請求給參與者,參與者如果接收到abort請求或者等待過程中出現超時,都會中斷事務。如果上個過程中參與者反饋全部都為yes,那麼協調者會向所有參與者傳送precommit請求,進入prepared階段,參與者接收到precommit請求後會執行事務(並且需要將一些事務的undo,redo記錄一下保證回滾的時候的操作),如果參與者執行過程中成功,則返回給協調者ack響應,如果同事等待最後的指令commit/abort
(3)docommit:同樣分為兩種情況
1.執行提交:如果協調者正常工作切收到了上個過程中的ack響應,那麼從precommit調到docommit狀態,向所有的參與者傳送docommit請求,參與者收到docommit請求後會正式執行事物操作並在完成提交之後釋放事物執行過程期間占用的資源,完成這之後參與者會反饋給協調者ack,協調者接收到ack後完成事物。
2.中斷事務:上個過程中有乙個參與者反饋no或等待超時,那麼協調者會傳送abort請求,參與者收到abort請求後會回滾precommit過程中得事務操作並向協調者傳送ack訊息,最後協調者接收到中斷的ack後完成中斷請求。
值得注意的是,如果在docommit過程中,如果協調者出現問題,或者參與者收不到docommit或者abort請求,參與者都會繼續提交事物。
如下圖所示:
2.優缺點:
1.優點:相比於兩階段提交的方式,三階段提交降低了參與者的阻塞範圍,而且保證了資料的一致性。
2.缺點:如果協調者給了參與者precommit請求後就要無音訊,那麼參與者依然會進行事務提交,這樣就會造成資料的不一致。
歡迎使用CSDN markdow
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...
歡迎毛毛與妞妞使用CSDN markdown編輯器
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...
歡迎使用CSDN markdow1n編輯器
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...