在 HAProxy 中,我可以根据健康检查切换后端吗?

In HAProxy, Can I switch backends on the basis of health checks?

假设我们有两个后端 backend_1 和 backend_2。

我需要始终将流量转移到 backend_1 并仅在 backend_1 服务器健康检查失败时才使用 backend_2。

在 HAProxy 中可以吗?

在haproxy关键字中backend是一组服务器。所以解决方案取决于你的需要。
如果您指的是一般意义上的 backend,作为服务器,那么 backup 关键字就是答案:

frontend foo
  bind *:80
  default_backend bar

backend bar
  option allbackups
  server bar1 10.0.0.1:80 check
  server bar2 10.0.0.2:80 check
  server bar3 10.0.1.1:80 check backup
  server bar4 10.0.1.2:80 check backup

我向后端添加了 4 个服务器和选项 allbackups 以使其行为类似于下一个示例。

如果您将 haproxy 意义上的 backend 表示为服务器组,那么 nbsrv 将很有用:

frontend front
  bind *:80
  acl is_foo_alive nbsrv(foo) -m int gt 0
  use_backend foo if is_foo_alive
  use_backend bar

backend foo
  server foo1 10.0.0.1:80 check
  server foo2 10.0.0.2:80 check

backend bar
  server bar1 10.0.1.1:80 check
  server bar2 10.0.1.2:80 check

nbsrc(foo) 告诉我们后端 foo 中有多少台服务器在运行,所以如果我们得到的多于 0,那么我们使用后端 foo。如果不是,我们使用下一个规则,即 use_backend bar.

这些解决方案相似,但可能会有所不同,具体取决于后端的不同(例如 HTTP headers 的操作、HTTP 身份验证等)以及您是否使用 session 粘性。