聚合叢集

聚合叢集用於不同配置的叢集之間的故障轉移,例如,從 EDS 上游叢集到 STRICT_DNS 上游叢集,從使用 ROUND_ROBIN 負載平衡策略的叢集到使用 MAGLEV 的叢集,從連線逾時為 0.1 秒的叢集到連線逾時為 1 秒的叢集等等。聚合叢集透過在 設定 中引用其名稱來鬆散耦合多個叢集。後備優先順序由 叢集列表 中的順序隱含定義。聚合叢集使用分層負載平衡。負載平衡器首先選擇叢集和優先順序,然後將負載平衡委派給所選叢集的負載平衡器。頂層負載平衡器透過將多個叢集的優先順序集合線性化為一個來重複使用現有的負載平衡演算法。

線性化優先順序集合

上游主機會被分成多個優先順序層級,且每個優先順序層級包含健康、降級和不健康的主機列表。線性化用於透過合併多個叢集的優先順序層級來簡化負載平衡期間的主機選擇。例如,主要叢集有 3 個優先順序層級,次要叢集有 2 個,而第三個叢集有 2 個,而故障轉移順序是主要、次要、第三個。

叢集

優先順序層級

線性化後的優先順序層級

主要

0

0

主要

1

1

主要

2

2

次要

0

3

次要

1

4

第三個

0

5

第三個

1

6

範例

一個聚合叢集配置的範例可能是

name: aggregate_cluster
connect_timeout: 0.25s
lb_policy: CLUSTER_PROVIDED
cluster_type:
  name: envoy.clusters.aggregate
  typed_config:
    "@type": type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig
    clusters:
    # cluster primary, secondary and tertiary should be defined outside.
    - primary
    - secondary
    - tertiary

注意:PriorityLoad 重試外掛程式不適用於聚合叢集,因為聚合負載平衡器會在負載平衡期間覆蓋 *PriorityLoad*。

負載平衡範例

聚合叢集使用分層負載平衡演算法,頂層根據每個叢集中所有優先順序的健康分數將流量分配到不同的叢集。本節中的聚合叢集包含兩個叢集,這與上述配置描述的不同。

叢集

到主要的流量

到次要的流量

主要

次要

P=0 健康端點

P=1 健康端點

P=2 健康端點

P=0 健康端點

P=1 健康端點

100%

100%

100%

100%

100%

100%

0%

72%

100%

100%

100%

100%

100%

0%

71%

1%

0%

100%

100%

100%

0%

71%

0%

0%

100%

100%

99%

1%

50%

0%

0%

50%

0%

70%

30%

20%

20%

10%

25%

25%

70%

30%

20%

0%

0%

20%

0%

50%

50%

0%

0%

0%

100%

0%

0%

100%

0%

0%

0%

72%

0%

0%

100%

注意:上述負載平衡使用預設的超額配置係數,為 1.4,這表示如果優先順序層級中有 80% 的端點是健康的,則該層級仍然被認為是完全健康的,因為 80 * 1.4 > 100。

該範例顯示了聚合叢集層級負載平衡器如何選擇叢集。例如,{{20, 20, 10}, {25, 25}} 的健康狀況將導致 {{28%, 28%, 14%}, {30%, 0%}} 的優先順序負載。當標準化總體健康狀況降至 100 以下時,流量會在將各層級的健康分數標準化為該低於 100 的總數後進行分配。例如,{{20, 0, 0}, {20, 0}} 的健康狀況(產生 56 的標準化總體健康狀況)將被標準化,並且每個叢集將接收 20 * 1.4 / 56 = 50% 的流量,這導致 {{50%, 0%, 0%}, {50%, 0%, 0%}} 的優先順序負載。

負載平衡器重複使用優先順序層級邏輯來協助叢集選擇。優先順序層級邏輯使用整數健康分數。一個層級的健康分數為(層級中健康主機的百分比)*(超額配置係數),上限為 100%。P=0 端點接收層級 0 健康分數百分比的流量,其餘流量流向 P=1(假設 P=1 為 100% 健康 - 稍後會詳細說明)。每個叢集接收的整數流量百分比統稱為系統的「叢集優先順序負載」。例如,對於主要叢集,當 20% 的 P=0 端點是健康的、20% 的 P=1 端點是健康的,以及 10% 的 P=2 端點是健康的時候;對於次要叢集,當 25% 的 P=0 端點是健康且 25% 的 P=1 端點是健康的時候。主要叢集將接收 20% * 1.4 + 20% * 1.4 + 10% * 1.4 = 70% 的流量。次要叢集將接收 min(100 - 70, 25% * 1.4 + 25% * 1.4) = 30% 的流量。所有叢集的流量總和達到 100。在選擇叢集和優先順序之前,會預先計算標準化的健康分數和優先順序負載。

為了總結,以虛擬演算法表示

health(P_X) = min(100, 1.4 * 100 * healthy_P_X_backends / total_P_X_backends), where
                total_P_X_backends is the number of backends for priority P_X after linearization
normalized_total_health = min(100, Σ(health(P_0)...health(P_X)))
cluster_priority_load(C_0) = min(100, Σ(health(P_0)...health(P_k)) * 100 / normalized_total_health),
                where P_0...P_k belong to C_0
cluster_priority_load(C_X) = min(100 - Σ(priority_load(C_0)..priority_load(C_X-1)),
                         Σ(health(P_x)...health(P_X)) * 100 / normalized_total_health),
                         where P_x...P_X belong to C_X
map from priorities to clusters:
  P_0 ... P_k ... ...P_x ... P_X
  ^       ^          ^       ^
  cluster C_0        cluster C_X

第二層將負載平衡委派給第一步中選擇的叢集,並且叢集可以使用 負載平衡器類型指定的任何負載平衡演算法。