開發與維運

使用服務網格構建分佈式系統中的容錯能力

服務網格本質上是存在於服務之間的網絡,為微服務帶來了彈性,。通過一種輕量級的Sidecar模式負責管理服務之間的流量, 可用於部署具有彈性的微服務。
容錯能力是指系統在部分故障期間, 仍然能夠繼續運行的能力。創建一個可靠的彈性系統會對其中的所有服務提出容錯要求。雲環境的動態性質要求編寫的服務能預見這些失敗, 並能優雅地響應意外情況。服務網格在不要求應用程序修改任何代碼的情況下為應用程序帶來了容錯能力。

在分佈式系統架構下, 必須考慮面向失敗的設計。 任何一個服務都必須假定遠程調用可能失敗,並且必須使用適當的後備操作進行準備。一個服務中斷可能會引起連鎖反應從而導致嚴重的業務後果,因此我們構建、運行和測試系統的彈性能力非常必要。

使用服務網格技術構建的容錯解決方案通常著重於以下幾個方面:
- 超時處理(timeouts)
- 隔板模式(bulkheads)
- 回退機制(fallbacks)
- 熔斷機制(circuit breakers)

## 超時處理
防止故障的第一道防線就是使用超時機制。通過設置超時, 可以確保應用程序在後端服務無響應時可以收到錯誤返回,從而使其能夠以適當的回退行為進行處理。超時更改的是發出請求的客戶端等待響應的時間, 它們對目標服務的處理行為沒有影響,因此這並不意味著請求的操作失敗。

服務網格ASM支持在VirtualService定義中為路由設置超時策略來更改超時值,如果sidecar代理在設置值時間內未收到響應,則該請求將失敗。

該策略如下所示:

```
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- 'httpbin'
http:
- route:
- destination:
host: httpbin
timeout: 5s
```
通過這種方式調整超時,所有使用路由的請求都將使用該超時設置。

## 隔板模式
隔板模式有助於隔離用於服務的資源,並避免級聯故障。通過以下使用DestinationRule來限制上游服務的連接池,從而定義服務間隔板。 其中,最大連接數和連接超時時間是對 TCP 和 HTTP 都有效的通用連接設置; 而每個連接最大請求數和最大請求重試次數僅針對 HTTP1.1/HTTP2/GRPC 協議的連接生效。
![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/4b33221d-ab14-4422-80fa-05814afe45f4.png)

示例如下:
```
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
trafficPolicy:
connectionPool:
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
tcp:
connectTimeout: 10s
maxConnections: 1
```
此配置將與示例服務的每個實例建立的最大併發連接數限制為1, 並且不能在10秒內建立連接的服務會得到503 -- Service Unavailable 響應。

## 重試機制
在微服務彈性設計架構中,假設請求某個服務節點時遭遇請求失敗,例如請求超時、連接超時、服務宕機等一系列可能的錯誤,這時可以通過配置重試機制,重新請求其他服務。

重試請求雖然是最簡單的回退機制, 但重試請求可能會導致級聯的系統故障, 也就是常說的重試風暴。不要過於頻繁地重試或重試過長時間。 在短時間內重試不太可能成功,因為服務可能還未恢復。 此外,如果在服務嘗試恢復時進行了大量連接嘗試,則其可能會承受更大壓力,並且反覆的連接嘗試甚至可能使服務不堪重負,導致潛在問題變得更加嚴重。

服務網格技術可以更有效地執行重試。它已經直接參與請求路由,並且為重試策略提供了與語言無關的一致實現。例如,可以定義一個類似於以下示例的策略:

```
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- 'httpbin'
http:
- route:
- destination:
host: httpbin
retries:
attempts: 3
perTryTimeout: 5s
```
通過這種簡單的配置,通過Sidecar代理或入口網關對後端服務的請求最多可以重試3次,每次嘗試都將有5秒鐘的超時時間。Sidecar確定重試之間的間隔,並在兩次嘗試之間故意引入抖動,以避免轟炸過載的服務。

## 熔斷機制
發生故障時,熔斷器用於優化出站請求的行為。熔斷器不會重複向無響應的服務發出請求,而是觀察在給定時間段內發生的故障數。如果錯誤率超過閾值,則熔斷器將斷開請求,並且所有後續請求都將失敗,直到熔斷器被關閉為止。
![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/e80ac4a6-ccec-4096-ab4b-03aeed808b09.png)

異常檢測OutlierDetection是服務網格中的熔斷實現,用於跟蹤上游服務中每個主機的狀態,支持HTTP和TCP類型的服務。對於HTTP服務來說,在預定義的時間段內,持續返回API調用的5xx錯誤的主機將在連接池中被移除。對於TCP服務來說,連接超時或連接失敗將被認為異常。

熔斷器通過使用DestinationRule定義:
```
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
trafficPolicy:
outlierDetection:
consecutiveErrors: 3
interval: 5s
baseEjectionTime: 5m
maxEjectionPercent: 100
```
指定的outlierDetection流量策略將應用於每個單獨的實例, 摘除在5秒鐘內連續三次失敗的服務實例, 並保持摘除至少5分鐘。可以摘除所有實例, 即比例為100%。maxEjectionPercent設置與負載平衡有關。服務網格會維護負載均衡池,並從該池中摘除失敗的實例。默認情況下,它會從負載平衡池中彈出最多10%的所有可用實例。

阿里雲服務網格(簡稱ASM)是一個統一管理微服務應用流量、兼容Istio的託管式平臺。通過流量控制、網格觀測以及服務間通信安全等功能,服務網格ASM可以全方位地簡化您的服務治理,併為運行在異構計算基礎設施上的服務提供統一的管理能力,適用於ACK Kubernetes集群、ASK Serverless Kubernetes集群、邊緣集群、ECS虛擬機以及自建Kubernetes集群。
具體參見:https://www.aliyun.com/product/servicemesh

Leave a Reply

Your email address will not be published. Required fields are marked *