优先级

在负载均衡期间,Envoy 通常只考虑配置在最高优先级级别的主机。对于每个 EDS LocalityLbEndpoints,也可以指定可选的优先级。当最高优先级级别的端点(P=0)处于健康状态时,所有流量都将落在该优先级级别的端点上。随着最高优先级级别的端点变得不健康,流量将开始逐渐流向较低优先级级别。

该系统可以使用可配置的 超配因子 进行超配,该因子当前默认为 1.4(本文档将假定该值)。如果一个优先级级别中的 80% 的端点处于健康状态,则该级别仍被视为完全健康,因为 80*1.4 > 100。因此,级别 0 端点将继续接收所有流量,直到它们中不到 ~71.4% 处于健康状态。

优先级级别逻辑使用整数健康分数。一个级别的健康分数为(该级别中健康主机的百分比)*(超配因子),上限为 100%。P=0 端点接收(级别 0 的健康分数)百分比的流量,其余流量流向 P=1(假设 P=1 是 100% 健康 - 稍后将详细介绍)。例如,当 50% 的 P=0 端点处于健康状态时,它们将接收 50 * 1.4 = 70% 的流量。每个优先级级别接收的流量的整数百分比统称为系统的“优先级负载”。更多示例(具有 2 个优先级级别,P=1 100% 健康)

P=0 健康端点

流向 P=0 的流量

流向 P=1 的流量

100%

100%

0%

72%

100%

0%

71%

99%

1%

50%

70%

30%

25%

35%

65%

0%

0%

100%

注意

为了使负载分配算法和归一化总健康计算正常工作,每个优先级级别必须能够处理(100% * 超配因子)的流量:Envoy 假设一个 100% 健康的 P=1 可以完全接管一个不健康的 P=0 等。如果 P=0 有 10 个主机,而 P=1 只有 2 个主机,则该假设可能不成立。

健康分数表示一个级别当前处理流量的能力,它考虑了该级别最初超配的程度以及当前有多少端点处于不健康状态。因此,如果所有级别健康分数的总和 < 100,则 Envoy 认为没有足够的健康端点来完全处理流量。该总和称为“归一化总健康”。当归一化总健康降至 100 以下时,流量在将级别的健康分数归一化为该低于 100 的总和后进行分配。例如,{20, 30} 的健康值(产生 50 的归一化总健康)将被归一化,并导致 {40%, 60%} 的优先级负载。

P=0 健康端点

P=1 健康端点

流向 P=0 的流量

流向 P=1 的流量

100%

100%

100%

0%

72%

72%

100%

0%

71%

71%

99%

1%

50%

50%

70%

30%

25%

100%

35%

65%

25%

25%

50%

50%

随着更多优先级的添加,每个级别消耗与其归一化有效健康相等的负载,除非高于它的级别的健康值之和达到 100%,在这种情况下它不会接收任何负载。

P=0 健康端点

P=1 健康端点

P=2 健康端点

流向 P=0 的流量

流向 P=1 的流量

流向 P=2 的流量

100%

100%

100%

100%

0%

0%

72%

72%

100%

100%

0%

0%

71%

71%

100%

99%

1%

0%

50%

50%

100%

70%

30%

0%

25%

100%

100%

35%

65%

0%

25%

25%

100%

35%

35%

30%

25%

25%

20%

36%

36%

28%

总结为伪算法

health(P_X) = min(100, 1.4 * 100 * healthy_P_X_backends / total_P_X_backends)
normalized_total_health = min(100, Σ(health(P_0)...health(P_X)))
priority_load(P_0) = health(P_0) * 100 / normalized_total_health
priority_load(P_X) = min(100 - Σ(priority_load(P_0)..priority_load(P_X-1)),
                         health(P_X) * 100 / normalized_total_health)

注意:本节讨论了健康优先级,但这也可以扩展到 降级优先级