假设我有项目 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