HAProxy 可以根据查找表选择后端吗?

HAProxy 可以根据查找表选择后端吗?

假设我有项目 A、B 和 C。我有两个后端服务器:server01 和 server02。

项目 A 可由 server01 处理,项目 B 和 C 可由 server02 处理。新项目和服务器被添加和删除,我们以编程方式更新文件、Redis、Memcache 或类似程序(无论代理支持什么)中项目 ID 和后端服务器之间的哈希表。

我可以创建一个前端,例如/items/${id},并让 HAProxy 根据路由到正确的后端服务器${id}吗?那么通过查找哪个 id 与哪个服务器相关联?

如果没有的话,Nginx 可以做到这一点吗?

答案1

您可以使用地图使其工作。

这完美地概括在邮政在 HAProxy.com 博客上。它们基于Host标头进行映射,但更改配置以适用于 URL 则很简单。

这里还有一个额外的好处,就是您可以使用http-[request|response] [set-map|del-map]关键字或通过管理套接字动态添加和删除映射条目。
使用或通过套接字所做的更改http-[request|response]不会在重新启动后保留,因此您需要一些带外进程来同时更新映射文件,但这是另一个问题。

假设每个服务器都有一个后端,并且给出了一个名为的地图文件,/etc/haproxy/items.map其内容如下:

#itemPath    backendname
/item/a      bk_server01
/item/b      bk_server02
/item/c      bk_server02

您可以在前端做类似这样的事情:

frontend ft_items
  [...]
  use_backend %[path,lower,map(/etc/haproxy/items.map,bk_default)]

如果您在同一个后端拥有两个服务器,您可以在前端编写一个 ACL 来捕获所有项目(acl items path_beg /items),将它们发送到后端(use_backend servers if items),并use_backend用后端中适当的 if 子句use_server行替换前端的行。

答案2

是的,您可以使用 HAProxy 轻松完成此操作。只需创建一个包含服务器所提供服务的 ID 列表的 ACL,并将其应用于 use-server 指令即可。例如:

acl server1-ids path_beg -i /items/id1 /istems/id2
use-server server1 if server1-ids

相关内容