添加对 Quorum 队列的管理支持

RabbitMQ 项目正在逐步淘汰经典队列,转而采用 Quorum 队列(参见 4_0_deprecations)。Quorum 队列提供更高的数据安全性,并且基于广泛采用的 Raft 共识算法

OpenStack 目前不支持创建 Quorum 队列,但正在评审一项更改以添加对它们的的支持 Oslo Messaging Quorum Queues

警告:经典队列和 Quorum 队列之间并非完全功能对等。例如,Quorum 队列不支持消息 TTL,这对于 OpenStack 队列中的通知可能是一个问题,因为通知经常会累积。有关更多详细信息,请参见 _feature_comparison

问题描述

Quorum 队列在 RabbitMQ 3.8.0 或更高版本中可用(例如 Focal)。使用现有 rabbitmq-server charm 在 focal 上部署的系统已经支持创建 Quorum 队列。如果 rabbitmq server 集群扩展或缩小,则需要外部管理队列的复制。本规范涵盖了在 rabbit 集群生命周期内管理 Quorum 队列所需的功能。例如,如果一个 rabbitmq-server 单元丢失并且它正在托管 Quorum 队列的镜像,则应在另一个单元上添加一个新的镜像。

注意:当客户端通过 amqp 关系连接到 rabbitmq-server 时,它们会声明他们想要访问的 vhost。rabbitmq-server charm 确保 vhost 存在,并为客户端提供使用 vhost 的凭据。客户端负责创建所需的任何队列,并且在创建队列时定义其类型。

提议的变更

添加功能到 peer joined、departed 和 broken 钩子中,以便在添加或丢失 peer 时重新平衡队列。这些钩子很可能使用 rabbitmq-queues 命令的 add_member、delete_member、grow 和 shrink 选项。

还应添加 charm 操作,以手动从 Quorum 队列中添加或删除成员,以帮助主动维护集群,例如将单元关闭进行维护。

备选方案

经典队列仍然受支持,因此另一种选择是在所有情况下继续使用它们。

实现

负责人

待定

Gerrit Topic

对于与此规范相关的所有补丁,请使用 Gerrit 主题“quorum_queues”。

git-review -t quorum_queues

工作项

  • 添加函数到 rabbit utils 中,以识别所有 vhost 中的所有 Quorum 队列。

  • 添加函数到 rabbit utils 中,以报告哪些节点正在托管队列。

  • 扩展 peer departed 钩子,以识别在离开节点上托管镜像的哪些队列,并为每个队列在另一个节点上添加镜像(如果可能)。

  • 在 charms 的工作负载状态中报告镜像不足的队列。

  • 添加操作以允许移动队列镜像。

仓库

不需要新的仓库

文档

需要记录操作。

安全性

N/A

测试

  • 添加功能测试以创建 Quorum 队列,并在集群缩小和扩展后检查是否有足够的副本。

依赖项

  • 为了使 OpenStack 使用 Quorum 队列,Oslo Messaging Quorum Queues 需要着陆,并且每个 OpenStack 客户端 charm 需要增长对 rabbit_quorum_queue 选项的支持。