能说说Redis集群的原理吗?
能说说Redis集群的原理吗?
Redis集群通过数据分区实现数据的分布式存储,并通过自动故障转移实现高可用性。
集群创建
在创建Redis集群时,以下步骤完成数据分区:
节点设置:Redis集群通常由多个节点组成,至少需要6个节点才能确保完整的高可用性集群。每个节点需要配置为运行在集群模式下,通过设置cluster-enabled yes
来启用集群模式。
节点握手:节点握手是指运行在集群模式下的节点通过Gossip协议相互通信,以建立彼此之间的连接。节点握手是集群中节点之间相互感知的第一步,通过客户端发起的cluster meet {ip} {port}
命令来完成节点握手。完成节点握手后,多个Redis节点组成一个多节点集群。
分配槽(slot):Redis集群将所有数据映射到16384个槽位中。每个节点负责一定数量的槽位,只有分配了槽位的节点才能处理与这些槽位关联的键命令。通过使用cluster addslots
命令为节点分配槽位。
故障转移
Redis集群的故障转移与哨兵的故障转移类似,但是在Redis集群中,所有节点都参与状态维护的任务。
故障发现:Redis集群中的节点通过ping/pong消息进行通信。每个节点定期向其他节点发送ping消息,并等待响应的pong消息。如果在指定的时间(cluster-node-timeout
)内未收到响应,则发送节点将认为目标节点发生故障,并将其标记为"主观下线"状态(pfail)。
当一个节点将另一个节点标记为主观下线后,该状态会通过Gossip消息在整个集群中传播。集群中的节点不断收集有关故障节点的下线报告。当持有槽位的主节点中有半数以上节点都标记某个节点为主观下线时,会触发客观下线的流程。
故障恢复:
故障节点一旦被标记为客观下线,如果该节点是持有槽位的主节点,则需要从其从节点中选出一个来替代,以确保集群的高可用性。
- 资格检查:每个从节点都会检查与主节点的最后断线时间,以判断是否有资格替代故障的主节点。
- 准备选举时间:当从节点满足故障转移资格后,更新故障选举的触发时间,只有到达
该时间后才能执行后续步骤。
- 发起选举:当从节点的定时任务检测到故障选举的触发时间(failover_auth_time)到达后,会发起故障选举流程。
- 选举投票:持有槽位的主节点处理故障选举消息。选举过程实质上是一个领导者选举的过程,集群中有N个持有槽位的主节点就代表有N张选票。由于在每个配置纪元内,持有槽位的主节点只能投票给一个从节点,因此只有一个从节点可以获得N/2+1的选票,确保只有一个从节点被选为替代主节点。
- 替代主节点:一旦从节点收集到足够的选票,就会触发替代主节点的操作。
部署Redis集群至少需要多少个物理节点?
在故障选举环节中,故障主节点也会被计算在投票数内。假设集群中有3个主节点和3个从节点,其中有2个主节点部署在同一台机器上。当该机器发生故障时,由于从节点无法获得超过一半加一的主节点选票(3/2+1),故障转移将失败。这个问题同样适用于故障发现环节。因此,为了避免单点故障,部署Redis集群时至少需要将所有主节点部署在3台物理机器上。