準備工作
閱讀:Fault-Tolerant Virtual Machines
爲什麼要閱讀這篇文章
瞭解分佈式系統的容錯機制
本文是對於容錯機制的比較特殊的實現,其並不是要設計一個應用程序級別的容錯系統,而是一個系統級別的。需要處理CPU中斷,能夠爲了實現一個容錯的虛擬機系統(VM-FT),難度更大。
容錯(Fault tolerance)
容錯是即使發生故障也會繼續提供服務的能力
一些理想的屬性:可用性:儘管[某些故障]仍然可用
一致性:正確性的保證,對於客戶端來說就像是面對一臺服務器
對用戶和軟件透明(內部運行機制透明)
高效
論文嘗試解決哪些失敗?
斷電等突然停止的錯誤
網絡丟包
網絡分區
核心思想
容錯的核心思想是建立副本,需要兩個以上的服務器。
每一個副本都維持相同的狀態,如果一個服務器失敗,其他服務器可以繼續進行。
需要思考的重要問題:
什麼狀態需要去複製?
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相似。