元数据存储
元数据存储的作用
元数据存储是 RabbitMQ 记录除队列和流消息以外所有内容的数据库
在集群中,元数据存储负责将数据复制到所有 RabbitMQ 节点。
元数据存储子系统依赖于后端库来提供数据库、复制算法和故障恢复特性。
支持的后端
RabbitMQ 支持两种不同的库来提供此数据库
- Mnesia
- Khepri
一次只使用其中一个。下面将分别介绍每个库。
Mnesia
Mnesia 是最初的后端,也是 RabbitMQ 3.13.x 版本之前唯一使用的后端。该库是 Erlang/OTP 标准发行版的一部分。
它的效率相当高,提供事务和集群复制,以及用于备份和恢复的 API。它作为原生 Erlang/OTP 库,与任何 Erlang 应用程序完美集成。
Mnesia 的弱点在于其故障恢复特性,特别是在网络分区方面。其复制算法假设使用 Mnesia 的系统可以承受在网络分区一侧丢弃所有数据,这并不总是可行,也不符合许多技术运营团队的期望。
使用 Mnesia 时,如果两个节点无法通信一段时间,并且数据库在一侧进行了更新(例如,声明了一个队列),则由 RabbitMQ 来解决数据中的冲突。
为了解决这个问题,RabbitMQ 引入了网络分区策略。然而,它们绝不是根本的解决方案,而且难以理解。
Khepri
Khepri 是 RabbitMQ 4.0.x 版本开始全面支持的元数据存储。它由 RabbitMQ 团队开发,并借鉴了仲裁队列和流的开发经验。
事实上,所有这些组件都基于Raft 共识算法。因此,在失去连接的情况下,行为定义明确,更容易理解。行为在 RabbitMQ 组件和子系统之间也保持一致,因为它们都使用相同的算法。
最终目标是完全切换到 Khepri,不再使用 Mnesia。但是,与 Mnesia 相比,使用 Khepri 是一项重大改变,即使它是一个内部组件,也会影响集群或网络出现问题时的各种用户可见部分的行为。
如果您想了解更多关于 Khepri 及其在 RabbitMQ 中的集成,负责该项目的 Michael Davis 在 2023 年的 Code BEAM Europe 大会上做了一个演讲。您可以在 YouTube 上观看“Khepri: Replacing Mnesia in RabbitMQ” 的录制。
Khepri 将成为 RabbitMQ 4.1.0 版本中的默认后端。
Mnesia 仍将得到支持。现有的 RabbitMQ 部署在升级到 RabbitMQ 4.1.x 版本后将继续使用它,直到管理员显式启用 Khepri 为止。
Mnesia 支持将在未来版本中删除,很可能是 RabbitMQ 4.2.0 版本。因此,**RabbitMQ 团队鼓励用户使用 Khepri 测试其工作负载和应用程序**,以真正将其成熟为 RabbitMQ 未来默认的(也是唯一的)元数据存储。
接下来的几页将解释如何启用 Khepri,并将介绍在日常操作中出现各种变化时的这些行为变化。