跳至主内容

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

·6 分钟阅读

在本文中,我们将介绍 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 的以下双节点集群:

我们现在将节点 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 升级后,特性标记可用,并且可以启用它们。我们继续通过单击“启用”按钮来启用 `quorum_queue`。

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

了解更多

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

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

请尝试使用特性标记,并在RabbitMQ 邮件列表上告诉我们您的想法!

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