本文是Fault-Tolerant VM論文的閱讀筆記。本文實現了一個容錯虛擬機,在另一個服務器上備份主虛擬機的運行。能夠有兩種實現思路:服務器
VMware已經在vSphere中實現了本文的虛擬機備份機制,可以在主虛擬機發生故障以後無縫啓用備份虛擬機。目前這個技術只支持單核處理器,由於多核處理器指令訪存也是不肯定的事件。固然,本文實現的備份機制奏效的前提是故障在被外部發現以前都能被檢測到。網絡
一個容錯的配置以下圖所示,對於一臺虛擬機(主虛擬機)而言,咱們在其餘物理服務器上運行一臺備份虛擬機,兩臺主機處於虛擬鎖步狀態。它們會鏈接到同一個共享磁盤。其中,全部的輸入(包括網絡、鼠標、鍵盤等等)只會交給主虛擬機,而後經過日誌信道發送給備份虛擬機。異步
複製虛擬機的運行主要面臨三個挑戰:性能
不過,VMware vSphere已經提供了VMware肯定回放[2]功能。優化
輸出要求:若是備份虛擬機在故障以後替代了主虛擬機,備份虛擬機運行期間要保證外界獲得的輸出是徹底一致的。
複製代碼
只有知足了輸出要求,外界纔不會觀測到故障的發生,而這個要求須要延遲外部輸出直到備份虛擬機收到足夠的信息來重放輸出操做。一個必要的條件就是備份虛擬機須要收到輸出操做以前的全部日誌。備份虛擬機不能在輸出操做以前上線,由於可能主虛擬機中會存在不肯定事件取消了後續的輸出。spa
輸出規則:主虛擬機不會將輸出發送給外界,直到收到了來自備份虛擬機收到產生輸出的操做的日誌的確認。
複製代碼
容錯協議以下圖所示,異步事件、輸入和輸出操做發送給了備份虛擬機,主虛擬機只有在備份虛擬機確認收到輸出操做後輸出。操作系統
不過協議沒法保證重複輸出,由於備份虛擬機無從知曉主虛擬機在輸出以前仍是以後崩潰,另外故障發生時發送給主虛擬機的包也會丟失。不過好在,網絡基礎設施、操做系統、應用程序一般都能處理丟包或者重複的狀況。設計
在備份虛擬機取代主虛擬機以前,須要應用所有的日誌。主虛擬機和備份虛擬機主要經過心跳包和日誌通訊來判斷對方是否故障。爲了解決腦裂問題,兩個虛擬機須要經過共享磁盤上得知對方是否故障。若是主虛擬機故障,那麼備份虛擬機取代主虛擬機,並建立一個新的備份虛擬機;若是備份虛擬機故障,那麼建立一個新的備份虛擬機。3d
在啓動主虛擬機或者備份虛擬機故障後,須要建立一個和主虛擬機相同狀態的備份虛擬機,而且不能打斷主虛擬機的運行。具體經過VMware VMotion實現,VMotion將虛擬機複製到另一個物理服務器上,將源虛擬機做爲主虛擬機,將目標虛擬機做爲備份虛擬機。日誌
備份虛擬機一般位於集羣中另一臺服務器上,由vSphere調度選擇放置的服務器,這些服務器可以訪問共享的磁盤。
日誌信道能夠經過一個大的緩衝來實現,必要的時間能夠控制主虛擬機的運行速度來保證備份虛擬機可以遇上。
虛擬機會有各類各樣的控制操做,例如關機、修改資源分配,這些其實均可以經過特殊的控制操做日誌來實現。
容錯機制給VMotion帶來了挑戰,VMotion用來無縫遷移虛擬機,要求在切換的時候掛起全部磁盤I/O。主虛擬機能夠掛起磁盤I/O,可是備份虛擬機重複主虛擬機的,須要經過日誌信道請求主虛擬機掛起磁盤I/O。
實現磁盤I/O會面臨如下問題
vSphere實現了一些網絡方面的優化,例如直接從網絡緩衝區取走數據,而不經過陷阱,可是這將帶來不肯定,所以須要禁用這個優化。另外也作了如下優化:
主虛擬機和備份虛擬機其實能夠採用獨立的磁盤,磁盤是內部存儲,因此不須要知足輸出要求,可是兩個磁盤須要在啓動容錯之初進行同步。不過,這是腦裂問題就不能經過磁盤解決了,須要經過第三方協調服務器。
備份虛擬機也能夠考慮直接從磁盤讀取數據而不須要經過日誌信道。可是這會致使備份虛擬機變慢,由於須要等待磁盤讀取操做,而且須要處理讀取故障,以及推遲寫入操做保證以前的讀取操做被備份服務器成功執行。