經典分佈式論文閱讀:Fault-Tolerant VM

本文是Fault-Tolerant VM論文的閱讀筆記。本文實現了一個容錯虛擬機,在另一個服務器上備份主虛擬機的運行。能夠有兩種實現思路:服務器

  • 備份所有狀態的變化到備份虛擬機(包括CPU、內存、I/O設備)。可是,這樣一來須要傳輸處理的數據內容將十分巨大。
  • 將虛擬機視爲肯定狀態機,這是本文的方法。只須要初始狀態和肯定的輸入,以及記錄一些不肯定事件便可完成備份。

VMware已經在vSphere中實現了本文的虛擬機備份機制,可以在主虛擬機發生故障以後無縫啓用備份虛擬機。目前這個技術只支持單核處理器,由於多核處理器指令訪存也是不肯定的事件。固然,本文實現的備份機制奏效的前提是故障在被外部發現以前都能被檢測到。網絡

基礎的容錯設計

一個容錯的配置以下圖所示,對於一臺虛擬機(主虛擬機)而言,咱們在其餘物理服務器上運行一臺備份虛擬機,兩臺主機處於虛擬鎖步狀態。它們會鏈接到同一個共享磁盤。其中,全部的輸入(包括網絡、鼠標、鍵盤等等)只會交給主虛擬機,而後經過日誌信道發送給備份虛擬機。異步

肯定回放實現

複製虛擬機的運行主要面臨三個挑戰:性能

  1. 正確地捕獲全部的輸入和必要的不肯定事件來保證備份虛擬機的肯定運行,
  2. 正確地將輸入和不肯定性應用到備份虛擬機
  3. 保證不下降性能

不過,VMware vSphere已經提供了VMware肯定回放[2]功能。優化

容錯協議

輸出要求:若是備份虛擬機在故障以後替代了主虛擬機,備份虛擬機運行期間要保證外界獲得的輸出是徹底一致的。
複製代碼

只有知足了輸出要求,外界纔不會觀測到故障的發生,而這個要求須要延遲外部輸出直到備份虛擬機收到足夠的信息來重放輸出操做。一個必要的條件就是備份虛擬機須要收到輸出操做以前的全部日誌。備份虛擬機不能在輸出操做以前上線,由於可能主虛擬機中會存在不肯定事件取消了後續的輸出。spa

輸出規則:主虛擬機不會將輸出發送給外界,直到收到了來自備份虛擬機收到產生輸出的操做的日誌的確認。
複製代碼

容錯協議以下圖所示,異步事件、輸入和輸出操做發送給了備份虛擬機,主虛擬機只有在備份虛擬機確認收到輸出操做後輸出。操作系統

不過協議沒法保證重複輸出,由於備份虛擬機無從知曉主虛擬機在輸出以前仍是以後崩潰,另外故障發生時發送給主虛擬機的包也會丟失。不過好在,網絡基礎設施、操做系統、應用程序一般都能處理丟包或者重複的狀況。設計

故障檢測和響應

在備份虛擬機取代主虛擬機以前,須要應用所有的日誌。主虛擬機和備份虛擬機主要經過心跳包和日誌通訊來判斷對方是否故障。爲了解決腦裂問題,兩個虛擬機須要經過共享磁盤上得知對方是否故障。若是主虛擬機故障,那麼備份虛擬機取代主虛擬機,並建立一個新的備份虛擬機;若是備份虛擬機故障,那麼建立一個新的備份虛擬機。3d

容錯實現實踐

  • 啓動和重啓容錯虛擬機

在啓動主虛擬機或者備份虛擬機故障後,須要建立一個和主虛擬機相同狀態的備份虛擬機,而且不能打斷主虛擬機的運行。具體經過VMware VMotion實現,VMotion將虛擬機複製到另一個物理服務器上,將源虛擬機做爲主虛擬機,將目標虛擬機做爲備份虛擬機。日誌

備份虛擬機一般位於集羣中另一臺服務器上,由vSphere調度選擇放置的服務器,這些服務器可以訪問共享的磁盤。

  • 管理日誌信道

日誌信道能夠經過一個大的緩衝來實現,必要的時間能夠控制主虛擬機的運行速度來保證備份虛擬機可以遇上。

  • 容錯虛擬機的操做

虛擬機會有各類各樣的控制操做,例如關機、修改資源分配,這些其實均可以經過特殊的控制操做日誌來實現。

容錯機制給VMotion帶來了挑戰,VMotion用來無縫遷移虛擬機,要求在切換的時候掛起全部磁盤I/O。主虛擬機能夠掛起磁盤I/O,可是備份虛擬機重複主虛擬機的,須要經過日誌信道請求主虛擬機掛起磁盤I/O。

  • 磁盤I/O實現中的問題

實現磁盤I/O會面臨如下問題

  1. 磁盤操做是非阻塞的,因此能夠並行寫入,可是由此引入了不肯定性。解決方案是強制磁盤操做串行進行。
  2. 磁盤操做(DMA)和應用程序會並行操做同一塊內存,引起數據競爭。解決方案是使用額外緩衝,讀取磁盤時先將數據讀入額外緩衝,寫入磁盤時先將數據複製到額外緩衝。
  3. 當主虛擬機故障,備份虛擬機替代時,磁盤I/O可能沒有完成。解決方案是從新執行磁盤操做,由於前兩個方案已經避免了數據競爭,所以磁盤操做是可重入的。
  • 網絡I/O實現中的問題

vSphere實現了一些網絡方面的優化,例如直接從網絡緩衝區取走數據,而不經過陷阱,可是這將帶來不肯定,所以須要禁用這個優化。另外也作了如下優化:

  1. 經過批量操做下降虛擬機陷阱和中斷次數。
  2. 下降傳輸數據包的延遲:將發送操做和接收操做註冊到TCP協議棧之中,保證當即發送和接收日誌。

設計中的選擇

是否共享磁盤

主虛擬機和備份虛擬機其實能夠採用獨立的磁盤,磁盤是內部存儲,因此不須要知足輸出要求,可是兩個磁盤須要在啓動容錯之初進行同步。不過,這是腦裂問題就不能經過磁盤解決了,須要經過第三方協調服務器。

在備份虛擬機中執行磁盤讀取操做

備份虛擬機也能夠考慮直接從磁盤讀取數據而不須要經過日誌信道。可是這會致使備份虛擬機變慢,由於須要等待磁盤讀取操做,而且須要處理讀取故障,以及推遲寫入操做保證以前的讀取操做被備份服務器成功執行。

參考文獻

  1. Scales, Daniel J., Mike Nelson, and Ganesh Venkitachalam. "The design of a practical system for fault-tolerant virtual machines." ACM SIGOPS Operating Systems Review 44.4 (2010): 30-39.
  2. Sheldon, M. X. V. M. J., and Ganesh Venkitachalam Boris Weissman. "Retrace: Collecting execution trace with virtual machine deterministic replay." Proceedings of the Third Annual Workshop on Modeling, Benchmarking and Simulation (MoBS 2007). 2007.
相關文章
相關標籤/搜索