跨多个 HAProxy 后端的加权路由

跨多个 HAProxy 后端的加权路由

我有两个独立的应用程序 A 和 B。每个应用程序通过使用加权路由在 HAProxy 后端注册的蓝/绿 AWS 负载均衡器使用蓝/绿部署。

我需要将流量路由到两个都根据权重将流量分配给应用程序(后端),例如将 90% 的流量路由到后端 A,将剩余的 10% 路由到后端 B。

是否可以在 HAproxy 中设置一个前端,以上述方式在多个后端之间分配流量?

我考虑将两个应用程序的所有 ALB 放在一个后端,但这会使每个应用程序的蓝/绿之间独立转移流量变得更加复杂。

另一种选择是为 A 后端和 B 后端设置内部 DNS,然后默认后端可以在其之间路由,但理想情况下,我会避免“退出” HAProxy 只是为了路由回来。

答案1

为了有选择地将相同的请求路由到不同的“后端”(由 HAProxy - 服务器组定义),您需要一些可以在前端为每个请求计算的标准 - 然后计算use_backend它何时为真(或为假,视情况而定)。

例如,rand()拿来返回一个随机整数(不是密码学意义上的随机,但对于这个目的来说足够随机)和mod()转换器返回模除的结果,所以如果我们希望大约 1:10 的请求进入后端bbb,其余的请求进入后端,aaa那么我们可以执行以下操作:

frontend main
    mode http
    ...
    use_backend bbb if { rand(),mod(10) -m int 0 }
    default_backend aaa

转换器(如)mod()的前面是其输入,因此的输出rand()是的第一个输入mod(),并将的输出mod()作为整数-m int与进行比较0。如果随机整数可以被 10 整除,则表达式为真并bbb使用后端。

bbb您可以通过在决定发送请求之前验证至少有一个健康的服务器来进一步改进这一点,方法是使用nbsrv()拿来确保健康服务器的数量bbb大于0。

use_backend bbb if { rand(),mod(10) -m int 0 } { nbsrv(bbb) gt 0 }

请注意,配置解析器要求每个行末尾的 except 之前和之后都有空格{}

相关内容