HAProxy能否基于健康检查切换后端,仅主后端故障时启用备用后端?
结论
可以实现,该场景属于典型的主备后端池调度需求,HAProxy原生支持该能力,常用实现方案有两种:
方案1:同后端池下标记备节点(适合节点规模较小的场景)
如果两个后端的节点可以放在同一个backend块内,直接给所有backend_2的节点加上backup属性即可:
backend app_backend # 主节点(归属backend_1) server be1_node1 192.168.1.10:80 check inter 2000 rise 2 fall 3 server be1_node2 192.168.1.11:80 check inter 2000 rise 2 fall 3 # 备节点(归属backend_2),全部添加backup标记 server be2_node1 192.168.2.10:80 check inter 2000 rise 2 fall 3 backup server be2_node2 192.168.2.11:80 check inter 2000 rise 2 fall 3 backup
该规则下,只要还有任意一个正常的非backup节点(也就是backend_1的节点),流量就只会分配给主节点;只有所有主节点健康检查全部失败后,才会自动切换到带backup标记的备节点对外提供服务。
方案2:独立后端池故障转移(适合两个后端需要独立配置的场景)
如果backend_1和backend_2本身是两个独立配置的后端池,可以通过nbsrv ACL规则判断主后端池的存活节点数量,实现流量切换:
frontend http_in bind *:80 # 定义ACL规则:当backend_1的存活节点数小于1时触发 acl be1_down nbsrv(backend_1) lt 1 # 满足ACL条件时使用backend_2,默认使用backend_1 use_backend backend_2 if be1_down default_backend backend_1 backend backend_1 # backend_1的独立配置,可自定义调度算法、健康检查规则等 balance roundrobin server be1_node1 192.168.1.10:80 check inter 2000 rise 2 fall 3 server be1_node2 192.168.1.11:80 check inter 2000 rise 2 fall 3 backend backend_2 # backend_2的独立配置 balance roundrobin server be2_node1 192.168.2.10:80 check inter 2000 rise 2 fall 3 server be2_node2 192.168.2.11:80 check inter 2000 rise 2 fall 3
nbsrv(<backend_name>)是HAProxy的内置变量,返回指定后端池中当前存活的节点数量,该方案灵活度更高,两个后端池可以完全独立配置不同的调度规则、健康检查逻辑、超时参数等。
补充说明
HAProxy默认会在检测到主后端节点恢复正常后,自动把流量切回主后端。如果需要避免主节点反复上下线导致流量抖动,可以给backup节点加non-stick参数,或者给主节点加on-marked-up shutdown-backup-sessions配置按需调整切回逻辑。
内容的提问来源于stack exchange,提问作者JDev
相关产品推荐
相关产品推荐

