閱讀:Fault-Tolerant Virtual Machinessql
瞭解分佈式系統的容錯機制數據庫
本文是對於容錯機制的比較特殊的實現,其並非要設計一個應用程序級別的容錯系統,而是一個系統級別的。須要處理CPU中斷,可以爲了實現一個容錯的虛擬機系統(VM-FT),難度更大。緩存
容錯是即便發生故障也會繼續提供服務的能力
一些理想的屬性:服務器
可用性:儘管[某些故障]仍然可用網絡
一致性:正確性的保證,對於客戶端來講就像是面對一臺服務器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中獲得的值
primary必須在副本收到此輸出指令的日誌後,纔可以輸出。
此規則是必要的,由於咱們的服務是爲了在奔潰時讓用戶是無感知的。
有了此規則,即使pimary奔潰了,副本也可以和primary同樣,對於以前的請求返回相同的數據。
假設primary收到請求I1 I2 I3 並輸出, 這時primary奔潰,副本只能看到I1,I2。這時 一個以前收到I1,I2,I3的客戶端因爲切換到副本後,相同的請求就只能看到I1,I2。
增長了延遲,限制了性能。
這時會切換到副本運行,而副本會執行I3命令,並返回給客戶端。
副本會當即接管。
對於TCP傳輸:接收者將忽略重複的序列號。
對於磁盤:副本將相同的數據寫入相同的塊。
共享磁盤只容許惟一的一個primary。
虛擬機管理程序(hypervisor)模擬和控制硬件的許多操做,這些操做可能會致使primary和副本執行不一樣。例如定時中斷(timing interrupts)
管理程序是虛擬機系統的一部分,和虛擬機監視器(VMM)同樣。
系統管理程序模擬計算機以及在其中運行的操做系統和程序。
在本文中,primary和副本是運行在虛擬機中的guest操做系統。而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類似。