深入理解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 版
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
NoSQL Java Redis
实现基于Redis的分布式锁机制
实现基于Redis的分布式锁机制
|
1月前
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
39 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
1月前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
37 2
|
3月前
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
|
2月前
|
存储 NoSQL Redis
Redis的RDB快照:保障数据持久性的关键机制
Redis的RDB快照:保障数据持久性的关键机制
53 0
|
2月前
|
存储 缓存 NoSQL
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
88 0
|
3月前
|
存储 NoSQL 算法
深入理解Redis分片Cluster原理
本文深入探讨了Redis Cluster的分片原理,作为Redis官方提供的高可用性和高性能解决方案,Redis Cluster通过数据分片和横向扩展能力,有效降低单个主节点的压力。
深入理解Redis分片Cluster原理
|
3月前
|
NoSQL 网络协议 Linux
【AKS+Redis】AKS中客户端(ioredis)遇见Azure Redis服务Failover后链接中断的可能性
【AKS+Redis】AKS中客户端(ioredis)遇见Azure Redis服务Failover后链接中断的可能性
|
3月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析
【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析