PBFT之視圖更新


PBFT之視圖更新

1 檢查點

為了保證安全,除非消息中的請求至少已由f+1個無故障的副本節點執行,並且可以從視圖更新中向其他節點證明,否則消息必須保留在副本節點日志中。另外,如果某些副本丟失了所有非故障副本節點丟棄的消息,則需要通過轉移全部或部分服務狀態來使消息更新。因此,副本也需要一些證明狀態正確的證據。
在執行完所有操作之后生成這些證據的代價是昂貴的。相反,當執行的請求序列號可被某個常數(例如100)整除時,這些證據會定期生成。由執行完這些請求后根據狀態機的狀態產生的稱為檢查點,穩定的檢查點就是該證據。
副本節點維護一些服務狀態的邏輯拷貝:最新的穩定的檢查點,零個或多個不穩定的檢查點,還有當前狀態。寫時復制技術可以用於減少存儲額外狀態拷貝的空間負載。
作為證據的正確的檢查點由以下步驟產生:

  1. 當一個副本節點i生成了檢查點,將會多播一個消息<CHECKPOINT,n,d,i>_s到其他副本節點。
    • n為狀態中最新的被執行的請求序列號
    • d為狀態的摘要
  2. 每一個副本節點都會收集檢查點信息,直到收集到2f+1個來自不同副本節點簽名的具有相同序列號以及相同摘要d的消息
  3. 將它們添加到日志中。這2f+1個消息即是證明該檢查點正確的證明。
    具有證明的檢查點即是穩定的檢查點,副本節點將會拋棄所有的序列號小於或等於日志中所有pre-prepare,prepare,commit消息中序列號的消息。同時也會拋棄之前所有的檢查點以及檢查點消息。
    檢查點協議用於推進低閾值標記和高閾值標記(限制可以接收多少消息),低閾值h等於最新的穩定的檢查點的序列號。高閾值H=h+k,其中k是足夠大的數以至於副本節點不用一直等待檢查點變為穩定的。例如,如果檢查點包括接近100個請求,那么k可能為200.

2 視圖更新過程

視圖更新協議可以在系統中的primary虛假或崩潰時為系統提供活性。超時則會觸發視圖更新防止副本節點無限期地等待接收請求去執行。

  • 如果副本接收到一個有效的請求並且還沒有被執行,副本將會處於等待狀態。
  • 副本在接受到請求后並且計時器還沒有處於運行時則會啟動計時器。
  • 當不再等待執行請求時,它將停止計時器,但如果此時正在等待執行其他請求,則將計時器重新啟動。
  1. 如果節點i在視圖為v時計時器超時,該節點將會開始視圖更新並且將視圖變為v+1。停止接收信息(除了檢查點,視圖更新和新視圖消息外),並多播<VIEW-CHANGE,v+1,n,C,P,i>_s消息到所有副本節點。

    • n為節點i知道的最新的穩定檢查點s的序列號。
    • C為一組2f+1個有效的檢查點消息,它們證明檢查點s的正確性
    • P是在節點i處的每個序列號高於n的請求消息mprepared集合Pm的集合。
    • 每一個集合Pm包含2f個匹配的有效的pre-prepare消息(不包括與客戶端相關的信息),由不同的副本節點簽名的具有相同視圖,序列號,m的摘要的prepare消息。
  2. primary在視圖v+1時接收到2f個來自其他副本的視圖為v+1的有效的VIEW-CHANGE消息后,將會多播一個<NEW-VIEW,v+1,V,O>_s消息到所有其他副本節點。

    • V為一個包含接收到的由primary發送的視圖更改為v+1的有效的VIEW-CHANGE消息的集合。
    • O為一個pre-prepare消息的集合(不包含請求消息m),O通過以下內容計算:
      • primary決定關於V中最新的穩定的檢查點的最小序列號min-s以及在V中的的prepare消息中最大的序列號max-s.
      • primary對每一個在min-smax-s之間序列號n創建新的視圖為v+1pre-prepare消息。這里有兩種情況:
        • P中至少有一個由一些在V中序列號為nVIEW-CHANGE消息組成的集合。
        • 沒有這樣的集合

    在第一種情況下,primary創建新的消息<PRE-PREPARE,v+1,n,d>_s,這里的d為在V中序列號為n的高視圖編號的pre-prepare消息的請求摘要。
    在第二種情況下,primary將會創建新的<PRE-PREPARE,v+1,n,d_null>_s消息,這里的d_null為指定的空的請求的摘要。空的請求在協議中和其他請求一樣,只不過不進行執行。

  3. 接下來primary添加O中的消息到日志中。如果min-s大於他的最新穩定的檢查點的序列號,primary還在其日志中插入序列號為min-s的檢查點的穩定性證明,並丟棄日志中的信息。這時候視圖進入了v+1,在該點以后可以接收視圖為v+1的消息。

  4. 副本接收到關於視圖為v+1NEW-VIEW消息后,如果簽名為正確的,且包含的內容對於視圖是v+1是有效的,如果集合O是正確的(O的正確性通過與primary創建O時相同的計算過程進行驗證).那么將該信息(正如primary描述的)添加到日志中。,多播在O中的prepare消息到其他所有副本中,並添加這些prepare消息到日志中,視圖進入v+1

  5. 此后,正如三階段提交協議過程,副本節點重新執行在min-smax-s中的協議,但是避免重新執行客戶端的請求(通過使用存儲的關於最新的發送到每一個客戶端的回復信息)。

副本可能會缺失某些請求消息m或者是穩定的檢查點(由於沒有發送NEW-VIEW消息)。這些缺失的信息可以從其他副本節點獲取。
例如,副本i可以從一個副本節點(它的檢查點信息已在V中確認正確性)獲取缺失的檢查點狀態s.由於這些f+1個副本節點是正確的,副本節點i將總是獲取s或者是最新的穩定檢查點。通過對狀態進行分區並為每個分區加上被修改的它的最后一個請求的序列號標記,可以避免發送整個檢查點。要使副本為最新版本,只需將副本發送到過期的分區,而不是整個檢查點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM