鍍金池/ 問(wèn)答/人工智能  C  網(wǎng)絡(luò)安全/ 分布式一致性協(xié)議 :2pc 二階段提交的疑問(wèn)

分布式一致性協(xié)議 :2pc 二階段提交的疑問(wèn)

clipboard.png

為什么上圖非要強(qiáng)調(diào)說(shuō) “唯一收到commit消息的參與者掛了之后”, 即使選舉了新的協(xié)調(diào)者, 事務(wù)狀態(tài)也無(wú)法確定

  1. 個(gè)人總感覺(jué), 假設(shè)有三個(gè)參與者, 在第二階段, 即使有兩個(gè)參與者收到了commit, 第三個(gè)參與者在掛了之后, 重啟后, 協(xié)調(diào)者也無(wú)法得知它的事務(wù)到底有沒(méi)有被提交啊!
  2. 關(guān)于二階段提交的另一個(gè)問(wèn)題:
    在第二階段, 參與者 無(wú)論是執(zhí)行commit還是rollback, 在執(zhí)行完成后, 都會(huì)響應(yīng)ack
    那如果此時(shí)返回給協(xié)調(diào)者時(shí), 協(xié)調(diào)者超時(shí), 或者宕機(jī), 這樣到底算什么情況?

    感覺(jué)好多資料都是說(shuō)的很簡(jiǎn)單(不一致, 單點(diǎn), 同步阻塞), 但個(gè)人感覺(jué), 這些問(wèn)題也得細(xì)分, 看到底是哪個(gè)階段中的哪個(gè)時(shí)段發(fā)生的, 這樣問(wèn)題才會(huì)暴露出來(lái)

回答
編輯回答
淺淺

異常分 3 種情況:

  1. 協(xié)調(diào)者不宕機(jī),參與者宕機(jī);
  2. 協(xié)調(diào)者宕機(jī),參與者不宕機(jī);
  3. 協(xié)調(diào)者宕機(jī),參與者也宕機(jī);

對(duì)于(1),當(dāng)在事務(wù)進(jìn)行過(guò)程中,有參與者宕機(jī)時(shí),他重啟以后,可以通過(guò)詢問(wèn)其他參與者或者協(xié)調(diào)者,從而知道這個(gè)事務(wù)到底提交了沒(méi)有。

對(duì)于(2),協(xié)調(diào)者宕機(jī)后,可以起新的協(xié)調(diào)者,然后查詢所有參與者的狀態(tài)是否有 commit 的,如果有,則繼續(xù) commit,如果都沒(méi)有,則 abort。

對(duì)于(3),是唯一 2PC 不能解決的:當(dāng)協(xié)調(diào)者在發(fā)出 commit 消息后宕機(jī)了,而唯一收到這條命令的一個(gè)參與者也宕機(jī)了,這個(gè)時(shí)候這個(gè)事務(wù)就處于一個(gè)未知的狀態(tài),沒(méi)有人知道這個(gè)事務(wù)到底是提交了還是未提交,從而需要數(shù)據(jù)庫(kù)管理員的介入,防止數(shù)據(jù)庫(kù)進(jìn)入一個(gè)不一致的狀態(tài)。當(dāng)然,如果有一個(gè)前提是:所有節(jié)點(diǎn)或者網(wǎng)絡(luò)的異常最終都會(huì)恢復(fù),那么這個(gè)問(wèn)題就不存在了,協(xié)調(diào)者和參與者最終會(huì)重啟,其他節(jié)點(diǎn)也最終也會(huì)收到commit T的信息。

2017年6月26日 20:27