我試圖推斷可以由保證同步數據源的系統/框架採取的故障恢復操作。我一直無法找到Narayana恢復機制的明確解釋。Narayana/XA如何從TM故障中恢復?
問題1:Narayana是否實質上採用兩階段提交來確保跨2個數據源的分佈式事務?問題2:有人可以在這種情況下解釋Narayana的行爲嗎?
- 應用希望保存X到2個數據存儲
- 納拉亞納的事務管理器(TM)產生一個事務ID和寫入信息到磁盤
- TM現在發送準備消息給兩個數據存儲
- 每個數據存儲迴應prepare_success
- TM更新本地事務日誌並向兩個數據存儲發送提交消息
- TM失敗(永久)。由於網絡丟包,只有一個數據存儲接收到提交消息。但其他數據存儲接收併成功處理提交消息。
兩個數據存儲現在彼此不同步(一個源有另一個不存在於另一個源中的事務)。
當一個新的TM出現時,它不能訪問舊的事務狀態記錄。因此,TM無法啓動在其中一個數據存儲中恢復丟失的事務。
那麼2PC/Narayana/XA如何聲稱他們保證可以保持2個數據存儲同步的分佈式事務呢?從我的立場來看,他們只能以極高的概率保持同步數據存儲,但他們無法保證。
問題3:另一個場景,我對應用程序/框架的行爲不清楚。
- 迪=數據源I
- TI =事務我
- PI =用於準備消息: - (具有部分重疊的一組記錄,或者至少兩個在相同的記錄)考慮以下交織交易交易i
D1收到P1;響應P1_成功
D2收到P2;響應P2_成功
D1收到P2;響應P2_failure
D2收到P1;響應P1_failure
網絡數據包到達不同數據源的順序可以確定哪個準備請求成功。這是否意味着在爭議性記錄的高交易速度下 - 所有交易都有可能失敗(直到記錄經歷較低的交易請求率)?
有人可能會爭辯說我們選擇的是可用性的一致性,但與ACID系統不同,不能保證至少有一個事務會成功(從而避免潛在的長時間死鎖)。
我無法爲Narayana創建標籤 - http://narayana.io//docs/project/index.html#d0e2032 社區 - 如果可以創建並添加標籤,我將不勝感激這個問題 – skittish
當然,我在問這個問題後發現,這就是我們爲什麼要進行3階段提交的確切原因。 :) https://en.wikipedia.org/wiki/Three-phase_commit_protocol#Motivation 我要離開這個問題,希望有人能回答其他2個問題。 – skittish