我们使用 HAProxy 来平衡我们的 websocket 和 comet 应用程序的负载。后台运行着一个 HAProxy 和 3 个应用程序。我们使用 HTTP Basic Auth(将来我们会使用其他类型的身份验证,例如 OAuth)来识别已连接的用户。
我们不能使用常规的循环,因为对于给定用户来说,连接最终会到达同一台服务器非常重要。连接在哪里并不重要,但重要的是他们使用同一台服务器。
我知道 HAProxy 是一种基于智能 cookie 的方法,但不幸的是,在我们的案例中,有时同一个用户会从不同的机器连接,因此 cookie 不起作用)。
是否可以使用 HTTP 授权标头的哈希值来进行负载平衡?此外,这更复杂,是否可以定义我们自己的哈希方法?
后续问题(在 Willy 回答之后):
既然可以做到balance hdr(Authorization)
,那么可以做到吗仅有的在登录字段上(解析之后)?
另外,确切的算法是什么?我相信它的形式是hash(Authorization) % number_of_backend_server
,但是,哈希函数是什么,更重要的是,它可以调整吗?(或者我可以添加偏移量)。
我之所以询问,是因为这个应用程序实际上保持 XMPP 组件连接处于打开状态,而我需要负载平衡 XMPP 组件使用相同的算法。XMPPto
节中的 jid 由 HTTP 标头授权决定。
答案1
是的,您可以很好地散列您选择的任何标头。只需使用“balance hdr(header_name)”。我必须说我从来没有想过这样做。在某些环境中,它确实非常有用。如果这有帮助,您还可以对 URL 参数或 POST 参数进行散列。
但是您无法定义哈希方法。您可以选择哈希是基于映射的还是一致的,仅此而已。