我正在探索RabbitMQ 仲裁队列以提高 Kubernetes 集群中某些服务的 HA。据我所知,它们的设计充分考虑了数据安全。
但是,那“管理副本”一章状态:
仲裁队列的副本由操作员明确管理。当新节点添加到集群时,它将不托管仲裁队列副本,除非操作员明确将其添加到仲裁队列或仲裁队列集的成员(副本)列表中。
因此,在中断(尤其是非自愿的),可能会出现以下情况(对于 3 节点集群):
- 中断后,一个节点将会瘫痪:另外两个节点仍然占多数,并将“保持队列活跃”,并可能选出新的领导者;
- kubernetes 会提供一个新的节点(pod)来替代失败的节点;新节点会自动重新加入 RabbitMQ 集群,但是
- 除非运营商手动干预,新节点将不是为现有的仲裁队列做出贡献;
- 对于 3 节点集群,这意味着不再有 HA:如果将来某个时候,其他节点之一出现故障,则队列实际上会丢失;
有什么方法可以缓解这种情况吗?例如,是否有可能让节点自动重新加入所有现有的仲裁队列集群?也许可以通过维护一个“启动命令”列表(在 RabbitMQ 启动后运行),我们可以将重新加入命令?
答案1
RabbitMQ 团队强烈建议使用官方的 Kubernetes 操作员 -https://www.rabbitmq.com/kubernetes/operator/operator-overview.html
除此之外,以下是当地 k8s 专家的看法:
Kubernetes 不会随机删除持久卷 - 如果节点因某种原因发生故障,它将以相同的名称和相同的数据启动
只要使用相同的名称和数据,“新”节点就会像旧节点一样加入。
可能存在需要人工干预的情况,但这种情况并不像您想象的那么频繁。
笔记:RabbitMQ 团队监控rabbitmq-users
邮件列表并且仅有时回答 StackOverflow 上的问题。