侧边栏壁纸
  • 累计撰写 28 篇文章
  • 累计创建 23 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Envoy 集群管理 位置加权负载均衡

zhanjie.me
2025-09-17 / 0 评论 / 0 点赞 / 3 阅读 / 0 字

一、位置加权负载均衡介绍

集群位置加权负载均衡(Weighted Load Balancing)

集群位置加权负载均衡是一种高级的负载均衡策略,它允许你根据地理位置、网络延迟或可用性区域等因素,为不同的上游集群分配不同的流量权重。这与传统的简单加权负载均衡(将权重分配给集群内的单个节点)不同,它是在集群级别进行流量分配。

这种策略的核心思想是:在拥有多个服务集群(通常分布在不同的数据中心或云区域)时,我们希望将大部分流量路由到离用户最近延迟最低成本最低的集群,同时保留其他集群作为备份或次要流量源。

为什么需要它?

想象一下你的服务部署在全球多个区域:一个在美国东部,一个在欧洲,另一个在亚洲。一个来自中国的用户请求你的服务时,如果你将请求路由到美国的服务器,会产生很高的网络延迟。理想情况下,你应该将请求发送到亚洲的集群。

通过集群位置加权负载均衡,你可以实现这个目标:

  • 流量本地化:你可以配置 Envoy,让它优先将请求发送到与客户端地理位置相近的集群。
  • 区域冗余:将一个主区域设置为 100% 的权重,而将次要区域设置为较低的权重(例如 10%),以备主区域故障时使用。
  • 成本优化:如果某些区域的流量成本更高,你可以降低其权重,从而将大部分流量引导到成本较低的区域。

如何工作?

配置示例

以下是一个具体的配置示例,展示了如何在Envoy中设置集群位置加权负载均衡:

static_resources:
  clusters:
  - name: weighted_service
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN  # 选择基本的负载均衡策略
    load_assignment:
      cluster_name: weighted_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service1.example.com
                port_value: 80
          load_balancing_weight:
            value: 80  # 权重80
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service2.example.com
                port_value: 80
          load_balancing_weight:
            value: 20  # 权重20
配置项解释
  • lb_policy:指定基本的负载均衡策略,这里使用 ROUND_ROBIN。
  • lb_endpoints:定义上游服务的节点。
  • load_balancing_weight:设置节点的负载均衡权重,数值越大,分配的流量越多。

总结

集群位置加权负载均衡是一种强大的流量管理工具,它通过将负载均衡的粒度从单个节点提升到整个集群,帮助你在多区域、多集群的环境中实现以下目标:

  • 优化性能:减少网络延迟,提升用户体验。
  • 提高可用性:通过在不同集群间智能分配流量,增强系统的容错能力。
  • 精细化控制:根据业务需求、成本和地理位置,精确控制流量走向。

这是一种将业务需求和网络拓扑紧密结合的高级负载均衡策略,对于需要处理全球或跨区域流量的复杂系统来说至关重要。


二、位置加权负载均衡机制

位置加权负载均衡(Locality weighted load balancing) 的确是为特定的Locality及其相关的LbEndpoints分配权重,并根据这些权重在各Locality之间分配流量。以下是更详细的解释:

  1. 定义权重:为每个Locality及其相关的LbEndpoints显式赋予权重。
  2. 流量分配:在所有Locality的所有Endpoint都处于健康状态时,根据位置权重在各Locality之间进行加权轮询。

例如:

  • 假设有两个region:cn-north-1和cn-north-2,它们的权重分别为1和2。
  • 如果这两个region内的所有端点均处于健康状态,那么流量将根据权重进行分配。
  • 在这个例子中,cn-north-1将接收33%的流量,而cn-north-2将接收67%的流量(比例为1:2)。
启用位置加权负载均衡及位置权重定义的方法
cluster:
- name: ...
load assignment:
endpoints:
  locality:" {....}"
  Ib_endpoints":[]
  load_balancing_weight:“{}”# 整数值,定义当前位置或优先级的权重,最小值为1;
  priority:"..."

当某Locality的某些Endpoint不可用时,Envov则按比例动态调整该Locality的权重

当某个Locality(位置)的某些Endpoint(端点)不可用时,Envoy会按比例动态调整该Locality的权重。

位置加权负载均衡还支持为LbEndpoint(负载均衡端点)配置超配因子(默认为1.4)。Locality(位置)X的有效权重计算方式如下:

  1. 健康比例计算:
    健康比例的计算公式是: health(L_X) = 140 * (健康的X端点数量 / X端点的总数量)
    这里,健康比例 = 超配因子 × 健康节点数 / 总节点数。
  2. 有效权重计算:
    有效权重的计算公式是:effective weight(L_X) = locality_weight_X * min(100, health(L_X))
    这里,有效权重 = 位置权重 × (100或健康比例,取较小值)。
  3. 流量分配计算:
    流量分配的计算公式是:load to L_X = effective weight(L_X) / (所有位置的有效权重之和)
    这里,可调度的位置 = 有效权重 / 总权重。
举个例子

假设我们有两个集群,一个集群有2个节点,另一个集群有3个节点,初始权重比为1:2。如果3节点的集群中有1个节点出现故障,健康节点比例为2/3。使用超配因子1.4来计算:

  1. 健康比例
    health(L_Y) = 1.4 * (2 / 3) ≈ 0.93 或 93%
  2. 有效权重
    effective weight(L_Y) = locality_weight_Y * 0.93
    如果初始权重是2,那么有效权重就是2 * 0.93 = 1.86。
  3. 流量分配
    load to L_Y = 1.86 / (1 + 1.86) ≈ 65%
    load to L_X = 1 / (1 + 1.86) ≈ 35%

所以,原本流量分配比例是1:2(33%:67%),但由于Y集群有一个节点故障,现在的比例调整为35%:65%。

动态调整权重的例子

假设位置X集群和Y集群的初始权重分别为1和2。如果Y集群的健康端点比例只有50%,则其健康比例计算为:

  1. 健康比例
    health(L_Y) = 1.4 * 0.5 = 0.7 或 70%
  2. 有效权重
    effective weight(L_Y) = 2 * 0.7 = 1.4
  3. 流量分配
    load to L_Y = 1.4 / (1 + 1.4) ≈ 58%
    load to L_X = 1 / (1 + 1.4) ≈ 42%

流量分配比例从1:2(33%:67%)变为1:1.4(42%:58%)。

配置优先级和权重

如果同时配置了优先级和权重,负载均衡器将按照以下步骤进行调度选择:

  1. 选择优先级。
  2. 从选出的优先级中选择Locality。
  3. 从选出的Locality中选择Endpoint。

这样确保流量优先分配到更高优先级、健康的节点上。
image-fazerlrf.png

0

评论区