我们正在尝试设计一个能够处理超过 64k 个 websocket 的架构。
我们首先尝试使用 Amazon ELB,但它的设计不允许意外的流量激增或 websocket。(TCP 模式意外导致 websocket 超时)
使用 HAProxy,这些限制不适用,但我们将限制在 HA 和后端服务器之间维护的 ~64k websocket。
我想到了很多解决方案:
- 多个 HAProxy 实例,通过 DNS 进行负载平衡(Route53 有一个加权选项)
- 两个带有 Keepalived 的 HAProxy 实例,多个内部 IP 地址(不确定是否可行)
有一个更好的方法吗 ?
答案1
如果您的 64k 限制是由于源端口造成的,您可以执行以下操作(有点奇怪,但这是我们目前在 SE 上为 websockets 所做的事情(我们通常使用 HAProxy 进行 50 万次并发):
server ny-web01-1 10.0.0.1:8081 check
server ny-web01-2 10.0.0.1:8082 check
server ny-web01-3 10.0.0.1:8083 check
另外,使用 keepalived 可以实现多个实例。只需在多个 IP 上执行类似轮询 DNS 的操作即可。只需确保 IP 始终被主动负载平衡器接收,因为 DNS 本身不会为您提供负载平衡(这里还有更多选项,这个选项很简单)。
答案2
您可以使用 Anycast 和 BGP 或其他边界路由协议设置多个共享相同 IP 的 HAproxy 系统。这样,所有 HAproxy 系统都处于活动状态;如果其中任何一个发生故障,您将停止在该系统上通告 BGP 路由,并且它将在约 30 秒内停止接收流量;这些流量将重新分发到通告相同范围的其他可用系统。
例如检查这如何设置此类布局的网址