累積失敗檢測演算法

2021-06-16 06:16:42 字數 2873 閱讀 7070

在分布式系統中經常使用心跳(heartbeat)來檢測server的健康狀況,但從理論上來說,心跳無法真正檢測對方是否crash,主要困難在於無法真正區別對方是宕機還是「慢」。傳統的檢測方法是設定乙個超時時間t,只要在t之內沒有接收到對方的心跳包便認為對方宕機,方法簡單粗暴,但使用廣泛。

1. 傳統錯誤檢測存在的缺陷

如上所述,在傳統方式下,目標主機會每間隔t秒發起心跳,而接收方採用超時時間t(t1. gossip通訊

但在實際應用中,比如基於gossip通訊應用中,因為隨機通訊,兩個server之間並不存在有規律的心跳,因此很難找到乙個適合的超時時間t,除非把t設定的非常大,但這樣檢測過程就會「遲緩」的無法忍受。

2. 網路負載動態變化

還有一種情況是,隨著網路負載的加大,server心跳的接收時間可能會大於上限值t;但當網路壓力減少時,心跳接收時間又會小於t,如果用一成不變的t來反映心跳狀況,則會造成判斷」遲緩「或誤判。

3. 心跳檢測與結果的分離

並不是每個應用都只需要知道乙個目標主機宕機與否的結果(true/false),即有很多應用需要自己解釋心跳結果從而採取不同的處理動作。比如,如果目標主機3s內沒有心跳,應用a解讀為宕機並重試;而應用b則解讀為目標」不活躍「,需要把任務委派到其他server。

也就是說,目標主機是否「宕機」應該由業務邏輯決定的,而不是簡單的通過乙個超時時間t決定,這就需要把心跳檢測過程與對結果的解釋相分離,從而為應用提供更好的靈活性。

2. 對傳統錯誤檢測的改造

很多人已經意識到了傳統檢測的缺點,因此提出了各種解決方案,這些方案的重點都放在如何改造超時時間t上,基本原理是在執行時根據前幾次心跳時間動態估計下一次的心跳時間。而估計的方法大多通過採用隨機抽樣尋找心跳時間與網路波動的之間的關係曲線,這些方法有效地彌補了傳統檢測方法的缺陷,但解決的最貼近實際的還是φ失敗檢測演算法,下面著重介紹這種演算法。

3. φ失敗檢測演算法

沿著對傳統檢測中t改造的思路,φ失敗檢測採用乙個大小為n的滑動視窗(n可配置)來記錄最近n次心跳時間間隔(本次心跳收到時間與上次之差),並把此作為隨機樣本。φ失敗檢測認為心跳時間間隔符合正態分佈:

而對此函式進行積分,則認為其結果是時間間隔下的心跳接收概率,其積分如下:

所以,如果在[x,+∞)上積分則認為是時間間隔下心跳無法接收的概率:

而φ採用下面公式計算:

此時計算出的φ是乙個數字,是從(tnow-tlast)

到+∞的積分,並取以10為底的對數並轉換為正數,其含義是:假如在時間tnow判斷目標宕機,則誤判的可能性為p=g(tnow-tlater),即心跳在tnow

之後到達的概率。

則,p越大說明誤判的概率越大,因為0現在從概率p推導不同φ之間的關係:

p2>p1 => log(p2) > log(p1) => -log(p2) < -log(p1) => φ2

一般設定φ為臨界值,φ為根據當前時間計算出的值,如果φ>φ,即誤判的可能性小於設定的臨界值,則認為目標主機已經宕機。

因為對數的關係,φ=1,則認為誤判的可能性不能超過10%,φ=2,則為1%,φ=3,則為0.1%...

而正態分佈中的σ、μ引數需要根據當前的隨機樣本動態計算,因為隨機樣本隨網路狀況的動態變化,正態分佈函式也就隨之變化,從而心跳時間也發生變化,但我們只要設定乙個誤判率(比如φ=3)則能保證正確的結果。這是傳統的基於超時時間t無法做到的。

大家可能對上面把對對正態分佈函式的積分作為概率的方法不太理解,下面介紹概率密度函式,從而說明為什麼要這麼做。嚴格說來這些內容不屬於錯誤檢測,只是數理統計的一些常識。

4. 概率密度函式

數理統計中的事件分隨機事件和連續事件,隨機事件是指事件的取值是可數的(可全部列出的),比如紅、黑、黃三種顏色;而連續事件的取值則無法列出,比如心跳間隔時間,而只能屬於某個區間。無論是離散還是連續事件,只要發生的足夠多都會遵從一定的數理規律,也就是可以用一條曲線來表示其發生的趨勢。

對離散事件而言,x軸代表事件的取值,y軸代表該值發生的概率;而對連續事件,x軸依然代表事件取值,但y軸代表該值附近的概率變化率,即單位寬度內的概率,而這條曲線稱之為概率密度函式,對此曲線積分則得到概率,稱之為累積函式,這也是累積失敗檢測名稱的由來。為什麼不能像離散事件那樣根據隨機樣本直接繪製概率曲線?因為對連續事件而言,每個具體的取值對應的概率都為0,只有對某個乙個區間才存在概率,因此只能繪製其密度函式曲線。很顯然,概率密度函式是累積函式的一階導數。

上面提到的正態分佈是乙個概率密度函式,當然也可以構造自己的密度函式,但要滿足很多性質,具體請參考:概率密度函式。在實際中,連續時間隨機分布的概率密度函式一般採用指數分布函式,而不會採用正態分佈,當然正態分佈函式因為不可積,其積分也很難計算。

指數分布的概率密度函式:

對應的累積函式:

5. cassandra中的應用

cassandra是基於gossip的通訊,其錯誤檢測方式便採用了累積失敗檢測,概率密度函式使用了指數分布函式,並沒有採用原**中的正態分佈函式,預設情況,cassandra把φ設定為8,這個誤判概率是相當低的。cassandra是實現時,是為每個server都為何乙個滑動視窗用來記錄其最近的隨機樣本,指數分布中的引數λ採用滑動視窗中間隔時間的平均值,從而隨著網路狀況的變化,概率曲線也會發生相應的變化,從而反映真實的網路狀況。cassandra的所有相關實現都封裝在failuredetector類中。

6. 總結

φ失敗檢測的核心思想是根據最近一段時間的樣本估計目標宕機的可能性,從而能根據網路的真實情況正確判斷目標是否宕機,當然也做到了檢測與結果解釋想分離,才能個人提高系統的可擴充套件性。當然實現的前提是選擇乙個恰當的概率密度函式,無論是正態分佈還是只是分布都是一些經驗函式,也可根據曲線擬合構造自己的概率密度函式。

7. 參考資料

the ϕ accrual failure detector

a gossip-style failure detection service

cassandra failure detection

VIBE檢測演算法

一 vibe 獲取目標 其他演算法處理 最終目標 優點 記憶體占用少,處理速度快,計算量小,檢測效果好 無引數法 可直接應用在產品中,軟硬體相容性好 效能優於混合高斯,引數化方法,sacon等 背景模型及時初始化 具有較好的抗噪能力。缺點 ghost區域 挑戰 必須適應環境的變化 比如光照的變化造成...

素數檢測演算法

因為1既不是素數也不是合數,所以下面的實現 中不考慮小於2的情況。本文以c語言進行講解,建議對著完整的原始碼看。最原始 最粗暴的方法就是從頭到尾逐個進行檢測,一旦遇到可被整除的數馬上返回false bool is prime 1 int n return true 該演算法時間複雜度為n2 n 2對...

邊緣檢測演算法

邊緣是由灰階等高線定義的,穿過等高線時,灰階會迅速變化,沿著等高線走,灰階值的變化會更加輕柔,有可能是隨機變化的,因此邊緣具有乙個可以測量的方向。邊緣畫素和雜訊畫素相比周圍的畫素都有明顯的變化,而邊緣畫素互相連線,構成等高線,因此可以通過這一特性區分邊緣畫素和雜訊畫素。1 數位化 影象的取樣不可能使...