假设我有项目A,B和C.我有两个后端服务器:server01和server02。
项目A可以由server01处理,项目B和C可以由server02处理。 新项目和服务器被添加和删除,并且我们以文件,Redis,Memcache或类似的方式(无论代理会支持什么)以编程方式更新项目ID和后端服务器之间的哈希表。
我可以创build一个前端,如/items/${id} ,并根据/items/${id}具有HAProxy路由到正确的后端服务器吗? 那么通过查找什么id与什么服务器相关联?
如果没有,Nginx能做到这一点吗?
是的,你可以用HAProxy轻松做到这一点。 只需使用服务器提供的ID列表创buildACL,并将其应用于使用服务器指令。 IE:
acl server1-ids path_beg -i /items/id1 /istems/id2 use-server server1 if server1-ids
您可以使用地图来使其工作。
这在HAProxy.com博客上的一篇文章中有完美概述。 它们是基于Host头进行映射的,但将configuration更改为URL工作并不重要。
这里有一个额外的好处,就是你可以使用http-[request|response] [set-map|del-map]关键字或通过pipe理套接字dynamic地添加和删除映射条目。
使用http-[request|response]或通过套接字所做的更改在重新启动之间不会持续,所以您希望有一些带外进程同时更新映射文件,但这是另一个问题。
假设每个服务器都有一个后端,并给出一个名为/etc/haproxy/items.map的映射文件, /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 ),并replaceuse_backend行从前端用适当的if- use_server后端use_server行。