跳到主要内容
版本: 4.1

元数据存储

元数据存储的作用

元数据存储是 RabbitMQ 记录除队列和流消息之外所有内容的数据库

  • 内部数据存储中的用户和权限;“内部”与外部定义的用户相对,例如,LDAP
  • 虚拟主机
  • 拓扑:交换机、队列、绑定
  • 运行时参数和策略
Runtime parametersTopologyVirtual hostsInternal usersMessagesMetadata store
元数据存储的作用

在集群中,元数据存储负责在所有 RabbitMQ 节点之间复制该数据。

元数据存储子系统依赖于后端库来提供数据库、其复制算法和故障恢复特性。

支持的后端

RabbitMQ 支持两个不同的库来提供此数据库

  • Mnesia
  • Khepri

在给定时间只能使用其中一个。下面分别介绍每个。

Mnesia

Erlang/OTP 标志

Mnesia 是原始后端,也是 RabbitMQ 3.13.x 之前 RabbitMQ 唯一使用的后端。该库是 Erlang/OTP 标准发行版的一部分。

它相当高效,提供事务和集群复制、用于备份和恢复的 API,并且作为原生 Erlang/OTP 库,可以完美集成到任何 Erlang 应用程序中。

Mnesia 的 弱点是其故障恢复特性,尤其是在网络分区方面。它的复制算法假设使用 Mnesia 的系统能够承受丢弃网络分区一侧的所有数据,但情况并非总是如此,也不符合许多技术运营团队的期望。

对于 Mnesia,如果两个节点一段时间无法通信并且数据库在一侧更新(例如,声明了一个队列),则由 RabbitMQ 解决数据中的冲突。

为了解决这个问题,RabbitMQ 中引入了网络分区策略。然而,它们绝不是根本的解决方案,而且难以理解。

Khepri

Khepri 标志

Khepri 是 RabbitMQ 4.0.x 开始完全支持的元数据存储。它由 RabbitMQ 团队开发,并重用了为仲裁队列所做的大量工作。

实际上,所有这些组件都基于 Raft 共识算法。因此,在连接丢失的情况下,行为得到了很好的定义,并且更容易理解。由于所有 RabbitMQ 组件和子系统都使用相同的算法,因此行为也是一致的。

目标是最终只切换到 Khepri 并停止使用 Mnesia。然而,与 Mnesia 相比,Khepri 的使用是一项重大更改——即使它是一个内部组件——因为它会影响集群或网络状况不佳时各种用户可见部分的行为。

如果您想了解更多关于 Khepri 及其在 RabbitMQ 中的集成信息,负责此项目的 Michael Davis 在 2023 年欧洲 Code BEAM 会议上做了一个演讲。您可以在 YouTube 上观看“Khepri:在 RabbitMQ 中替换 Mnesia”的录像。

提示

Khepri 将在 RabbitMQ 4.1.0 中成为默认后端。

Mnesia 仍将受到支持。现有的 RabbitMQ 部署在升级到 RabbitMQ 4.1.x 后将继续使用它,直到管理员显式启用 Khepri。

Mnesia 支持将在未来版本中移除,很可能是 RabbitMQ 4.2.0。因此,RabbitMQ 团队鼓励用户使用 Khepri 测试其工作负载和应用程序,以真正使其成熟,从而成为 RabbitMQ 未来默认(也是唯一)的元数据存储。

接下来的几页将解释如何启用 Khepri,并将介绍各种日常操作的行为更改。

© . All rights reserved.