Envoy架构概览(5):负载均衡

2020-05-25 00:00:00 负载 路由 主机 群集 子集



负载均衡

当过滤器需要获取到上游群集中主机的连接时,群集管理器使用负载平衡策略来确定选择哪个主机。 负载平衡策略是可插入的,并且在配置中以每个上游集群为基础进行指定。 请注意,如果没有为群集配置活动的运行状况检查策略,则所有上游群集成员都认为是正常的。

支持的负载平衡器


循环赛(Round robin)

这是一个简单的策略,每个健康的上游主机按循环顺序选择。


加权低要求

请求少的负载均衡器使用O(1)算法来选择两个随机健康主机,并挑选出活动请求较少的主机。 (研究表明,这种方法几乎与O(N)全扫描一样好)。如果群集中的任何主机的负载均衡权重大于1,则负载均衡器将转换为随机选择主机,然后使用该主机<权重>次的模式。这个算法对于负载测试来说简单而充分。在需要真正的加权小请求行为的情况下(通常如果请求持续时间可变且长度较长),不应使用它。我们可能会在将来添加一个真正的全扫描加权小请求变体来覆盖这个用例。


环哈希

环/模哈希负载平衡器对上游主机执行一致的哈希。该算法基于将所有主机映射到一个圆上,使得从主机集添加或移除主机的更改仅影响1 / N个请求。这种技术通常也被称为“ketama”哈希。一致的散列负载均衡器只有在使用指定要散列的值的协议路由时才有效。目前实现的机制是通过HTTP路由器过滤器中的HTTP头值进行散列。默认的小铃声大小是在运行时指定的。小环大小控制环中每个主机的复制因子。例如,如果小环大小为1024,并且有16个主机,则每个主机将被复制64次。环哈希负载平衡器当前不支持加权。


当使用基于优先级的负载均衡时,优先级也由散列选择,所以当后端集合稳定时,选定的端点仍然是一致的。


随机

随机负载均衡器选择一个随机的健康主机。如果没有配置健康检查策略,那么随机负载均衡器通常比循环更好。随机选择可以避免在发生故障的主机之后对集合中的主机造成偏见。


原始目的地

这是一个特殊用途的负载平衡器,只能与原始目标群集一起使用。上游主机是基于下游连接元数据选择的,即,连接被打开到与连接被重定向到特使之前传入连接的目的地地址相同的地址。新的目的地由负载均衡器按需添加到集群,并且集群定期清除集群中未使用的主机。原始目标群集不能使用其他负载平衡类型。

恐慌阈值

在负载均衡期间,Envoy通常只考虑上游群集中的健康主机。但是,如果集群中健康主机的比例过低,特使就会忽视所有主机的健康状况和平衡。这被称为恐慌阈值。默认的恐慌阈值是50%。这可以通过运行时配置。恐慌阈值用于避免主机故障在负载增加时在整个集群联的情况。


优先级

在负载均衡期间,Envoy通常只考虑配置在高优先级的主机。对于每个EDS LocalityLbEndpoints,还可以指定一个可选的优先级。当高优先级(P = 0)的端点健康时,所有的流量都将落在该优先级的端点上。由于高优先级的端点变得不健康,交通将开始慢慢降低优先级。


目前,假定每个优先级级别由1.4的(硬编码)因子过度配置。因此,如果80%的终点是健康的,那么优先级依然被认为是健康的,因为80 * 1.4> 100。随着健康终点的数量下降到72%以下,优先级的健康状况低于100。的流量相当于P = 0的健康状态将进入P = 0,剩余的流量将流向P = 1。


假设一个简单的设置有2个优先级,P = 1 100%健康

P=0 healthy endpointsPercent of traffic to P=0Percent of traffic to P=10%72%0%71%99%1%50%70%30%25%35%65%0%0%


如果P = 1变得不健康,它将继续从P = 0接受溢出负荷,直到健康P = 0 + P = 1的总和低于100为止。此时,健康将被放大到“有效”健康 的100%。

P=0 healthy endpointsP=1 healthy endpointsTraffic to P=0Traffic to P=10%72%72%0%71%71%99%1%50%50%70%30%25%35%65%25%25%50%50%


随着更多的优先级被添加,每个级别消耗等于其“缩放”有效健康的负载,因此如果P = 0 + P = 1的组合健康小于100,则P = 2将仅接收业务。

P=0 healthy endpointsP=1 healthy endpointsP=2 healthy endpointsTraffic to P=0Traffic to P=1Traffic to P=20%0%72%72%0%0%71%71%99%1%0%50%50%70%30%0%25%35%65%0%25%25%25%25%50%

用伪算法来总结这一点:

load to P_0 = min(100, health(P_0) * 100 / total_health)
health(P_X) = 140 * healthy_P_X_backends / total_P_X_backends
total_health = min(100, Σ(health(P_0)...health(P_X))

load to P_X = 100 - Σ(percent_load(P_0)..percent_load(P_X-1))

相关文章