集群和 Khepri
当 RabbitMQ 节点被集群化时,它们调用元数据存储后端来创建或扩展其集群。Mnesia 和 Khepri 都是这种情况。
因此,基于 Khepri 的 RabbitMQ 集群的形成或扩展与 Mnesia 的方式相同。
创建集群
您可以使用常规方法创建集群
- 使用命令行界面 (CLI) 工具
- 使用对等发现
有关完整描述,请参阅集群指南。
这是一个使用命令行界面 (CLI) 的示例
rabbitmqctl join_cluster rabbit@remote-host
从集群中移除节点
与集群形成一样,可以使用常规方法从集群中移除节点。
这是一个使用命令行界面 (CLI) 工具的示例
# Stop RabbitMQ without stopping the runtime (its OS process).
rabbitmqctl stop_app
# Reset it.
rabbitmqctl reset
# Restart the node as a blank one.
rabbitmqctl start_app
何时启用 Khepri?
可以在创建集群之前或之后启用 Khepri。
当启用 Khepri 时,如果 Khepri 是在创建集群后启用的,则第一步是将集群视图从 Mnesia 同步到 Khepri。
注意事项
由于使用了 Raft 共识算法,因此所有涉及更新元数据存储的操作(有时甚至包括查询)都需要法定数量的节点可用。
这对于 Khepri 以及其他基于 Raft 的功能(即仲裁队列和流)都是如此。
重启集群成员
当集群成员重启或停止时,其余节点可能会失去其法定人数。这可能会影响启动节点的能力。
例如,在一个包含 5 个节点的集群中,如果所有节点都已停止,则前两个启动节点将等待第三个节点启动,然后才能完成启动并开始服务消息。这是因为在本示例中,元数据存储至少需要 3 个节点才能选出领导者并完成初始化过程。与此同时,前两个节点等待,如果第三个节点没有出现,则可能会超时。
添加或移除集群成员
同样,必须有一个 Raft 领导者,因此需要法定数量的节点来验证和提交对集群成员资格的任何更改,无论是添加还是移除成员。同样,如果未满足该条件,操作将超时。
这是一个节点加入包含 4 个节点但其中 3 个节点已停止的集群的示例
- bash
- PowerShell
rabbitmqctl -n rabbit@host-5 join_cluster rabbit@host-4
# => Error:
# => Khepri has timed out on node rabbit@host-5.
# => Khepri cluster could be in minority.
rabbitmqctl.bat -n rabbit@host-5 join_cluster rabbit@host-4
# => Error:
# => Khepri has timed out on node rabbit@host-5.
# => Khepri cluster could be in minority.