蓝绿部署
蓝绿部署是一种迁移技术,也可以用作升级策略。主要思想是设置一个新的环境(“绿色”环境),并在其准备就绪时切换到该环境。从技术上讲,没有任何内容被升级 - 应用程序只是切换到不同的环境,该环境可能使用不同的版本,但也可能在其他方面有所不同。例如,相同的方法可用于迁移到新的硬件,同时保持 RabbitMQ 的相同版本。
完成迁移后,旧的(“蓝色”)集群将被退役(关闭、删除)。为了简化切换,可以使用联合队列将排队的消息从“蓝色”集群传输到“绿色”集群。
准备“绿色”集群
部署全新的“绿色”集群后,需要执行以下两个步骤
- 导入定义,例如交换机、队列、绑定;
- 配置联合以稍后清空消息。
导入定义
定义导出/导入的过程在备份指南中介绍。“蓝色”是源集群,“绿色”是目标集群。
配置队列联合
RabbitMQ 联合插件使消费者能够轻松地从“蓝色”迁移到“绿色”,而不会中断消息消费或丢失消息。联合队列的原理是,只要“蓝色”中没有消费者(本地消费者优先),现在连接到“绿色”的消费者就会收到发布到“蓝色”的消息。
以下是如何联合所有队列的示例。在此示例中,“蓝色”集群是上游集群,“绿色”集群是下游集群。
首先在“绿色”上定义上游,并将其指向“蓝色”
rabbitmqctl set_parameter federation-upstream blue \
'{"uri":"amqp://node-in-blue-cluster"}'
然后定义一个策略,匹配所有将blue
配置为上游的队列
rabbitmqctl set_policy --apply-to queues blue-green-migration ".*" \
'{"federation-upstream":"blue"}'
请阅读上面链接的指南和联合参考以获取更多详细信息。
迁移消费者
您现在可以切换您的消费者以使用新的“绿色”集群。为此,根据您的设置重新配置您的负载均衡器或您的消费者应用程序。升级指南介绍了一些客户端功能,使它们能够在节点之间切换。
此时,您的生产者仍在发布到“蓝色”,但由于联合插件,消息被传输到连接到“绿色”的消费者。
清空消息
下一步将是也将生产者切换到“绿色”。但是,“蓝色”中可能仍然有大量的消息积压。联合插件在这里无济于事,因为它不会移动消息,它只允许远程消费者出队消息。
如果消息积压量很大,请在“绿色”上使用铲运插件来真正清空“蓝色”中的消息。这将需要对每个积压队列执行以下操作
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"}'
迁移生产者
“蓝色”中的队列几乎为空后,您可以停止生产者。如果消息顺序对您很重要,您应该再等待一段时间,以便联合或铲运插件完成清空“蓝色”上的队列。
当它们为空时,像您对消费者所做的那样重新配置您的生产者并重新启动它们。此时,所有内容都已移动到“绿色”集群。
退役“蓝色”集群
您现在可以自由关闭“蓝色”集群中的节点。
实际示例
Pivotal 的 Dan Baskette、Gareth Smith 和 Claude Devarenne发表了一篇文章,介绍了生产者和消费者是 CloudFoundry 应用程序的这种方法。这篇文章非常详细,并使用图表来描述该过程。他们还制作了一个视频来展示其运行情况。
本指南的灵感来自他们出色的工作。