RabbitMQ 中 Khepri 作为默认元数据存储的路线图
Khepri,RabbitMQ 新的基于 Raft 的 元数据存储,在 RabbitMQ 4.0 中已获得完全支持。从下一个发布系列 RabbitMQ 4.2 开始,我们认为 Khepri 已足够成熟,可以成为默认的元数据存储,尤其考虑到其在数据安全性和恢复性方面相比 Mnesia 有了显著的改进。
我们进行了一系列基准测试,显示在许多元数据操作中性能得到了显著提升。下文附有对比表格。
Khepri 功能标志现已稳定
khepri_db 功能标志现已升级为 Stable(稳定版),这意味着在运行 rabbitmqctl enable_feature_flag all 命令时它将被启用。该操作应在每次成功升级版本后执行。
从 4.2 版本开始,强烈建议所有 RabbitMQ 集群通过启用 khepri_db 功能标志来采用 Khepri。该功能标志在 4.2 及以后的版本升级中很可能成为强制要求。
虽然最终决定取决于社区反馈,但我们预计从 RabbitMQ 4.3 开始,khepri_db 功能标志将升级为 Required(必需)。
功能标志子系统
RabbitMQ 的功能标志子系统最近进行了改进,引入了一类新的功能标志,称为 Soft Required(软性必需)。如果一个功能标志从 N 版本开始属于 Soft Required,那么一旦所有 RabbitMQ 节点都升级到 RabbitMQ 的 N 版本,它就会被自动启用。这与之前 Required 的行为有所不同:之前版本中如果某个功能标志在 RabbitMQ N 版本变为必需,则必须在升级到 N 版本之前手动启用它。
最佳实践仍然是在功能标志变为 Stable 后立即启用它们,通常是在成功升级后通过运行命令 rabbitmqctl enable_feature_flag all 来实现。尽管如此,我们认为引入 Soft Required 功能标志改善了用户体验,因为任何尚未启用的必需功能标志在需要时都会被自动启用。
Khepri 性能改进
以下基准测试是在 Kubernetes 上运行的 3 节点集群上执行的
1000 个队列,每个队列有 100 个绑定
| 基准测试 | mnesia | khepri |
|---|---|---|
| 导入 | 446 秒 | 51 秒 |
| 重新导入 | 16 秒 | 46 秒 |
| 停止应用 (stop_app) | 1.6 秒 | 1.7 秒 |
| 启动应用 (start_app) | 22 秒 | 4.3 秒 |
| 滚动集群重启 | 108 秒 | 67 秒 |
| 从 mnesia 迁移到 khepri | 12.7 秒 |
1000 个虚拟主机 (Vhosts)
| 基准测试 | mnesia | khepri |
|---|---|---|
| 导入 | 284 秒 | 21 秒 |
| 重新导入 | 2.2 秒 | 2.2 秒 |
| 停止应用 (stop_app) | 2.6 秒 | 2.4 秒 |
| 启动应用 (start_app) | 419 秒 | 16 秒 |
| 滚动集群重启 | 1447 秒 | 106 秒 |
| 从 mnesia 迁移到 khepri | 5.5 秒 |
100,000 个经典队列
| 基准测试 | mnesia | khepri |
|---|---|---|
| 导入 | 76 秒 | 76 秒 |
| 重新导入 | 5.4 秒 | 5.3 秒 |
| 停止应用 (stop_app) | 13 秒 | 6 秒 |
| 启动应用 (start_app) | 26 秒 | 40 秒 |
| 滚动集群重启 | 185 秒 | 307 秒 |
| 从 mnesia 迁移到 khepri | 9.7 秒 |
10,000 个仲裁队列 (Quorum Queues)
| 基准测试 | mnesia | khepri |
|---|---|---|
| 导入 | 49 秒 | 46 秒 |
| 重新导入 | 1.9 秒 | 1.8 秒 |
| 停止应用 (stop_app) | 1.9 秒 | 1.7 秒 |
| 启动应用 (start_app) | 44 秒 | 44 秒 |
| 滚动集群重启 | 285 秒 | 267 秒 |
| 从 mnesia 迁移到 khepri | 4.7 秒 |
1,000 个流 (Streams)
| 基准测试 | mnesia | khepri |
|---|---|---|
| 导入 | 3.5 秒 | 1.2 秒 |
| 重新导入 | 1.6 秒 | 1.2 秒 |
| 停止应用 (stop_app) | 1.9 秒 | 1.2 秒 |
| 启动应用 (start_app) | 2.5 秒 | 2.3 秒 |
| 滚动集群重启 | 56 秒 | 55 秒 |
| 从 mnesia 迁移到 khepri | 5 秒 |
