负载均衡

负载均衡是一种在单个上游集群的多个端点之间分配流量的方式。在众多端点之间分配流量的原因是为了最好地利用可用资源。

为了实现资源的最有效利用,Envoy 提供了不同的负载均衡策略,可以分为两组:全局负载均衡分布式负载均衡。不同的是,在全局负载均衡中,我们使用单一的控制平面来决定端点之间的流量分配。Envoy 决定负载如何分配(例如,使用主动健康检查、分区感知路由、负载均衡策略)。

在多个端点之间分配负载的技术之一是一致性哈希。服务器使用请求的一部分来创建一个哈希值来选择一个端点。在模数散列中,哈希值被认为是一个巨大的数字。为了得到发送请求的端点索引,我们将哈希值与可用端点的数量取余数(index=hash % endpointCount)。如果端点的数量是稳定的,这种方法效果很好。然而,如果端点被添加或删除(即它们不健康,我们扩大或缩小它们的规模,等等),大多数请求将在一个与以前不同的端点上结束。

一致性哈希是一种方法,每个端点根据某些属性被分配多个有价值的值。然后,每个请求被分配到具有最接近哈希值的端点。这种方法的价值在于,当我们添加或删除端点时,大多数请求最终会被分配到与之前相同的端点。拥有这种 "粘性" 是有帮助的,因为它不会干扰端点持有的任何缓存。

负载均衡策略

Envoy 使用其中一个负载均衡策略来选择一个端点发送流量。负载均衡策略是可配置的,可以为每个上游集群分别指定。请注意,负载均衡只在健康的端点上执行。如果没有定义主动或被动的健康检查,则假定所有端点都是健康的。

我们可以使用 lb_policy 字段和其他针对所选策略的字段来配置负载均衡策略。

加权轮询(默认)

加权轮询(ROUND_ROBIN)以轮询顺序选择端点。如果端点是加权的,那么就会使用加权的轮询顺序。这个策略给我们提供了一个可预测的请求在所有端点的分布。权重较高的端点将在轮转中出现得更频繁,以实现有效的加权。

加权的最小请求

加权最小请求(LEAST_REQUEST)算法取决于分配给端点的权重。

如果所有的端点权重相等,算法会随机选择 N 个可用的端点(choice_count),并挑选出活动请求最少的一个。

如果端点的权重不相等,该算法就会转入一种模式,即使用加权的循环计划,其中的权重是根据选择时端点的请求负荷动态调整。

以下公式用于动态计算权重。

weight = load_balancing_weight / (active_requests + 1)^active_request_bias

active_request_bias 是可配置的(默认为 1.0)。主动请求偏差越大,主动请求就越积极地降低有效权重。

如果 active_request_bias 被设置为 0,那么算法的行为就像轮询一样,在挑选时忽略了活动请求数。

我们可以使用 least_request_lb_config 字段来设置加权最小请求的可选配置。

...
  lb_policy: LEAST_REQUEST
  least_request_lb_config:
    choice_count: 5
    active_request_bias: 0.5
...

环形哈希

环形哈希(或模数散列)算法(RING_HASH)实现了对端点的一致性哈希。每个端点地址(默认设置)都被散列并映射到一个环上。Envoy 通过散列一些请求属性,并在环上顺时针找到最近的对应端点,将请求路由到一个端点。哈希键默认为端点地址;然而,它可以使用 hash_key 字段改变为任何其他属性。

我们可以通过指定最小(minimum_ring_size)和最大(maximum_ring_size)的环形哈希算法,并使用统计量(min_hashes_per_hostmax_hashes_per_host)来确保良好的分布。环越大,请求的分布就越能反映出所需的权重。最小环大小默认为 1024 个条目(限制在 8M 个条目),而最大环大小默认为 8M(限制在 8M)。

我们可以使用 ring_hash_lb_config 字段设置环形哈希的可选配置。

...
  lb_policy: RING_HASH
  ring_hash_lb_config:
    minimum_ring_size: 2000
    maximum_ring_size: 10000
...

Maglev

与环形哈希算法一样,maglev(MAGLEV)算法也实现了对端点的一致性哈希。该算法产生一个查找表,允许在一个恒定的时间内找到一个项目。Maglev 的设计是为了比环形哈希算法的查找速度更快,并且使用更少的内存。你可以在下面这篇文章中阅读更多关于它的内容 Maglev: A Fast and Reliable Software Network Load Balancer

我们可以使用 maglev_lb_config 字段来设置 maglev 算法的可选配置。

...
  lb_policy: MAGLEV
  maglev_lb_config:
    table_size: 69997
...

默认的表大小是 65537,但它可以被设置为任何素数,只要它不大于 5000011。

原始目的地

原始目的地(ORIGINAL_DESTINATION)是一个特殊用途的负载均衡器,只能与原始目的地集群一起使用。我们在谈到原始目的地集群类型时已经提到了原始目的地负载均衡器。

随机

顾名思义,随机(RANDOM)算法会挑选一个可用的随机端点。如果你没有配置主动健康检查策略,随机算法的表现比轮询算法更好。

results matching ""

    No results matching ""