跳到主要内容

使用特性标志简化次要版本之间的滚动升级

·5 分钟阅读

在这篇文章中,我们将介绍 特性标志,RabbitMQ 3.8 中的一个新子系统。特性标志将允许滚动集群升级到下一个次要版本,而无需在升级前停止所有节点。

当前的次要版本升级:RabbitMQ 3.6.x 到 3.7.x

如果您必须将集群从 RabbitMQ 3.6.x 升级到 3.7.x,您可能必须使用以下解决方案之一

  • 部署一个与现有集群并排的新集群(此策略称为 蓝绿部署),然后将数据和客户端迁移到新集群
  • 停止现有集群中的所有节点,首先升级最后停止的节点,然后继续逐个升级所有其他节点

蓝绿部署策略风险较低,但也相当复杂,难以自动化。另一方面,集群范围的关闭会影响可用性。特性标志旨在提供第三种选择,使滚动集群升级成为可能,并且相对容易自动化。

特性标志子系统

特性标志指示 RabbitMQ 节点对其集群对等节点的功能。以前,节点使用版本来评估与集群版本的兼容性。分布式系统中的节点可能在许多方面变得不兼容,包括 Erlang 和依赖项版本。这些方面中的许多方面并未反映在一组版本号中。特性标志是一种更好的方法,因为它可以反映节点的更多功能,无论是特定功能还是内部通信协议修订。实际上,对于某些消息协议,RabbitMQ 支持客户端具有一种机制,供客户端指示其功能。这允许客户端库独立于 RabbitMQ 节点进行演进和升级。

例如,RabbitMQ 3.8.0 引入了一种新的队列类型,仲裁队列。为了实现它们,修改了内部数据结构和数据库模式。这会影响与其他节点的通信,因为数据结构在节点之间交换,并且内部数据存储模式会复制到所有节点。

如果没有特性标志子系统,在集群中包含运行 RabbitMQ 3.7.x 的其他节点的情况下,就不可能拥有 RabbitMQ 3.8.0 节点。实际上,3.7.x 节点将无法理解来自 3.8.0 节点的数据结构或数据库模式。反之亦然。这就是为什么 RabbitMQ 今天通过比较版本并在版本被认为不兼容时拒绝集群(该策略认为不同的次要/主要版本不兼容)来防止这种情况发生。

RabbitMQ 3.8.0 中的新功能是特性标志子系统:当 3.7.x 集群中的单个节点升级到 3.8.0 并重新启动时,它不会立即启用新功能或迁移其数据库模式,因为特性标志子系统告诉它不要这样做。它可以确定这一点,因为 RabbitMQ 3.7.x 完全不支持特性标志,因此在集群中的所有节点都升级之前,RabbitMQ 3.8.0 中的新功能或行为都不能使用。

在将集群部分升级到 RabbitMQ 3.8.0 之后,所有节点在不兼容的功能方面都充当 3.7.x 节点,即使是 3.8.0 节点也是如此。在这种情况下,仲裁队列不可用。操作员必须完成升级,升级所有节点。完成升级后,操作员可以决定启用 RabbitMQ 3.8.0 提供的新的特性标志:其中一个标志启用仲裁队列。这是使用 RabbitMQ CLI 工具或 管理 UI 完成的,并且应该由部署自动化工具执行。其想法是,操作员需要确认她的集群没有任何剩余的 RabbitMQ 3.7.x 节点,这些节点可能会在稍后重新加入集群。

一旦启用了新的特性标志,就不可能向该集群添加运行旧版本的节点。

RabbitMQ 3.8.0 演示

让我们完成 RabbitMQ 3.7.x 集群的完整升级。我们将在此过程中查看特性标志。

我们有以下运行 RabbitMQ 3.7.12 的 2 节点集群

我们现在将节点 A 升级到 RabbitMQ 3.8.0 并重新启动它。这是节点重新启动后管理概览页面的外观

我们可以在节点列表中看到版本的差异:它们的版本显示在它们的节点名称下方。

RabbitMQ 3.8.0 提供的特性标志列表现在在节点 A 的管理 UI 中可用

此页面在节点 B 上不存在,因为它仍在运行 RabbitMQ 3.7.12。

在节点 A 上,我们看到 quorum_queue 特性标志标记为 Unavailable(不可用)。原因是节点 B(仍在运行 RabbitMQ 3.7.12)不知道 quorum_queue 特性标志,因此不允许节点 A 使用该新特性标志。在集群中的所有节点都支持它之前,无法启用此特性标志。

例如,我们可以尝试在节点 A 上声明一个仲裁队列,但它被拒绝了

在节点 B 升级后,特性标志可用,并且可以启用。我们继续并通过单击 Enable(启用)按钮来启用 quorum_queue

现在,我们可以声明一个仲裁队列了

了解更多

特性标志子系统文档 更详细地描述了它的工作原理以及操作员和插件开发人员应注意的事项。

请注意,特性标志并不能保证将来升级永远不需要集群关闭:使用特性标志实现更改的能力取决于更改的性质,并且是根据具体情况决定的。分布式系统的正确行为可能要求其所有组件以某种方式运行,有时这意味着它们必须同步升级。

请试用特性标志,并在 RabbitMQ 邮件列表 上告知我们您的想法!

© . All rights reserved.