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