深入理解redis cluster的failover机制

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 社区版redis cluster是无中心节点P2P的集群架构,内部采用gossip协议传递维护集群的拓扑结构和集群元数据。社区文档地址:https://redis.io/topics/cluster-tutorial failover是redis cluster提供的容错机制,cluster最核心的功能之一。
社区版redis cluster是无中心节点P2P的集群架构,内部采用gossip协议传递维护集群的拓扑结构和集群元数据。社区文档地址: https://redis.io/topics/cluster-tutorial
5c913173492b16ca86c363e68be0d67a40ac6973
failover是redis cluster提供的容错机制,cluster最核心的功能之一。failover支持两种模式:
  • 故障failover:自动恢复集群的可用性
  • 人为failover:支持集群的可运维操作

1、故障failover

故障failover表现在一个master分片故障后,slave接管master的过程。

1.1、探测阶段

集群中的所有分片通过gossip协议传递。探测步骤为:
(1)在cron中非遍历cluster nodes做ping发送,随机从5个节点中选出最老pong_recv的节点发送ping,再遍历节点中pong_recv > timeout/2的节点发送ping。
(2)再遍历每个节点从发出ping包后超时没有收到pong包的时间,超时将对应的分片设置为pfail状态,在跟其他节点的gossip包过程中,每个节点会带上被标记为pfail状态的包。
(3)每个正常分片收到ping包后,统计集群中maste分片将故障节点设置为pfail, 超过一半以上的节点设置为pfail, 则将节点设置为fail状态。如果这个分片属于故障节点的slave节点,则主动广播故障节点为fail状态。
下图以3个节点集群来说明核心的流程:
59e28dbbce16b9875674f01ebc4bce7f006a0a3e
 

1.2、准备阶段

在cron函数中,slave节点获取到master节点状态为fail,主动发起一次failover操作,该操作并不是立即执行,而是设计了多个限制:
(1)过期的超时不执行。如何判断是够过期? data_age = 当前时间点-上次master失联的时间点-超时时间
如果data_age > master到slave的ping间隔时间+超时时间*cluster_slave_validity_factor, 则认为过期。cluster_slave_validity_factor是一个配置项,cluster_slave_validity_factor 设置的越小越不容易触发failover。
(2)计算出一个延迟执行的时间failover_auth_time, failover_auth_time = 当前时间 + 500ms + 0-500ms的随机值 + 当前slave的rank*1s,  rank按已同步的offset计算,offset同步的越延迟,rank值越大,该slave 就越推迟触发failover的时间,以此来避免多个slave同时failover。只有当前时间到failover_auth_time的时间点才会执行failover。

1.3、执行阶段

(1)将currentEpoch自增,再赋值给failover_auth_epoch
(2)向其他master分片发起failover投票,等待投票结果
(3)其他master分片收到CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST请求后,会判断是否符合以下情况:
  • epoch必须>=所有集群视图的master节点的epoch
  • 发起者是slave
  • slave的master已是fail状态
  • 在相同epoch内只投票一次
  • 在超时时间(cluster_node_timeout)* 2的时间内只投票一次
(4)其他master回复CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK,slave端收到后做统计
(5)在cron中判断统计超过一半以上master回复,开始执行failover
(6)标记自身节点为master
(7)清理复制链路
(8)重置集群拓扑结构信息
(9)向集群内所有节点广播
下图以3个节点集群来说明核心的流程:
fd6530f88b06a322dfce262de2497094f5547744

2、人为failover

人为failover支持三种模式的failover:缺省、force、takeover。

2.1、缺省

(1)给master 发送CLUSTERMSG_TYPE_MFSTART
(2)master收到后设置clients_pause_end_time = 当前时间+ 5s*2,clients_paused =1 ,客户端暂停所有请求,新建请求会被加到block client list。
(3)master在ping包中带上repl_offset的信息
(4)slave检查master的repl_offset,确认同步已完成
(5)设置mf_can_start = 1,在cron中开始正常的failover流程,不需要像故障failover设置推迟执行而是立即执行操作, 而且其他master投票时不需要考虑master是否为fail状态。
d54774ec3fd454baae06fce5a870c633a3474835

2.2、force

忽略主备同步的状态,设置mf_can_start = 1,标记failover开始。

2.3、takeover

直接执行故障failover的第6-9步,忽略主备同步,忽略集群其他master的投票。

3、结束语

云数据库Redis版(ApsaraDB for Redis)是一种稳定可靠、性能卓越、可弹性伸缩的数据库服务。基于飞天分布式系统和全SSD盘高性能存储,支持主备版和集群版两套高可用架构。提供了全套的容灾切换、故障迁移、在线扩容、性能优化的数据库解决方案。欢迎各位购买使用: 云数据库 Redis 版
目录
相关文章
|
NoSQL Java Redis
实现基于Redis的分布式锁机制
实现基于Redis的分布式锁机制
|
30天前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
158 2
|
4月前
|
缓存 NoSQL 算法
Redis数据库的键值过期和删除机制
我们需要注意的是,虽然Redis提供了这么多高级的缓存机制,但在使用过程中,必须理解应用的特性,选择合适的缓存策略,才能最大化Redis的性能。因此,在设计和实施应用程序时,理解应用的数据访问模式,以及这些模式如何与Redis的缓存机制相互作用,尤为重要。
183 24
|
8月前
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
115 7
|
11月前
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
162 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
11月前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
168 2
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
|
存储 NoSQL 算法
深入理解Redis分片Cluster原理
本文深入探讨了Redis Cluster的分片原理,作为Redis官方提供的高可用性和高性能解决方案,Redis Cluster通过数据分片和横向扩展能力,有效降低单个主节点的压力。
深入理解Redis分片Cluster原理
|
12月前
|
存储 NoSQL Redis
Redis的RDB快照:保障数据持久性的关键机制
Redis的RDB快照:保障数据持久性的关键机制
241 0