跳至主要内容

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

·阅读时间 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.8.0 的节点,而其他节点运行 RabbitMQ 3.7.x。实际上,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 特性标志标记为 不可用。原因是节点 B(仍然运行 RabbitMQ 3.7.12)不知道 quorum_queue 特性标志,因此节点 A 不允许使用该新特性标志。在集群中的所有节点都支持该特性标志之前,无法启用它。

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

在节点 B 升级之后,特性标志可用,并且可以启用它们。我们继续操作并通过单击 启用 按钮启用 quorum_queue

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

了解更多信息

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

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

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

© 2024 RabbitMQ. All rights reserved.