為了更有效的做論文閱讀筆記,之后都打算將每篇論文筆記的內(nèi)容控制在較少的字?jǐn)?shù)范圍內(nèi),畢竟原論文擺在那里,將其翻譯照抄過來也沒什么意思,將論文讀薄才是最重要的。( ?? ω ?? )?
"The Design of a Practical System for Fault-Tolerant Virtual Machines"是MIT6.824推薦閱讀的論文之一,它介紹了一種通過主備機制來進行單核虛擬機級別的容錯方法。
相關(guān)背景
本文考慮的主要是fail-stop故障,例如電源線拔掉了,爆炸了,網(wǎng)絡(luò)離線了等情況,而這也才能用復(fù)制的方法容錯,普通的程序錯誤導(dǎo)致的故障也無法通過復(fù)制來解決。
容錯一般有兩種方法:
- **狀態(tài)轉(zhuǎn)移:**拷貝主虛擬機的所有狀態(tài)到另一個虛擬機上
- **復(fù)制狀態(tài)機:**將虛擬機認為是一個狀態(tài)機,只拷貝具體的操作
明顯復(fù)雜狀態(tài)機對寬帶要求更低,但是其設(shè)計更為復(fù)雜,本文采用的是復(fù)制狀態(tài)機的方法。但是后面VMWare團隊有推出多核虛擬機級別的容錯,該方法采用的是類似狀態(tài)轉(zhuǎn)移的方法。
容錯一般還可以分為應(yīng)用層容錯和主機層容錯,本文是主機層,在這有容錯的虛擬機上可以運行任何應(yīng)用。
設(shè)計概述
設(shè)計主要解決的問題是如何保證兩個VM的狀態(tài)一直保持一致。兩個主副VM之間會通過Logging channel進行連接,主VM會將其任何會導(dǎo)致兩者狀態(tài)不一致的命令或者非確定性事件命令都通過Logging channel發(fā)送給副VM,副VM會讀取該channel來執(zhí)行相同的操作,但是該執(zhí)行的輸出會被忽略掉。
傳遞指令需要特別注意的是一些非確定性事件,該事件主要有兩類分別是隨時到達的客戶端輸入和在不同時刻不同的VM上會產(chǎn)生不同的結(jié)果的怪異指令,例如生成隨機數(shù)、獲取當(dāng)前時間、獲取主機id等。
非確定性事件還包括CPU并發(fā),因為指令交織的順序難以保證,例如兩個并發(fā)的線程同時向一塊數(shù)據(jù)加鎖,那么主副VM上哪個線程能拿到鎖其實是不確定的,但是本文是針對單CPU的,沒有提及這個問題
可以猜測傳遞的日志中主要有三樣?xùn)|西:
- 事件發(fā)生時的指令序號,即自機器啟動以來指令的相對序號
- 日志類型
- 數(shù)據(jù),如果是網(wǎng)絡(luò)數(shù)據(jù)包日志,那么就包含對應(yīng)的數(shù)據(jù),如果是怪異指令,那么就是其在主虛擬機上執(zhí)行的結(jié)果
需要注意的是為了保證副VM的執(zhí)行不會超過主VM,副VM只有的channel里面有指令的時候才會繼續(xù)運行,即副VM永遠會落后主VM一個指令,不然就會一直停止等待,或者檢測到主VM掛了,自己上臺當(dāng)主VM
輸出控制
系統(tǒng)通過網(wǎng)絡(luò)數(shù)據(jù)包來與用戶進行交互,文章的目標(biāo)是讓用戶接收到返回信息時該指令一定是在兩個VM上都能執(zhí)行了的,它避免的是如下的場景:
- 主虛擬機給了用戶返回,但是由于其馬上crash了,沒有將指令及時傳給副VM,那么后面通過副VM上臺時,該命令其實是沒執(zhí)行的,但是用戶會以為其已經(jīng)執(zhí)行了
解決方法是:主VM輸出返回必須要在發(fā)送了日志且副VM返回了確認接收之后
當(dāng)然這也有可能會導(dǎo)致重復(fù)輸出,因為主VM輸出后馬上奔潰,而副VM上臺后還沒有執(zhí)行這個命令,那么后面再執(zhí)行時就會導(dǎo)致重復(fù)輸出,而文中提到由于有TCP的規(guī)則在,由于輸出的是完全一致的數(shù)據(jù)包,該重復(fù)輸出會被TCP的協(xié)議解決掉。
容錯
主副VM之間需要知道對方有沒有存活,文中使用了UDP心跳來檢測服務(wù)器是否奔潰,此外也通過監(jiān)控日志流量(因為定時器中斷的存在,日志流量應(yīng)該是有規(guī)律的)來探查,如果超過特點時間,就可能發(fā)生故障了,但是這依然會存在腦裂的問題,如果只是兩個VM之間的網(wǎng)絡(luò)出問題了,那么副VM如果這時上臺就會出現(xiàn)兩個主VM。文中采用的解決方案是通過Test-and-Set方案,它會在共享存儲中執(zhí)行一個原子性的測試設(shè)置操作。如果操作成功,VM就會被允許上線,如果不成功就說明另外一個還在運行。如果采用的不是共享存儲,那么也會引入一個第三方的決策者來進行判斷。
如果是副VM奔潰了,則會重新起一個副VM,該VM來自對主VM的完全拷貝。文章來源:http://www.zghlxwxcb.cn/news/detail-779724.html
同時為了保證容錯的副VM上臺后,不會需要太長時間才能把剩余的命令消費掉,已經(jīng)為了防止channel的緩沖區(qū)被填滿,副VM會和主VM保持一定的指令數(shù)間隔,文中提到執(zhí)行延遲應(yīng)不小于100ms,如果副VM跟不上主VM的處理速度,系統(tǒng)會分配給主VM更少的Cpu周期數(shù)來平衡兩者的速度。文章來源地址http://www.zghlxwxcb.cn/news/detail-779724.html
參考資料
- https://pdos.csail.mit.edu/6.824/papers/vm-ft.pdf
- https://zhuanlan.zhihu.com/p/523109983
- https://pdos.csail.mit.edu/6.824/notes/l-vm-ft.txt
- https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/lecture-04-vmware-ft
到了這里,關(guān)于【論文閱讀】The Design of a Practical System for Fault-Tolerant Virtual Machines的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!