本文是對論文《The Phi Accrual Failure Detector》的理解以及在cassandra中的實現。
背景
衆所周知,故障探測(failure detector)是分佈式系統的基礎模塊。有人建議把故障探測做成一個基本的服務,類似於DNS、NTP(始終同步),其在分佈式系統的重要性可見一斑。
妨礙故障探測稱爲一個服務的主要障礙在於:分佈式應用需要調整故障檢測以適用於不同的QOS需求,傳統的故障探測算法只能提供bool結果。
accrual failure detector的創新在於:產生結果是被監測的server crash的置信度(the degree of confidence),置信度是隨着時間變化的連續的值,分佈式應用根據自身的QOS需求定義適合自己的suspicion threshold,定義一個較低的threshold會導致探測到一個real creash時間短,但是其正確性不高;定義一個較高的 threshold會導致特測到real crash的時間長,但是其正確性高。
舉例。在一個分佈式系統中,有一個master server和多個worker server, master server需要把很多job分發到worker server上。很顯然,master server需要探測worker server的狀態。利用accrual failuer detector,當某個worker server的置信度達到low threshold時,master server不向此worker server派發新的job;當置信度達到moderate threshold時,master server會把在此woker server上的job派發到其它的worker server;當置信度達到high threshold,master server會把釋放關於此worker server的通信資源(比如關閉socket)。
failure detector基本概念
■基本概念之一:Unreliable failure detectors
failure detectors是不可靠的,原因是crash server很難與 slow server區分。
性質1: There is a time after which every process that crashes is permanently suspected by all correct processes.
性質2:There is a time after which correct processes are not suspected by any correct process.
■基本概念之二:Quality of service of failure detectors
定義1 (Detection time TD):The detection time is the time that elapses since the crash of p and until q begins to suspect p permanently.
定義2 (Average mistake rate _M): This measures the rate at which a failure detector generates wrong suspicions.
■基本概念之三:Heartbeat failure detectors
Q監控P,P會定期的向Q發送心跳,發送心跳的間隔記爲△i。Q在△to時間內沒有收到新的心跳,則認爲P已經crash。△tr定義爲消息在網路上傳輸的時延。
第一個方案,把△to設定爲一個固定的值。缺點:當△to設置的過低時,crash很快會被檢測到,但是結果的正確性不高。反之,crash被檢測到時間長,但正確性高。
第二個方案,根據心跳的網絡時延△tr 和 心跳發送間隔△i 來確定△to。缺點:需要依賴△i,因爲the regularity of the sending of heartbeats cannot be ensured and a short interval makes the timing inaccuracies due to operating system scheduling take more importance。[s1]
■基本概念之四:Adaptive failure detectors
隨着網絡狀況不斷的變化,adaptive failuer detector也會不斷地調整。
A Chen-FD。 根據最近一段時間收到心跳的間隔來預測收到下個心跳的時間。作者提供了2個版本的協議:基於同步時鐘和基於異步始終的。
B Bertier-FD。基本算法與上同,不同的是在Chen的算法的基礎上增加了round-trip time 的考慮。測試表明:Bertier-FD 算法比 Chen-FD算法 更快的檢測到crash,但是其正確性降低了。
C 如何確定心跳發送間隔△i[s2] 。從常識來看,△i應該由應用自己的需求來確定。但是,M¨uller認爲應該由下層的系統(網絡,OS)來確定,如果△i遠遠小於△tr,故障特測時間由△tr確定,減小△i不會減少故障特測時間,相反還會增加網絡擁塞,從而增加△tr,進而增加故障探測時間;如果△i遠遠大於△tr,故障特測時間由△i確定,增加△i會增大故障特測時間,且不會明顯的減少網絡負載。所以△i應該與平均△tr相當。
accrual failure detector原理
server q 探測 p。輸出值由如下函數表示,(suspiction level of p)
此函數必須滿足如下條件
條件3:如果p已經crash,值隨着t趨近與無窮大。
條件4:如果p已經crash,存在一個時間段,此時間段後,其值是單調遞增的。
條件5:如果p是alive,值有一個上限(upper bound)。
條件5:如果p是alive,存在一個時間段,此時間段後,其值爲0。
accrual failure detector實現
設計一個隊列,存儲收到心跳的間隔,隊列的大小是一個固定值(稱爲window size),當收到新的心跳後,計算時間間隔並寫入隊列,刪除隊首的元素。μ表示隊列中的時間間隔的平均值,σ表示標準差。
cassandra 中的故障探測
cassandara使用的此論文中的方法來進行故障探測。在cassandra中,windows size設置爲1000, threshold設爲8,當φ值大於8時,則認爲此節點crash。不過,計算φ值的算法有所改進:
Plater(t) = e-t/μ
其代碼參見FailureDetector.java 中的ArrivalWindow. phi()。
chubby中的故障探測
待研究。。。