REDIS群集通过结合失败检测,复制促销和群集状态管理来处理节点故障,以确保继续操作和数据可用性。它旨在通过自动促进复制品来代替无法到达的大师,维持关键空间的完整性,同时最大程度地降低数据损失风险,从而在几个节点的失败中生存。
###集群通信和故障检测
REDIS群集节点通过称为Redis Cluster Bus的专用二进制协议进行通信。每个节点都使用此总线与群集中其他所有节点保持连接,从而实现连续的健康检查和状态传播。节点定期发送PING数据包以确认其同龄人的运营状态并共享有关集群状态的信息。该通信使用八卦协议有效地传播群集信息,从而有助于检测节点故障。
节点使用主动PING机制监视对等方。如果一个节点在配置的超时期(Node_timeout)内不响应ping,则标记为可能在PFAIL状态下失败。这是一个暂定的故障指示,这意味着该节点可能无法到达或降低,但尚未确认。如果PFAIL条件持续存在并由大多数主节点确认,则该节点被标记为失败,表明它被认为是无法到达的或被群集降低的。这种基于共识的失败检测机制有助于防止误报识别失败的节点。
###处理主节点失败
当将主节点标记为失败时,Redis群集会启动故障转移过程,以推广其一个复制品,以成为新的主人。在没有管理干预的情况下,集群的故障检测器会自动触发此过程。晋升的副本接管了服务先前由失败的大师管理的哈希插槽的责任,以确保群集可以继续提供请求而无需手动重新配置。
只有在至少有一个可用的副本可促进的情况下,就会发生故障转移。如果不存在合适的副本,则群集进入错误状态,它将停止接受查询以防止使用不一致的数据。这突出了为每个主体配置复制品以保持高可用性的重要性。
###故障机械和安全
在故障转移期间,复制品等待与正在替换的主人完全同步,以确保其处理所有待处理更新以避免数据丢失。它通过将复制偏移量与主人匹配,从而实现这一目标,从而在担任主角色之前具有最新的数据集。
一旦同步,复制品就会从大多数主人那里要求新的配置时期。该时期是用于跟踪群集中配置变化的逻辑时间戳。获得共识后,复制品将更新的配置广播到所有节点,宣布其促销为主,并将旧的主人降级为复制或删除。
旧的主恢复后,会收到此配置更新,并停止将查询作为主。它将客户的请求重定向到新主人,以确保客户在没有手动干预的情况下透明地继续与群集进行交互。
###处理网络分区和分裂脑场景
REDIS集群使用基于多数的共识来避免网络分区期间的分裂问题。只有一半以上的大师在集群中无法实现,大师才会失败。无法与大多数人交流的大师将停止接受写作,以防止分区之间的数据状态不同。
但是,如果少数分区包含在故障转移之前继续写给主人的客户,则可能会损失写作损失。 Redis通过拒绝在超时后拒绝在少数群体上写作,而在大多数方面拒绝通过迅速失败的主人失败,从而减轻了这种风险。
尽管有这些预防措施,但在故障转移窗口中,写信可能会丢失,因为Redis使用大师和副本之间的异步复制。由于几乎同时发送了写入命令和复制更新的答复,因此丢失写入的窗口非常狭窄,但并非不可能。
###配置选项影响故障处理
REDIS群集包括影响节点失败期间的可用性和行为的配置选项:
- “ cluster-require-full-coverage”(默认值是):如果由于节点故障而发现了关键空间的任何部分,则群集停止接受写入,以确保强大的数据一致性。
- `cluster-wall-wall-reads-当down'(默认编号):控制群集处于故障状态时是否允许读取。启用此功能允许从节点进行读取,即使在部分失败期间,也可能会冒险提供陈旧的数据。
这些设置允许管理员根据应用程序要求平衡可用性和一致性。
###手动故障转移支持
除自动故障转移外,REDIS群集还提供了可以在副本节点上发出的手动故障转移命令。这对于管理员希望在不等待实际故障事件的情况下交换主角色的维护或测试方案很有用。
手动故障转移可以通过阻止当前主人的客户,等待副本完全赶上,然后通过平滑的原子过渡来促进复制品。这样可以确保在角色更改期间没有数据丢失,并且对客户的干扰最小。
### 概括
REDIS群集处理节点故障主要通过基于REDIS群集总线和八卦协议的连续监视的故障检测和故障转移系统。节点在达成共识的过程后自动检测到无法达到的大师并促进复制品,要求大多数大师就失败达成共识。故障转移旨在通过确保复制品在促进前完全同步来最大程度地减少数据丢失。网络分区是通过基于多数的决策来管理的,以防止分裂条件,尽管由于异步复制而可能发生狭窄的写入损失窗口。配置选项允许在故障期间调整可用性与一致性,手动故障转移命令可为操作员控制维护。
该体系结构使Redis群集能够从主节点失败中自动恢复,从而提供高可用性和分区耐受性,从而确保群集在失败方案下保持运行且一致。