【问题标题】:HAProxy dynamic server addressesHAProxy 动态服务器地址
【发布时间】:2017-03-23 08:29:43
【问题描述】:

我们有与此图类似的设置

当请求到达 HAProxy 时,它会与任何服务器进行循环平衡,后端服务器检查其缓存,如果资源不在该服务器上,它会发出重定向,并将标头设置为正确的服务器 IP。

第二次请求到达HAProxy,它检测到带有后端服务器的标头在那里,但是我怎样才能获取该IP并将请求直接发送给它?

例如,第二次请求到达 haproxy,它的 header X-BACKEND-IP=10.0.0.5

因此,haproxy 尝试对请求进行负载平衡,我希望它读取标头,获取该 IP 并直接转到该后端。

这可能吗?如果没有,用 nginx 可以吗?

【问题讨论】:

  • 所以您的原始行为是:1)HAProxy 接收到原始 HTTP 请求 -> 2)检测到请求的资源不可用 -> 3)转发带有附加 HTTP 标头字段的原始请求 @ 987654325@自身有可用服务器 -> 4) 检测到请求的资源可用 -> 5) 向资源发送请求。您的目标是消除第 3 步和第 4 步?
  • @LiamKelly 并非如此,HAProxy 没有设置标头,也没有重定向。这一切都由后端服务本身完成。 1)HAPRoxy 接收请求 -> 2)“盲目地”将其轮询到任何后端的下一行 -> 3)后端服务本身决定它是否可以服务该请求或它应该去哪个其他后端。如果它决定它应该去其他地方,它会设置X-BACKEND-IP 标头并重定向回 haproxy(到目前为止一切正常)-> 4)HAProxy 将采用该标头并直接从标头路由到 IP
  • 如果我理解正确的话,后端服务直接将请求发送到最终服务器似乎是最有效的。第一个后端服务知道请求应该去哪里,那么为什么要负担 HAProxy 呢?如果两台后端服务器不能直接路由,可以放一个ip-forwarding规则(OSI Layer 3,不是请求代理规则),仍然使用HAProxy机器作为中心路由点。
  • 寻找粘性会话? blog.haproxy.com/2012/03/29/…
  • @DmitryMiksIr 不幸的是,在这种情况下,粘性会话将不起作用

标签: networking nginx load-balancing haproxy


【解决方案1】:

假设您对信任第二个请求标头中的 IP 感到满意,那么是的,您可以使用 use-server

backend bk_foo
  [...]
  server srv_0a_00_01_05 10.0.1.5:80 weight 100
  server srv_0a_00_02_05 10.0.2.5:80 weight 100
  use-server %[req.hdr(x-backend-ip),lower,map_str(/etc/haproxy/hdr2srv.map,srv_any)] if { req.hdr(x-backend-ip),lower,map_str(/etc/haproxy/hdr2srv.map) -m found }

/etc/haproxy/hdr2srv.map的内容:

#ip srv_name
# hex of IP used for names in this example
10.0.1.5  srv_0a_00_01_05
10.0.2.5  srv_0a_00_02_05

如果您需要关闭其中一台服务器,则应动态更新映射以将其删除,以便重新重定向带有标头集的请求。

如果您有多个后端,您可以使用use_backend 进行类似操作。

【讨论】:

  • 是的 use-server 正是我想要的。最后我很遗憾不会使用它,但它是我问题的正确答案
  • 实际上.. 当我将您的答案中的代码放入 haproxy config 时,它会给出错误unable to find server '%[req.hdr(x-backend-address),lower,map_str(/etc/haproxy/hdr2srv.map,srv_any)]' referenced in a 'use-server' rule.
  • @Tom 您使用的是什么版本的 HAProxy?我会在这里尝试复制这个问题。我知道我之前用use_backend 部署过。
  • 使用1.6.3,是的use_backend 有效,但我更愿意让user-server 有效
  • 嗯,你是对的,正在挖掘代码库。目前use-server 不会像use_backend 那样扩展日志格式字符串。戳一下 haproxy 邮件列表,它应该很容易实现,但可能仅限于 1.7 或 1.8 系列以避免旧代码库的重大更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 2016-09-11
相关资源
最近更新 更多