### 負載均衡
當過濾器需要獲取到上游群集中的主機連接時,群集管理器使用負載平衡策略來確定選擇哪個主機。負載平衡策略是可插入的,并且在配置中以每個上游集群為單位進行指定。請注意,如果沒有為群集配置積極的健康檢查策略,則所有上游群集成員都被視為健康。
#### 支持的負載平衡策略
#### 輪訓
這是一個簡單的策略,每個健康的上游主機按循環順序選擇。
#### 權重最小請求
請求最少的負載均衡器使用O(1)算法來選擇兩個隨機的健康主機,并選擇活躍請求較少的主機。(研究表明,這種方法幾乎與O(N)全掃描一樣好)。如果群集中的任何主機的負載均衡權重大于1,則負載均衡器將轉換為隨機選擇主機,然后使用該主機<權重>次數的模式。這個算法對于負載測試來說簡單而充分。在需要真正的加權最小請求行為的情況下(通常如果請求持續時間可變且長度較長),不應使用它。我們可能會在將來添加一個真正的全掃描加權最小請求變體來覆蓋這個用例。
#### 哈希環
環/模哈希負載平衡器對上游主機執行一致的哈希。該算法基于將所有主機映射到一個圓上,使得從主機集添加或移除主機的更改僅影響1/N個請求。這種技術通常也被稱為“ketama”哈希。一致的散列負載均衡器只有在使用指定要散列的值的協議路由時才有效。目前唯一實現的機制是通過HTTP路由器過濾器中的HTTP頭值進行散列。最小環大小默認是在運行時指定的。最小環大小控制環中每個主機的副本數。例如,如果最小環大小為1024,并且有16個主機,則每個主機將被復制64次。環哈希負載平衡器當前不支持加權重。
#### 隨機
隨機負載均衡器選擇一個隨機的健康主機。如果沒有配置健康檢查策略,那么隨機負載均衡器通常比循環更好。隨機選擇可以避免在發生故障的主機之后,對集群中的主機造成不均衡。
#### 原始目的地
這是一個特殊用途的負載平衡器,只能與原始目標群集一起使用。上游主機是基于下游連接元數據選擇的,即,連接被打開到與連接被重定向到Envoy之前傳入連接的目的地地址相同的地址。新的目的地由負載均衡器按需添加到集群,并且集群定期清除集群中未使用的主機。原始目標群集不能使用其他負載平衡類型。
#### 恐慌閾值
在負載均衡期間,Envoy通常只考慮上游群??集中的健康主機。但是,如果群體中的健康主機的百分比變得太低,Envoy就會忽略所有主機中的健康狀況和平衡。這被稱為恐慌閾值。默認的恐慌閾值是50%。這可以通過運行時配置。恐慌閾值用于避免因主機故障,造成整個集群負荷加重的情況。
#### 優先級
在負載均衡期間,Envoy通常只考慮配置在最高優先級的主機。對于每個EDS LocalityLbEndpoints,還可以指定一個可選的優先級。目前,使得從一個優先級到另一個優先級的路由故障轉移機制,變得相當簡單:根據給定的優先級,直到它具有零個健康的主機,在這一點上,切換到下一個最高優先級很難失敗。
#### 區域感知路由
我們會使用以下術語:
- **始發/上游集群**:Envoy將來自原始集群的請求路由到上游集群。
- **本地區域**:包含始發和上游群集中的主機,同屬一個區域。
- **區域感知路由**:盡力將請求路由到本地區域中的上游群集主機。<br /></br>
在原始和上游群集中的主機屬于不同區域的部署中,Envoy執行區域感知路由。在區域感知路由執行之前,有幾個先決條件:
- 發起和上游集群都不處于恐慌狀態。
- 區域感知路由已啟用。
- 源群集與上游群集具有相同的區域數量。
- 上游集群有足夠的主機。 瀏覽[此處](Runtimeconfiguration.md)獲取更多信息。<br /></br>
區域感知路由的目的是盡可能多地向本地區域所在的上游群集發送流量,同時在所有上游主機(取決于負載平衡策略),每個主機每秒大致保持相同數量的請求。
只要維持上游集群中每臺主機的請求數量大致相同,Envoy就會嘗試盡可能多地將流量推送到本地上游區域。決定Envoy路由到本地區域還是執行跨區域路由,取決于本地區域中始發群集和上游群集中健康主機的百分比。在原始和上游集群之間的本地區的百分比關系有兩種情況:
- 源集群本地區域百分比大于上游群集中的百分比。在這種情況下,我們不能將來自原始集群的本地區域的所有請求路由到上游集群的本地區域,因為這將導致所有上游主機的請求不平衡。相反,Envoy會計算可以直接路由到上游群集的本地區域的請求的百分比。其余的請求被路由到跨區域。特定區域是根據區域的剩余容量(該區域將獲得一些本地區域業務量并且可能具有Envoy可用于跨區域業務量的額外容量)來選擇。
- 發起群集本地區域百分比小于上游群集中的百分比。在這種情況下,上游集群的本地區域可以獲得來自原始集群本地區域的所有請求,并且還有一定的空間允許來自發起集群中其他區域的流量(如果需要)。
#### 負載平衡器子集
Envoy可能被配置為根據附加到主機的元數據,將上游集群中的主機劃分為多個子集。然后可以指定主機必須匹配的元數據,提供給負載平衡器進行路由,并且也可以選擇回退到預定義的一組主機(包括任何主機)。
子集使用集群指定的負載平衡器策略。原來的目標策略可能不能與子集一起使用,因為上游主機事先不知道。子集與區域感知路由兼容,但請注意,使用子集可能很容易違反上述的最小主機條件。
如果子集已配置且路由未指定元數據或沒有與元數據匹配的子集,則子集負載均衡器將啟動其后備策略。默認策略是NO_ENDPOINT,在這種情況下,請求失敗,就好像群集沒有主機一樣。相反,ANY_ENDPOINT后備策略會在群集中的所有主機之間進行負載均衡,而不考慮主機元數據。最后,DEFAULT_SUBSET會導致回退至與Envoy元數據集匹配的主機之間進行負載均衡。
子集必須預定義為允許子集負載均衡器有效地選擇正確的主機子集。每個定義都是一組Key,可以轉換為零個或多個子集。從概念上講,每個具有定義中所有Key的元數據值的主機都將被添加到特定于其Key值對的子集中。如果沒有主機擁有所有的密鑰,那么定義就不會產生子集。可以提供多個定義,并且如果單個主機匹配多個定義,則其可以出現在多個子集中。
在路由期間,路由的元數據匹配這些配置(用于查找特定的子集)。如果存在具有由路由指定的確切Key和Value的子集,則該子集用于負載平衡。否則,使用回退策略。因此,集群的子集配置必須包含與給定路由具有相同Key的定義,以便使能子集負載平衡。
此功能只能使用V2 API啟用配置。此外,主機元數據僅支持在群集使用EDS發現類型時使用。子集負載平衡的主機元數據必須放在過濾器名稱“envoy.lb”下。同樣,路由元數據匹配條件使用“envoy.lb”過濾器名稱。主機元數據可以是分層的(例如,頂級key的值可以是結構化值或列表),但子集負載平衡器僅比較頂級key和value。因此,當使用結構化值時,如果主機的元數據中出現相同的結構化值,那么路由只會匹配相同的結構化值。
#### 示例
我們將使用所有值都是字符串的簡單元數據。假定定義了以下主機并將其與集群關聯:
| 主機 | 元數據 |
| ---------- |:---------------------:|
| host1 | v: 1.0, stage: prod |
| host2 | v: 1.0, stage: prod |
| host3 | v: 1.1, stage: canary |
| host4 | v: 1.2-pre, stage: dev|
<br />
集群啟用子集負載平衡,如下所示:
```
---
name: cluster-name
type: EDS
eds_cluster_config:
eds_config:
path: '.../eds.conf'
connect_timeout:
seconds: 10
lb_policy: LEAST_REQUEST
lb_subset_config:
fallback_policy: DEFAULT_SUBSET
default_subset:
stage: prod
subset_selectors:
- keys:
- v
- stage
- keys:
- stage
```
下表介紹了一些路由及其在集群中的應用結果。通常,根據請求特征與路由匹配一起使用,例如路徑或報文頭信息。
| 匹配準則 | 落點 | 原因 |
| -----------------------|:------------:|:------------------------|
| stage: canary | host3 | 主機的子集匹配 |
| v: 1.2-pre, stage: dev | host4 | 主機的子集匹配 |
| v: 1.0 | host1, host2 | 回退:沒有單獨的“v”的子集 |
| other: x | host1, host2 | 回退:沒有“other”的子集 |
| (none) | host1, host2 | 回退:沒有要求的子集 |
<br />
元數據匹配標準也可以在路由的加權群集上指定。來自所選加權群集的元數據匹配條件將與路線中的條件合并并覆蓋該條件:
| 路由匹配準則 | 加權集群匹配準則 | 最終匹配準則 |
| ---------------------|-----------------------|------------------------|
| stage: canary | stage: prod | stage: prod |
| v: 1.0 | stage: prod | v: 1.0, stage: prod |
| v: 1.0, stage: prod | stage: canary | v: 1.0, stage: canary |
| v: 1.0, stage: prod | v: 1.1, stage: canary | v: 1.1, stage: canary |
| (none) | v: 1.0 | v: 1.0 |
| v: 1.0 | (none) | v: 1.0 |
#### 具有元數據主機的示例
具有主機元數據的EDS LbEndpoint:
```
---
endpoint:
address:
socket_address:
protocol: TCP
address: 127.0.0.1
port_value: 8888
metadata:
filter_metadata:
envoy.lb:
version: '1.0'
stage: 'prod'
```
#### 具有元數據路由的示例
具有元數據匹配的RDS路由標準:
```
---
match:
prefix: /
route:
cluster: cluster-name
metadata_match:
filter_metadata:
envoy.lb:
version: '1.0'
stage: 'prod'
```
### 返回
- [架構介紹](../Architectureoverview.md)
- [簡介](../../Introduction.md)
- [首頁目錄](../../README.md)
- 首頁
- 簡介
- Envoy是什么
- 架構介紹
- 術語
- 線程模型
- 監聽器
- L3/L4網絡過濾器
- HTTP連接管理
- HTTP過濾器
- HTTP路由
- gRPC
- WebSocket支持
- 集群管理
- 服務發現
- 健康檢查
- 連接池
- 負載均衡
- 異常檢測
- 熔斷
- 全局限速
- TLS
- 統計
- 運行時配置
- 跟蹤
- TCP代理
- 訪問日志
- MongoDB
- DynamoDB
- Redis
- 熱重啟
- 動態配置
- 初始化
- 逐出
- 腳本
- 部署
- 業界對比
- 獲得幫助
- 歷史版本
- 編譯安裝
- 編譯
- 參考配置
- 演示沙箱
- 前端代理
- Zipkin跟蹤
- Jaeger跟蹤
- gRPC橋接
- 構建Envoy Docker鏡像
- 工具
- 配置參考
- V1 API 概述
- V2 API 概述
- 監聽器
- 網絡過濾器
- TLS客戶端身份認證
- Echo
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP連接管理器
- 路由匹配
- 流量轉移/分流
- HTTP頭部操作
- HTTP頭部清理
- 統計
- 運行時設置
- 路由發現服務
- HTTP過濾器
- 緩存
- CORS過濾器
- 故障注入
- DynamoDB
- gRPC HTTP/1.1 橋接
- gRPC-JSON 轉碼過濾器
- gRPC-Web 過濾器
- 健康檢查
- 速率限制
- 路由
- Lua
- 集群管理
- 統計
- 運行時設置
- 集群發現服務
- 健康檢查
- 熔斷
- 訪問日志
- 限速服務
- 運行時配置
- 路由表檢查工具
- 運維管理
- 命令行選項
- 熱重啟
- 管理接口
- 統計概述
- 運行時配置
- 文件系統
- 自定義擴展示例
- V1 API參考
- 監聽器
- 網絡過濾器
- TLS客戶端身份認證
- Echo
- HTTP連接管理
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP路由配置
- 虛擬主機
- 路由
- 虛擬集群
- 速率限制配置
- 路由發現服務
- HTTP過濾器
- 緩存
- CORS過濾器
- DynamoDB
- 故障注入
- gRPC HTTP/1.1 橋接
- gRPC-JSON 轉碼過濾器
- gRPC-Web 過濾器
- 健康檢查
- Lua
- 速率限制
- 路由
- 集群管理
- 集群
- 健康檢查
- 熔斷
- TLS上下文
- 異常值檢測
- HASH環負載均衡配置
- 異常檢測
- 集群發現服務
- 服務發現服務
- 訪問日志
- 管理接口
- 限速服務
- 運行時配置
- 跟蹤
- V2 API參考
- 啟動引導
- 監聽&監聽發現
- 集群&集群發現
- 服務發現
- 健康檢查
- HTTP路由管理&發現
- TLS配置
- 通用的類型
- 網絡地址
- 協議選項
- 發現API
- 限速組件
- 過濾器
- 網絡過濾器
- TLS客戶端身份認證
- HTTP連接管理
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP過濾器
- 緩存
- 故障注入
- 健康檢查
- Lua
- 速率限制
- 路由
- gRPC-JSON轉碼器
- 常見訪問日志類型
- 常見故障注入類型
- FAQ
- Envoy有多快?
- 我在哪里獲得二進制文件?
- 我如何設置SNI?
- 如何設置區域感知路由?
- 我如何設置Zipkin跟蹤?