增长-再收缩升级
危险
为了安全地执行增长-再收缩升级,必须采取一些预防措施
增长-再收缩升级通常涉及以下步骤。考虑一个包含节点 A、B 和 C 的三节点集群
- 向集群添加一个新节点,节点 D
- 使用诸如
rabbitmq-queues grow
等命令,将每个仲裁队列和每个流的新副本放置到新节点上 - 检查集群是否处于良好状态:没有生效的警报,没有正在进行的队列或流副本同步操作,并且系统在合理的负载下
- 使用
rabbitmqctl forget_cluster_node
从集群中移除节点 A - 向集群添加一个新节点,节点 E
- 使用诸如
rabbitmq-queues grow
等命令,将每个仲裁队列和每个流的新副本放置到新节点上 - 检查集群是否处于良好状态
- 使用
rabbitmqctl forget_cluster_node
从集群中移除节点 B - 依此类推
这种方法看起来似乎在就地升级的相对简单性和蓝绿部署升级的安全性之间取得了良好的平衡。然而,实际上,这种策略具有与就地升级选项相当的特性
- 新添加的节点可能会影响现有的集群状态
- 在升级过程中,副本将在节点之间迁移
此外,这种方法有其自身独特的潜在风险
- 节点身份在升级过程中会发生变化,这可能会影响历史监控数据
- 节点必须将其数据集传输到新添加的成员,这可能导致网络流量和磁盘 I/O 的大幅增加
- 过早移除节点(见下文)可能导致一部分仲裁队列和流失去仲裁
危险
为了安全地执行增长-再收缩升级,必须采取一些预防措施
为了安全地执行增长-再收缩升级,必须采取一些预防措施
- 在添加新节点并启动副本扩展过程后,必须给该过程足够的时间来完成
- 在移除节点之前,必须运行健康检查以确保它对于任何队列(或流)都不是仲裁关键的:也就是说,移除该节点不会使任何仲裁队列或流失去在线多数
- 必须使用
rabbitmqctl forget_cluster_node
从集群中显式移除节点
流,特别是,并非为副本(节点)身份频繁更改的环境而设计,并且所有副本都可以在单个集群升级期间被转移和替换。
主要预防措施
要确定节点是否是仲裁关键的,请使用以下健康检查
- bash
- PowerShell
# exits with a non-zero code if any of the internal components, quorum queues or stream queues
# will lose online quorum should the target node be shut down;
# additionally, it will print which components and/or queues are affected
rabbitmq-diagnostics check_if_node_is_quorum_critical
# exits with a non-zero code if any of the internal components, quorum queues or stream queues
# will lose online quorum should the target node be shut down;
# additionally, it will print which components and/or queues are affected
rabbitmq-diagnostics.bat check_if_node_is_quorum_critical
必须使用以下健康检查来确定是否可能还有剩余的初始仲裁队列副本日志传输
- bash
- PowerShell
# exits with a non-zero status if there are any ongoing initial quorum queue
# replica sync operations
rabbitmq-diagnostics check_if_new_quorum_queue_replicas_have_finished_initial_sync
# exits with a non-zero status if there are any ongoing initial quorum queue
# replica sync operations
rabbitmq-diagnostics.bat check_if_new_quorum_queue_replicas_have_finished_initial_sync
提示
考虑一次添加和删除一个节点
如果一次添加和删除多个节点,则必须对所有节点执行健康检查。一次删除多个节点更可能使某些仲裁队列或流失去在线多数,因此强烈建议一次添加和删除一个节点。