我一直尝试在 f5 开发人员中心和互联网上查找有关以下设置的信息,但没有找到。
我们想要一个有 3 个节点的 rabbitmq 集群。1 个节点将始终是所有队列的主节点。1. 将所有队列的所有连接/流量发送到当前主节点 (A)。2. 当节点 A 无响应(由于应用程序层或网络层问题)时,负载均衡器应自动将所有流量故障转移到节点 (B)。3. 如果节点 B 发生故障,则移至节点 C。
问题:如何确定某个节点无响应并且应该将故障转移到单独的节点?有没有办法通过负载均衡器使用 amqp 协议调用 rabbitmq 来实现此目的?找不到很好的文档。
即使您不知道如何使用 F5 实现这一点,也可以从不同的负载均衡器或代码角度来回答。
问题补充:我认为无论这个健康检查是什么,它都必须足够具体,以便当 LB 切换发生并且没有误报时,rabbitmq 集群已经将主节点故障转移到节点 B。
感谢您花时间阅读并回答。
答案1
我已经使用 Stingray 负载均衡器为集群 RabbitMQ 完成了 L4 负载均衡 - 效果很好,并且我们已经完成了 RR,没有任何特殊问题。
如果一个 Rabbit 节点发生故障,TCP 连接就会失败,负载均衡器会将流量发送到另一个节点。
现在这在技术上是低效的,因为发送到节点 A 的任何记录也将被发送到节点 B,反之亦然,由 Rabbit 通过 Erlang 内部进行epmd
。
一非常需要注意的是,您必须将负载均衡器设置为无限期地保持 TCP 连接打开。这是一个常见问题,因为 Rabbit MQ 使用长时间运行的 TCP 连接,但大多数负载均衡器都针对 HTTP 式连接参数。某些软件(nginx)具有非常激进的 TCP 清理窗口,并将关闭这些 TCP 连接,导致连接失败,即使所有机器都正常。
答案2
如果您只关注主服务器,我将跳过负载均衡器,使用 keepalived 和状态检查来查看自身是否是主服务器,如果是主服务器,则它将使用 vip。