跳至主内容
版本:4.2

蓝绿部署

蓝绿部署是一种迁移技术,也可以用作升级策略。其主要思想是设置一个新环境(“绿色”环境),并在准备就绪后切换到该环境。“升级”不是“原地”执行的,应用程序只是切换到另一个环境,该环境可能使用不同的版本,但也可以在其他方面有所不同。

同样的方法可以用于迁移到新的操作系统或新硬件,同时保持 RabbitMQ 的版本不变,或者从无法直接升级到目标系列的某个版本进行升级,例如,从 3.12.x 升级到 4.0.x,或者从启用了 Khepri 的 3.13.x 集群升级到 4.0.x。

完成迁移后,旧的(“蓝色”)集群将被退役(关闭、删除)。为了简化切换,可以使用联合队列将入队的消息从“蓝色”集群传输到“绿色”集群。

准备“绿色”集群

部署全新的“绿色”集群后,需要遵循两个步骤:

  • 导入定义,例如交换器、队列、绑定;
  • 配置联合以稍后清空消息。

导入定义

定义导出/导入的过程在备份指南中有介绍。“蓝色”是源集群,“绿色”是目标集群。

配置队列联合

RabbitMQ 联合插件可以轻松地将消费者从“蓝色”集群迁移到“绿色”集群,而不会中断消息消费或丢失消息。联合队列的原理是,当前连接到“绿色”集群的消费者将获取发布到“蓝色”集群的消息,只要“蓝色”集群没有本地消费者(本地消费者优先)。

以下是一个联合所有队列的示例。在此示例中,“绿色”集群是上游,“蓝色”集群是下游。

首先在“蓝色”集群上定义上游,并指向“绿色”集群。

rabbitmqctl set_parameter federation-upstream blue \
'{"uri":"amqp://node-in-blue-cluster"}'

然后定义一个或多个策略,这些策略共同匹配所有队列,并将 `blue` 配置为上游。

rabbitmqctl set_policy --apply-to queues blue ".*" \
'{"federation-upstream":"blue"}'
提示

以上示例是一个极大的简化。

实际上,一些队列可能已经匹配了某个策略,而另一些可能没有。

rabbitmqadmin v2 提供了一组命令,允许操作员执行以下操作:

  1. 更新(部分修改)策略
  2. 临时覆盖现有策略以包含启用队列联合的键
  3. 声明一个全面的策略以匹配所有其他队列,从而为它们启用联合

结合使用这些功能,为所有队列启用集群之间的队列联合,无论它们是否已经有适用的策略。

请参考策略联合参考指南以了解更多信息。

迁移消费者

您现在可以切换您的消费者使用新的“绿色”集群。为此,请根据您的设置重新配置负载均衡器或您的消费者应用程序。升级指南涵盖了一些允许客户端在节点之间切换的客户端功能

此时,您的生产者仍在发布到“蓝色”集群,但由于联合插件的作用,消息会传输到连接到“绿色”集群的消费者。

清空消息

下一步是将生产者也切换到“绿色”集群。但是,您在“蓝色”集群中可能仍有待处理的消息积压。联合插件在此无济于事,因为它不移动消息,只允许远程消费者从队列中获取消息。

如果存在大量积压,请在“绿色”集群上使用Shovel 插件来真正清空“蓝色”集群中的消息。这需要为每个有积压的队列执行类似以下的操作:

rabbitmqctl set_parameter shovel drain-blue \
'{"src-protocol": "amqp091", "src-uri": "amqp://node-in-blue-cluster", \
"src-queue": "queue1", "dest-protocol": "amqp091", \
"dest-uri": "amqp://", "dest-queue": "queue1"}'

迁移生产者

一旦“蓝色”集群中的队列几乎为空,您就可以停止生产者。如果消息顺序对您很重要,您应该再等一会儿,以便联合或 Shovel 插件完成“蓝色”队列的清空。

当它们为空时,像为消费者一样重新配置您的生产者并重新启动它们。此时,所有内容都已迁移到“绿色”集群。

退役“蓝色”集群

您现在可以自由关闭“蓝色”集群中的节点。

实际示例

Pivotal 的 Dan Baskette、Gareth Smith 和 Claude Devarenne发表了一篇关于此方法的文章,其中生产者和消费者是 CloudFoundry 应用程序。这篇文章非常详细,并使用图表描述了整个过程。他们还制作了一个视频来展示其运行效果

本指南的灵感来自于他们的杰出工作。

© . This site is unofficial and not affiliated with VMware.