Khepri 如何处理故障恢复
本节介绍 Khepri 基于 Raft 的故障处理和恢复方法。
集群少数派行为
当 Mnesia 用作元数据存储后端时,RabbitMQ 提供了网络分区恢复策略。
它们的作用是在集群分裂时处理冲突,因为两侧的节点会基于对集群不完整的视图继续写入元数据存储。一些策略通过停止分裂后成员较少的一侧(即少数派)的服务来从根本上防止冲突。
Raft 是 Ra 库实现的共识算法,被 quorum queues、stream queues 和 Khepri 使用。它只提供一种恢复策略,这与为 Mnesia 开发的分区处理策略中的 pause_minority 策略最为相似。
当 Khepri 成员想要更新元数据存储、需要执行跨所有在线集群成员的查询,甚至想要更改集群成员时,请求将通过该 Khepri 集群中选出的领导者副本。
如果领导者没有获得绝对多数成员的确认,请求将阻塞并可能超时。请注意,这是对 Raft 如何处理故障恢复的非常简化的描述,但也是最重要的方面需要理解。
因此,如果一个位于网络分裂的少数派一侧的 RabbitMQ 节点想要声明一个交换器、队列或绑定,如果分裂未及时解决,该请求将超时。
停止的 RabbitMQ 节点
如果超过一半的 RabbitMQ 节点当前已停止或丢失,也会出现少数派的情况:剩余的运行节点无法连接到其他节点,Raft 无法达成共识。
行为是否可配置?
与 Mnesia 使用的网络分区恢复策略不同,Khepri 使用的策略是不可配置的:这是 Raft 算法的设计。
因此,更容易理解 RabbitMQ 的行为以及可能发生的情况。
节点故障与恢复
当一个曾经托管 Khepri 领导者副本的节点发生故障时,将使用 Raft 领导者选举语义选举出新的领导者。当托管前领导者的节点重新加入时,它会识别出存在新的领导者并且该领导者使用新的选举任期,然后它将退位成为跟随者。
在此节点宕机期间集群中已提交的模式更改将应用到它身上,从它与新领导者日志(变更历史)的第一个共同点开始。这对应用程序来说完全是透明的,与新添加的节点如何与现有的 Khepri 领导者副本同步几乎没有区别。