跳至主要内容
版本:4.0

增长-缩减升级

注意

此策略涉及节点标识更改和副本传输到新添加的节点。

对于具有大型数据集的仲裁队列和流,这意味着集群将遇到大量的网络流量和磁盘 I/O 尖峰,而原地滚动升级则不会遇到这些问题。

请考虑使用 原地升级蓝绿部署升级 来代替。

危险

为了安全地执行增长-缩减升级,必须采取一些预防措施

增长-缩减升级通常涉及以下步骤。假设一个包含节点 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 明确地从集群中删除节点

专门针对副本(节点)标识更改不频繁的环境而设计,并且在单个集群升级的持续时间内,所有副本都可以被传输走并被替换。

关键预防措施

要确定节点是否为仲裁关键节点,请使用以下 健康检查

# 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 status if there are any ongoing initial quorum queue
# replica sync operations
rabbitmq-diagnostics check_if_new_quorum_queue_replicas_have_finished_initial_sync
提示

请考虑一次添加和删除一个节点

如果一次添加和删除多个节点,则必须对所有节点执行健康检查。一次删除多个节点更有可能导致某些仲裁队列或流没有在线多数,因此强烈建议一次添加和删除一个节点。

© 2024 RabbitMQ. All rights reserved.