恐慌阈值
在负载均衡期间,Envoy 通常只考虑上游集群中可用的(健康或降级的)主机。但是,如果集群中可用主机的百分比过低,Envoy 将忽略健康状况,并在所有主机或没有主机之间进行负载均衡。这被称为恐慌阈值。默认的恐慌阈值为 50%。这可以通过运行时以及在配置中进行配置。恐慌阈值用于避免主机故障随着负载增加而级联整个集群的情况。
Envoy 在恐慌状态下可以选择两种模式:流量将发送到所有主机,或者流量将发送到没有主机(因此将始终失败)。这在配置中进行配置。选择在恐慌情况下使流量失败可以帮助避免压倒可能失败的上游服务,因为它将在所有主机都被确定为不健康之前减少上游服务的负载。但是,它消除了即使上游集群中的许多或所有主机都不健康,也有一些请求能够成功的可能性。如果观察到给定服务以全有或全无的方式失败,这可能是一个很好的权衡,因为它将更快地切断对集群的请求。相反,如果一个集群通常在降级时继续成功地处理一些请求,那么启用此选项可能没有帮助。
恐慌阈值与优先级协同工作。如果给定优先级中的可用主机数量减少,Envoy 将尝试将一些流量转移到较低的优先级。如果它成功地在较低的优先级中找到足够的可用主机,Envoy 将忽略恐慌阈值。从数学角度来说,如果跨所有优先级级别的归一化总可用性为 100%,Envoy 会忽略恐慌阈值,并继续根据此处描述的算法跨优先级分配流量负载。但是,当归一化总可用性降至 100% 以下时,Envoy 会假设跨所有优先级级别没有足够的可用主机。它继续跨优先级分配流量负载,但是如果给定优先级级别的可用性低于恐慌阈值,则流量将发送到该优先级级别中的所有主机(或没有主机),而不管其可用性如何。
以下示例说明了归一化总可用性和恐慌阈值之间的关系。假设恐慌阈值使用默认值 50%。
假设一个简单的设置,包含 2 个优先级级别,P=1 100% 健康。在这种情况下,归一化总健康度始终为 100%,P=0 永远不会进入恐慌模式,Envoy 能够将尽可能多的流量转移到 P=1。
P=0 健康端点 |
|
P=0 处于恐慌状态 |
流量到 P=1 |
P=1 处于恐慌状态 |
归一化总健康度 |
---|---|---|---|---|---|
72% |
100% |
否 |
0% |
否 |
100% |
71% |
99% |
否 |
1% |
否 |
100% |
50% |
70% |
否 |
30% |
否 |
100% |
25% |
35% |
否 |
65% |
否 |
100% |
0% |
0% |
否 |
100% |
否 |
100% |
如果 P=1 变为不健康,恐慌阈值将继续被忽略,直到 P=0 + P=1 的健康度之和降至 100% 以下。此时,Envoy 开始检查每个优先级级别的恐慌阈值。
P=0 健康端点 |
P=1 健康端点 |
流量到 P=0 |
P=0 处于恐慌状态 |
流量到 P=1 |
P=1 处于恐慌状态 |
归一化总健康度 |
---|---|---|---|---|---|---|
72% |
72% |
100% |
否 |
0% |
否 |
100% |
71% |
71% |
99% |
否 |
1% |
否 |
100% |
50% |
60% |
70% |
否 |
30% |
否 |
100% |
25% |
100% |
35% |
否 |
65% |
否 |
100% |
25% |
25% |
50% |
是 |
50% |
是 |
70% |
5% |
65% |
7% |
是 |
93% |
否 |
98% |
可以通过将恐慌阈值设置为 0% 来禁用恐慌模式。
只要存在没有处于恐慌模式的优先级级别,就会根据上述方法计算负载分配。当所有优先级级别都进入恐慌模式时,负载计算算法会发生变化。在这种情况下,每个优先级级别接收的流量与其在所有优先级级别中主机的数量成正比。例如,如果有 2 个优先级 P=0 和 P=1,并且每个优先级都包含 5 个主机,那么每个级别将接收 50% 的流量。如果有 2 个主机在优先级 P=0 中,而 8 个主机在优先级 P=1 中,那么优先级 P=0 将接收 20% 的流量,而优先级 P=1 将接收 80% 的流量。
但是,如果任何优先级的恐慌阈值为 0%,则该优先级永远不会进入恐慌模式。在这种情况下,如果所有主机都不健康,Envoy 将无法选择主机,而是会立即返回带有“503 - 没有健康的上游”的错误响应。
请注意,恐慌阈值可以按优先级进行配置。