RabbitMQ 3.11.0 中所需的特性标志
RabbitMQ 3.11.0 将使 RabbitMQ 3.8.x 生命周期中引入的所有特性标志变为必需。
使用 RabbitMQ 3.8.9 或更早版本最初创建集群的用户应在升级到 RabbitMQ 3.11 之前启用所有特性标志!如果未启用特性标志,RabbitMQ 3.11.0+ 将拒绝启动。
特性标志是一种机制,可以在保持 RabbitMQ 几个版本之间兼容性的同时,对 RabbitMQ 进行重大更改。它们通常带有代码,例如用于迁移内部模式数据库或磁盘上的数据结构。此外,代码中还散布着兼容性代码,以便在运行时同时支持旧的和新的行为以及结构。
换句话说,特性标志确实旨在允许滚动集群升级。它们并非用于让你决定例如“我不想要仲裁队列,因此我永远不会启用相应的特性标志”。启用特性标志不会强制你使用它背后的功能。并且大多数特性标志保护内部更改,这些更改对最终用户没有可见影响。请考虑尽快启用所有特性标志,因为它们允许你升级 RabbitMQ。
当然,维护和测试这些特性标志对我们来说也需要付出代价。此外,这可能会干扰新的更改并减慢我们的速度。
因此,RabbitMQ 3.11.0 将是第一个我们将某些特性标志标记为必需并删除其相应的兼容性和迁移代码的版本。受影响的特性标志是
quorum_queue
(对仲裁队列的支持)implicit_default_bindings
(默认绑定现在是隐式的,而不是存储在数据库中,以加快队列和交换机的创建速度)virtual_host_metadata
(能够向虚拟主机元数据添加元数据;描述、标签等)maintenance_mode_status
(能够将 RabbitMQ 切换到维护模式)user_limits
(能够为用户配置连接和通道限制)
对于你作为最终用户而言,这意味着以下内容
-
首次启动新的 RabbitMQ 节点时,即使例如
$RABBITMQ_FEATURE_FLAGS
环境变量另有说明,也将始终启用所需的特性标志。 -
在重新启动或升级 RabbitMQ 时,如果尚未启用所需的特性标志,则节点将拒绝启动。在这种情况下,以下是一个日志错误消息示例
2022-07-13 11:29:28.366877+02:00 [error] <0.232.0> Feature flags: `implicit_default_bindings`: required feature flag not enabled! It must be enabled before upgrading RabbitMQ.
2022-07-13 11:29:28.366905+02:00 [error] <0.232.0> Failed to initialize feature flags registry: {disabled_required_feature_flag,
2022-07-13 11:29:28.366905+02:00 [error] <0.232.0> implicit_default_bindings}
2022-07-13 11:29:28.372830+02:00 [error] <0.232.0>
2022-07-13 11:29:28.372830+02:00 [error] <0.232.0> BOOT FAILED
2022-07-13 11:29:28.372830+02:00 [error] <0.232.0> ===========
2022-07-13 11:29:28.372830+02:00 [error] <0.232.0> Error during startup: {error,failed_to_initialize_feature_flags_registry}
2022-07-13 11:29:28.372830+02:00 [error] <0.232.0>
默认情况下,在启动全新的节点或集群时,所有特性标志都已启用。因此,你很有可能不会受到影响,因为它们可能已经启用了。
但是,如果你最初使用 RabbitMQ 3.8.9 或更早版本创建了你的集群,并且从未启用特性标志,请确保在升级到 RabbitMQ 3.11 之前启用所有特性标志!如果你仍在使用 RabbitMQ 3.7.x 或早期 3.8.x,你可能需要
- 首先升级到最新的 3.8.x、3.9.x 或 3.10.x
- 启用特性标志
- 升级到 RabbitMQ 3.11.0+
如果你不这样做,RabbitMQ 3.11.0+ 将拒绝启动。如果发生这种情况,你将必须将 RabbitMQ 降级到切换到 3.11.0+ 之前使用的版本,并应用上述相同步骤。但是你说 RabbitMQ 不支持降级!没错,我很高兴你仔细阅读了文档。这是一种特殊情况:启动能力在流程的早期阶段得到验证,并且在此阶段未执行任何数据结构迁移。因此,仍然可以重新安装以前的软件包并重新启动 RabbitMQ 以启用所需的特性标志。