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

準備工做

閱讀:Fault-Tolerant Virtual Machinessql

爲何要閱讀這篇文章

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

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

容錯(Fault tolerance)

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

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

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

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

  • 高效ide

論文嘗試解決哪些失敗?

  • 斷電等忽然中止的錯誤性能

  • 網絡丟包spa

  • 網絡分區

核心思想

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

  • 每個副本都維持相同的狀態,若是一個服務器失敗,其餘服務器能夠繼續進行。

  • 須要思考的重要問題:

    • 什麼狀態須要去複製?

    • 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

相關文章
相關標籤/搜索