異常偵測
異常偵測和驅逐是指動態判斷上游叢集中是否有部分主機的效能與其他主機不同,並將它們從健康的 負載平衡 集合中移除的過程。效能可能沿著不同的軸向進行評估,例如連續失敗次數、時間成功率、時間延遲等。異常偵測是一種 *被動式* 健康檢查的形式。Envoy 也支援 主動式健康檢查。*被動式* 和 *主動式* 健康檢查可以同時或獨立啟用,並構成整體上游健康檢查解決方案的基礎。異常偵測是 叢集設定 的一部分,它需要篩選器來報告錯誤、逾時和重置。目前,以下篩選器支援異常偵測:http 路由、tcp proxy、redis proxy 和 thrift proxy。
偵測到的錯誤分為兩類:外部來源錯誤和本機來源錯誤。外部產生的錯誤是特定於交易的,並且發生在上游伺服器上以響應接收到的請求。例如,HTTP 伺服器傳回錯誤碼 500 或 redis 伺服器傳回無法解碼的酬載。這些錯誤是在 Envoy 成功連線到上游主機後,在上游主機上產生的。本機產生的錯誤是 Envoy 為了回應中斷或阻止與上游主機通訊的事件而產生的。本機產生的錯誤範例包括逾時、TCP 重置、無法連線到指定的連接埠等。
偵測到的錯誤類型取決於篩選器類型。例如,http 路由 篩選器會偵測本機產生的錯誤(逾時、重置 - 與連線到上游主機相關的錯誤),並且由於它也理解 HTTP 協定,因此它會報告 HTTP 伺服器傳回的錯誤(外部產生的錯誤)。在這種情況下,即使與上游 HTTP 伺服器的連線成功,與伺服器的交易也可能會失敗。相反地,tcp proxy 篩選器不了解 TCP 層之上的任何協定,並且僅報告本機產生的錯誤。
在預設設定下(outlier_detection.split_external_local_origin_errors 為 *false*),本機產生的錯誤不會與外部產生的(交易)錯誤區分開來,所有錯誤都進入同一個儲存區,並與 outlier_detection.consecutive_5xx、outlier_detection.consecutive_gateway_failure 和 outlier_detection.success_rate_stdev_factor 設定項目進行比較。例如,如果由於逾時而導致與上游 HTTP 伺服器的連線失敗兩次,然後在成功建立連線後,伺服器傳回錯誤碼 500,則錯誤總數將為 3。
注意
對於 TCP 流量,outlier_detection.consecutive_5xx 是要設定的正確參數,並且會透明地對應到 TCP 連線失敗。
還可以設定異常偵測,以區分本機產生的錯誤與外部產生的(交易)錯誤。它是透過 outlier_detection.split_external_local_origin_errors 設定項目完成的。在該模式下,本機產生的錯誤由與外部產生的(交易)錯誤不同的計數器追蹤,並且可以將異常偵測器設定為對本機產生的錯誤做出反應並忽略外部產生的錯誤,反之亦然。
重要的是要了解,叢集可以在多個篩選器鏈之間共用。如果一個篩選器鏈基於其異常偵測類型驅逐主機,則其他篩選器鏈也會受到影響,即使它們的異常偵測類型不會驅逐該主機。
驅逐演算法
根據異常偵測的類型,驅逐會內嵌執行(例如,在連續 5xx 的情況下)或以指定的間隔執行(例如,在定期成功率的情況下)。驅逐演算法的工作原理如下
判斷主機為異常值。
它會檢查以確保被驅逐的主機數量低於允許的臨界值(透過 outlier_detection.max_ejection_percent 設定指定)。如果被驅逐的主機數量高於臨界值,則不會驅逐該主機。
該主機將被驅逐一段毫秒數。驅逐表示該主機被標記為不健康,並且在負載平衡期間不會被使用,除非負載平衡器處於 緊急 情況。毫秒數等於 outlier_detection.base_ejection_time 值乘以該主機連續被驅逐的次數。這會導致主機在它們持續失敗的情況下,被驅逐更長的時間。當驅逐時間達到 outlier_detection.max_ejection_time 時,它不會再增加。當主機變為健康時,驅逐時間乘數會隨著時間減少。主機的健康狀況會以等於 outlier_detection.interval 的間隔進行檢查。如果主機在該檢查期間是健康的,則驅逐時間乘數會遞減。假設主機保持健康,則大約需要 outlier_detection.max_ejection_time / outlier_detection.base_ejection_time * outlier_detection.interval 秒,才能將驅逐時間降低到最小值 outlier_detection.base_ejection_time。
被驅逐的主機在驅逐時間滿足後會自動恢復服務。一般來說,異常偵測會與 主動式健康檢查 一起使用,以實現全面的健康檢查解決方案。
注意
如果也設定了 主動式健康檢查,則成功的主動式健康檢查會取消驅逐主機並清除所有異常偵測計數器。如果主機尚未達到 unhealthy_threshold 失敗的健康檢查次數,則單次成功的健康檢查將取消驅逐主機。如果為主機設定了 FAILED_ACTIVE_HC 健康標誌,則 healthy_threshold 次連續成功的健康檢查將取消驅逐主機(並清除 FAILED_ACTIVE_HC 標誌)。如果您的主動式健康檢查未驗證資料平面流量,那麼在主動式健康檢查通過但流量失敗的情況下,端點將會過早取消驅逐。若要停用此選項,請將 outlier_detection.successful_active_health_check_uneject_host 設定標誌設定為 false
。
偵測類型
Envoy 支援以下異常偵測類型
連續 5xx
在預設模式下(outlier_detection.split_external_local_origin_errors 為 *false*),此偵測類型會將所有產生的錯誤納入考量:本機產生的錯誤和外部產生的(交易)錯誤。
注意
非 HTTP 篩選器(例如 tcp proxy 或 redis proxy)產生的錯誤在內部會對應到 HTTP 5xx 程式碼,並被視為此類錯誤。
在分割模式下(outlier_detection.split_external_local_origin_errors 為true),此偵測類型僅考慮外部來源(交易)錯誤,忽略本地來源的錯誤。如果上游主機是 HTTP 伺服器,則僅考慮 5xx 類型的錯誤(例外情況請參閱 連續閘道故障)。對於透過 redis 代理 提供的 redis 伺服器,僅考慮來自伺服器的格式錯誤的回應。格式正確的回應,即使它們帶有操作錯誤(例如找不到索引、拒絕存取)也不會被考慮在內。
如果上游主機返回一些被視為連續 5xx 類型錯誤的錯誤,則會將其驅逐。驅逐所需的連續 5xx 數量由 outlier_detection.consecutive_5xx 值控制。
連續閘道故障
在預設模式下(outlier_detection.split_external_local_origin_errors 為 false),此偵測類型會考慮 5xx 錯誤的子集,稱為「閘道錯誤」(502、503 或 504 狀態碼)以及本地來源的故障,例如逾時、TCP 重置等。
在分割模式下(outlier_detection.split_external_local_origin_errors 為 true),此偵測類型會考慮 5xx 錯誤的子集,稱為「閘道錯誤」(502、503 或 504 狀態碼),且僅由 http 路由器 支援。
如果上游主機返回一些連續的「閘道錯誤」(502、503 或 504 狀態碼),則會將其驅逐。驅逐所需的連續閘道故障數量由 outlier_detection.consecutive_gateway_failure 值控制。
連續本地來源故障
僅當 outlier_detection.split_external_local_origin_errors 為 true 時,才會啟用此偵測類型,並且僅考慮本地來源的錯誤(逾時、重置等)。如果 Envoy 無法重複連線到上游主機,或與上游主機的通訊重複中斷,則會將其驅逐。會偵測到各種本地來源的問題:逾時、TCP 重置、ICMP 錯誤等。驅逐所需的連續本地來源故障數量由 outlier_detection.consecutive_local_origin_failure 值控制。此偵測類型由 http 路由器、tcp 代理 和 redis 代理 支援。
成功率
基於成功率的異常值偵測會聚合叢集中每個主機的成功率資料。然後在給定的間隔,根據統計異常值偵測驅逐主機。如果主機在聚合間隔內的請求量小於 outlier_detection.success_rate_request_volume 值,則不會計算主機的成功率異常值偵測。此外,如果一個間隔內具有最小請求量的的活躍主機數量少於 outlier_detection.success_rate_minimum_hosts 值,則不會對叢集執行偵測。
在預設設定模式下(outlier_detection.split_external_local_origin_errors 為 false),此偵測類型會考慮所有類型的錯誤:本地和外部來源的錯誤。outlier_detection.enforcing_local_origin_success 設定項目會被忽略。
在分割模式下(outlier_detection.split_external_local_origin_errors 為 true),本地來源的錯誤和外部來源(交易)的錯誤會分別計算和處理。大多數設定項目,即 outlier_detection.success_rate_minimum_hosts、outlier_detection.success_rate_request_volume、outlier_detection.success_rate_stdev_factor 適用於兩種錯誤類型,但 outlier_detection.enforcing_success_rate 僅適用於外部來源的錯誤,而 outlier_detection.enforcing_local_origin_success_rate 僅適用於本地來源的錯誤。
失敗百分比
基於失敗百分比的異常值偵測功能與成功率偵測類似,它依賴於叢集中每個主機的成功率資料。然而,它們不是將這些值與整個叢集的平均成功率進行比較,而是與使用者設定的固定閾值進行比較。此閾值透過 outlier_detection.failure_percentage_threshold 欄位進行設定。
基於失敗百分比偵測的其他設定欄位與成功率偵測的欄位類似。基於失敗百分比的偵測也遵守 outlier_detection.split_external_local_origin_errors;外部和本地來源錯誤的強制百分比分別由 outlier_detection.enforcing_failure_percentage 和 outlier_detection.enforcing_failure_percentage_local_origin 控制。與成功率偵測一樣,如果主機在聚合間隔內的請求量小於 outlier_detection.failure_percentage_request_volume 值,則不會對主機執行偵測。此外,如果一個間隔內具有最小請求量的的活躍主機數量少於 outlier_detection.failure_percentage_minimum_hosts 值,也不會對叢集執行偵測。
gRPC
對於 gRPC 請求,異常值偵測將使用從 grpc-status 回應標頭對應的 HTTP 狀態。
驅逐事件記錄
Envoy 可以選擇性地產生異常值驅逐事件的日誌。這在日常操作中非常有用,因為全域統計資料沒有提供足夠的資訊說明哪些主機被驅逐以及原因。日誌結構化為 OutlierDetectionEvent 訊息 的基於 protobuf 的傾印。驅逐事件記錄在叢集管理員的 異常值偵測設定 中設定。