ZooKeeper - 2PC、3PC協議
2pc two-phase commit
事務處理中,使節點能夠保持一致性和原子性的一種演算法。
事務請求階段:
1.事務詢問。協調者向所有參與者傳送事務內容,詢問參與者是否可以執行提交事務,等待參與者對此作出響應。
2.執行事務。參與者執行事務操作。將undo 和 redo 記錄在事務日誌中。
3.響應詢問。參與者成功執行了事務,就會發出yes響應,表示可以提交事務;反之,會發出no響應。表示不可以提交事務。
事務提交階段:
協調者向所有的參與者傳送提交事務的請求。
參與者收到事務資訊後,執行事務提交,提交事務後向協調者傳送ack資訊作為響應。
如果所有的參與者傳送的都是yes的響應,協調者則提交事務。
只要有一個參與者反饋的是no響應或者等待超時後,協調沒有得到所有參與者的響應,就會執行事務中斷。
協調者向所有參與者傳送中斷事務請求,參與者利用undo記錄的資訊進行資料回滾,釋放所有在事務執行階段佔用的資源並向協調者反饋ack資訊。協調者接收到所有的參與者的ack資訊後,完成事務中斷。
缺點:單點問題,同步阻塞,資料一致性,缺少完善的容錯機制。
3pc - three phase commit
1. canCommit。協調者向所有參與者傳送事務的內容,詢問是否可以提交事務。並等待所有的參與者做出響應。參與者接收到請求後,如果自身認為可以順利執行事務,就會發送oK,進入預備狀態,否則反饋no響應。
2. preCommit。協調者收到的所有參與者的響應都是yes時,進行事務預提交,向所有參與者傳送事務預提交的請求。參與者收到請求後,執行事務預提交,將redo和undo寫入到事務日誌中。執行成功後,向協調者傳送ack資訊。一旦協調者收到no響應或者等待超時後,沒有收到全部的參與者響應,進入中斷階段。協調者傳送中斷請求,或者等待協調者傳送中斷請求超時,參與者都會執行中斷。
3. doCommit。協調者收到所有的參與者的ack資訊後。傳送提交請求。參與者執行事務提交,併發送ack資訊,告知協調者事務執行完畢。一旦協調者沒有收到全部的ack資訊或者等待超時後,執行中斷請求。參與者利用記錄的undo資訊執行事務回滾。之後釋放事務執行階段佔用的資源。所有的參與者向協調者傳送ack資訊,最後協調者中斷事務。
優點:解決了單點阻塞問題。
缺點:三階段,遇到協調者無法向參與者傳送提交或者中斷事務資訊或者等待超時,參與者都會執行事務提交操作。造成資料不一致。