6.824分佈式系統[3]-主從複製

準備工作

閱讀:Fault-Tolerant Virtual Machines

爲什麼要閱讀這篇文章

  • 瞭解分佈式系統的容錯機制

  • 本文是對於容錯機制的比較特殊的實現,其並不是要設計一個應用程序級別的容錯系統,而是一個系統級別的。需要處理CPU中斷,能夠爲了實現一個容錯的虛擬機系統(VM-FT),難度更大。

容錯(Fault tolerance)

  • 容錯是即使發生故障也會繼續提供服務的能力
    一些理想的屬性:

  • 可用性:儘管[某些故障]仍然可用

  • 一致性:正確性的保證,對於客戶端來說就像是面對一臺服務器

  • 對用戶和軟件透明(內部運行機制透明)

  • 高效

論文嘗試解決哪些失敗?

  • 斷電等突然停止的錯誤

  • 網絡丟包

  • 網絡分區

核心思想

  • 容錯的核心思想是建立副本,需要兩個以上的服務器。

  • 每一個副本都維持相同的狀態,如果一個服務器失敗,其他服務器可以繼續進行。

  • 需要思考的重要問題:

    • 什麼狀態需要去複製?

    • primary(主服務器)需要等待副本服務器複製完成嗎?

    • 什麼時候需要切換到副本服務器?

    • 切換到副本時是否可能發生異常?

    • 切換到副本時能否加速?


兩種主要的方式

  • 狀態轉移

    • primary執行操作

    • primary將狀態轉移到副本

    • 狀態轉移雖然簡單,但是狀態可能很大,轉移可能很慢

    • 論文中的虛擬機使用了複製狀態機。


  • 複製狀態機

    • 所有副本執行所有操作

    • 相同的開始狀態

    • 相同的操作

    • 相同的順序

    • 確定性的操作

    • 則具有相同的最終狀態

    • 更有效率,但是更復雜


本論文的目標

  • 構建複製狀態機

  • Primary和副本具有相同的初始狀態(內存,磁盤文件)

  • primary通過日誌通道(logging channel)傳遞給副本服務器

  • 使主從具有相同的指令、相同的輸入、相同的執行

什麼時候在主數據庫上執行與備份上可能不同?

  • 來自外部的輸入(網絡)

  • 從存儲服務器讀取的數據

  • 定時器中斷(Timing of interrupts)。 參考:wikibook

  • 一些特殊的指令:如cpu週期計數

  • 衝突

不一致的原因

  • 鎖定服務器將lock授予客戶端C1,拒絕來自C2的後續請求

  • 鎖定服務器在一分鐘後撤消lock

  • 假設C1持有lock並且,1分鐘馬上就要到時,c2請求鎖。這時,Primary可能會在定時器1分鐘發送中斷之前立即看到C2的請求,拒絕其請求。副本可能會在定時器1分鐘發送中斷之後看到C2的請求,同意請求。

  • 因此:副本必須在指令流中的同一點以相同的順序看到相同的事件。

解決定時器中斷的解決方案

  • primary

    • FT 收到定時器中斷信號

    • FT從CPU讀取指令

    • FT在日誌通道(logging channel)上發送 "在指令x處觸發計時器中斷”

    • FT給primary發送中斷信號,然後恢復。


  • Backup

    • 忽略自己的定時器硬件

    • 在副本執行指令X之前,觀察是否日誌中有需要在這之前執行的日誌。

    • FT告訴CPU在指令X處中斷

    • FT模擬計時器中斷,然後恢復。


解決磁盤、網絡數據輸入可能不一致的問題

FT攔截,只能夠讓primary能夠訪問硬件。

  • Primary:

  • FT通知硬件通過方式將數據存入FT的私有緩存中

  • 在某一時刻,硬件執行DMA,然後中斷

  • FT收到中斷信號

  • FT暫停primary

  • FT複製緩衝區數據到primary內存中。

  • FT爲primary模擬中斷,稍後恢復。

  • FT將數據和指令發送到備份 Backup:

    • FT從日誌流中獲取數據和指令

    • FT告訴CPU在指令X處中斷

    • FT在中斷期間複製數據


緩衝區(bounce buffer)的目的就是爲了在內存的同一個時間點執行相同的操作,讀取相同的數據。

解決特殊的指令

  • Primary:

    • 如果primary執行了特殊的指令,FT會通知CPU中斷

    • FT執行指令並記錄結果

    • 將結果和指令發送到備份


  • Backup:

    • 副本在執行此指令時也會中斷

    • 副本應用從primary中得到的值


Output Ruler

  • primary必須在副本收到此輸出指令的日誌後,才能夠輸出。

  • 此規則是必要的,因爲我們的服務是爲了在奔潰時讓用戶是無感知的。

  • 有了此規則,即便pimary奔潰了,副本也能夠和primary一樣,對於之前的請求返回相同的數據。

  • 假設primary收到請求I1 I2 I3 並輸出, 這時primary奔潰,副本只能看到I1,I2。這時 一個之前收到I1,I2,I3的客戶端由於切換到副本後,相同的請求就只能看到I1,I2。

  • 增加了延遲,限制了性能。

問 & 答

如果primary收到副本對於I3 ack確認後奔潰,會發生什麼?

這時會切換到副本運行,而副本會執行I3命令,並返回給客戶端。

如果primary在發出輸出之後崩潰了怎麼辦?

  • 副本會立即接管。

  • 對於TCP傳輸:接收者將忽略重複的序列號。

  • 對於磁盤:副本將相同的數據寫入相同的塊。

如果網絡分區,primary和副本都認爲彼此失活?

  • 共享磁盤只允許唯一的一個primary。

爲什麼確定性的操作,在物理硬件上比虛擬機上更難?

虛擬機管理程序(hypervisor)模擬和控制硬件的許多操作,這些操作可能會導致primary和副本執行不同。例如定時中斷(timing interrupts)

什麼是虛擬機管理程序 (hypervisor) ?

  • 管理程序是虛擬機系統的一部分,和虛擬機監視器(VMM)一樣。

  • 系統管理程序模擬計算機以及在其中運行的操作系統和程序。

  • 在本文中,primary和副本是運行在虛擬機中的guest操作系統。而FT是實現每個虛擬機管理程序的一部分。

GFS和VMware FT均提供容錯功能,誰更好?

  • FT更底層強大,對內存,網絡包和磁盤提供了一種容錯能力。可以使用它爲所有運行在其上的服務透明地提供容錯功能。

  • GFS僅提供存儲容錯功能。 由於GFS專用於特定的簡單服務(存儲),因此其複製比FT更有效。 例如,GFS不需要使中斷在所有副本上的完全相同的指令處發生。

  • GFS是應用程序級別的具有容錯能力的大型應用程序之一。

緩衝區如何幫助避免衝突

網絡數據包或請求的磁盤塊到達primary並且要複製到primary的內存時,

  • 沒有FT,相關硬件將數據複製到內存中,同時 軟件正在執行。操作系統指令可以在DMA期間讀取該內存。

  • 由於衝突,在某一時刻,可能無法看到DMA的數據。因此可能出現由於primary與副本的時間不同,一個能看到,一個不能看到這個數據。

表現

  • logging帶寬

  • 直接反應磁盤讀取率 + 網絡輸入率

  • 大約18 Mbit/s for my-sql

  • 比較慢,應用程序可以至少400 Mbps的速度讀取磁盤

  • 用途

  • 關鍵但強度較低的服務,例如 名稱服務器。

  • 適用於軟件行爲不常發生改變的服務。

高吞吐量服務的主從複製

  • 將應用程序主從狀態機用於數據庫等高吞吐量服。

  • 狀態只是DB,而不是全部的內存和磁盤。

  • 事件是數據庫命令(put或get),而不是數據包和中斷。

  • 更少的細粒度同步,更少的開銷。

  • GFS使用應用程序級複製,與lab2相似。

參考資料

*講義
*FAQ


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章