恐慌臨界值
在負載平衡期間,Envoy 通常只會考慮上游叢集中可用的(健康或降級的)主機。但是,如果叢集中可用主機的百分比過低,Envoy 將忽略健康狀態,並在所有主機或沒有主機之間進行負載平衡。這稱為恐慌臨界值。預設的恐慌臨界值為 50%。這可以透過執行時以及設定在叢集設定中進行設定。恐慌臨界值用於避免在負載增加時,主機故障在整個叢集中串聯發生的情況。
當處於恐慌狀態時,Envoy 可以選擇兩種模式:流量將被傳送到所有主機,或者不會傳送到任何主機(因此將始終失敗)。這在叢集設定中進行配置。在恐慌情況下選擇讓流量失敗,可以幫助避免潛在故障的上游服務不堪負荷,因為它會在所有主機都被判定為不健康之前,減少上游服務的負載。但是,它消除了即使叢集中許多或所有主機都不健康,_某些_請求也能成功的可能性。如果觀察到特定服務以全有或全無的模式失敗,這可能是一個很好的權衡,因為它會更快地切斷對叢集的請求。相反,如果即使在降級時,叢集通常仍能成功服務_某些_請求,則啟用此選項可能沒有幫助。
恐慌臨界值與優先順序結合使用。如果給定優先順序中可用主機的數量減少,Envoy 將嘗試將部分流量轉移到較低的優先順序。如果它成功地在較低的優先順序中找到足夠的可用主機,Envoy 將忽略恐慌臨界值。用數學術語來說,如果所有優先順序層級的標準化總可用性為 100%,則 Envoy 將忽略恐慌臨界值,並根據 此處描述的演算法,繼續在優先順序之間分配流量負載。但是,當標準化總可用性降至 100% 以下時,Envoy 會假設所有優先順序層級都沒有足夠的可用主機。它會繼續在優先順序之間分配流量負載,但是如果給定優先順序層級的可用性低於恐慌臨界值,則無論其可用性如何,流量都將傳送到該優先順序層級中的所有(或無)主機。
以下範例說明了標準化總可用性和恐慌臨界值之間的關係。假設恐慌臨界值使用預設值 50%。
假設一個簡單的設定,具有 2 個優先順序層級,P=1 健康狀態為 100%。在這種情況下,標準化總健康狀態始終為 100%,P=0 永遠不會進入恐慌模式,並且 Envoy 能夠根據需要將盡可能多的流量轉移到 P=1。
P=0 健康端點 |
|
P=0 處於恐慌狀態 |
到 P=1 的流量 |
P=1 處於恐慌狀態 |
標準化總健康狀態 |
---|---|---|---|---|---|
72% |
100% |
否 |
0% |
否 |
100% |
71% |
99% |
否 |
1% |
否 |
100% |
50% |
70% |
否 |
30% |
否 |
100% |
25% |
35% |
否 |
65% |
否 |
100% |
0% |
0% |
否 |
100% |
否 |
100% |
如果 P=1 變得不健康,則在健康狀態 P=0 + P=1 的總和降至 100% 以下之前,恐慌臨界值將繼續被忽略。此時,Envoy 開始檢查每個優先順序的恐慌臨界值。
P=0 健康端點 |
P=1 健康端點 |
到 P=0 的流量 |
P=0 處於恐慌狀態 |
到 P=1 的流量 |
P=1 處於恐慌狀態 |
標準化總健康狀態 |
---|---|---|---|---|---|---|
72% |
72% |
100% |
否 |
0% |
否 |
100% |
71% |
71% |
99% |
否 |
1% |
否 |
100% |
50% |
60% |
70% |
否 |
30% |
否 |
100% |
25% |
100% |
35% |
否 |
65% |
否 |
100% |
25% |
25% |
50% |
是 |
50% |
是 |
70% |
5% |
65% |
7% |
是 |
93% |
否 |
98% |
可以透過將恐慌臨界值設定為 0% 來停用恐慌模式。
只要有未處於恐慌模式的優先順序層級,負載分配的計算方式如上所述。當所有優先順序層級都進入恐慌模式時,負載計算演算法會發生變化。在這種情況下,每個優先順序層級接收的流量相對於該優先順序層級中的主機數量,與所有優先順序層級中的主機數量有關。例如,如果有 2 個優先順序 P=0 和 P=1,並且每個優先順序由 5 個主機組成,則每個層級將接收 50% 的流量。如果優先順序 P=0 中有 2 個主機,而優先順序 P=1 中有 8 個主機,則優先順序 P=0 將接收 20% 的流量,而優先順序 P=1 將接收 80% 的流量。
但是,如果任何優先順序的恐慌臨界值為 0%,則該優先順序永遠不會進入恐慌模式。在這種情況下,如果所有主機都不健康,Envoy 將無法選擇主機,而是會立即傳回「503 - 沒有健康的上游」錯誤回應。
請注意,恐慌臨界值可以按優先順序進行配置。