Redis Sentinel Failover判定 源码探寻

原创 2016年08月29日 19:11:59

前言

Redis sentinel设计初衷是保证Redis服务集群的稳定可用服务。其核心逻辑: 假设有Redis实例采用主从备份机制,如果master机器由于一些原因挂掉不可访问,sentinel可以自动识别出来,并且从master的slaves中选择出一个promote为master,从而保证服务可用。详细文档,参见官网

Failover判定流程

一次failover发生的过程大致如下:
1. sentinel集群(数量为N)中某个实例S发现某个masterM不可访问,则SM标记为sdown(subjectively down)主观下线状态。
2. 当sentinel集群通过交谈(gossip)后,至少有quorum个sentinel认为M不可访问后,将M标记为odown(objectively down)客观下线状态。
3. 处于odown状态后,集群每个sentinel实例投票选举leader主导尝试发起failover流程。
4. 当某个leader得票数超过N/2+1(占多数)时,正式开始failover流程。

备注: 过程3、4官网文档统称为authorize(这个authorize太误导人了,下面详细说)。

源码探究

sentinel是以sentinel模式运行的redis-server。Server.c调用流程如下:
[Server.c]main() ---> initServer() ---> 调用aeCreateTimeEvent注册回调Servercron() ---> 检查sentinel_mode, 调用setSentinelTimer()
Sentinel.c中的涉及到failover判定的主要流程如下:
[Sentinel.c]setSentinelTimer() ---> sentinelHandleDictOfRedisInstances(masters) ---> sentinelHandleRedisInstance()

sentinelHandlerRedisInstance()中:
1. checkSubjectivelyDown()
1. checkOjbectivelyDown()
2. ifNeededFailover()
3. 进入failoverStateMechine
4. askMasterStateToOtherSentinels()

每个sentinel实例都本地维护了一张redisInstance的字典,包括masters、masters->slaves、masters->sentinels,gossip过程中逐步保证字典信息一致性。 例如上述的askMasteStateToOtherSentinels(),从其他sentinel获取master的state,并更新自己的dict。
checkSubjectivelyDown()
checkOjbectivelyDown()这个函数遍历master->sentinels字典, 统计sdown次数,如果>=quorum(这个在配置文件里设置).则置为odown状态。
ifNeededFailover()首先判断满足以下情况时才进行startFailover()过程
1. master处于odown状态
2. 目前master没有正在进行的failover, 即master状态不处于SRI_FAILOVER_IN_PROGRESS
3. 最近没有进行failover, 最近指master->failover_timeout*2, 其中, failover_timeout是从配置文件里面读取的

startfailover()设置master的flag=SRT_FAILOVER_IN_PROGRESS, 获得新epoch, 设置failover_state=SENTINEL_FAILOVER_STATE_WAIT_START

后续, 进入状态机, 总共有5个状态。

SENTINEL_FAILOVER_STATE_WAIT_START
SENTINEL_FAILOVER_STATE_SELECT_SLAVE
SENTINEL_FAILOVER_STATE_SLAVEOF_NOONE
SENTINEL_FAILOVER_STATE_WATI_PROMOTION
SENTINEL_FAILOVER_STATE_RECONF_SLAVES

本文只分析failover判定过程, 即WAIT_STARTSELECT_SLAVE的过程, 调用sentinelFailoverWaitStart(), 主要逻辑:
1. sentinelGetLeader()
2. 如果leader不是自己, abortFailover
3. 设置为SELECT_SLAVE

getLeader()函数中,统计票数最多的一个sentinel。判断满足以下两个条件时, 返回作为leader。
1. 票数>=配置文件里的quorum
2. 票数>=sentinel总数/2 + 1

至此,正式进入failover流程。


相关文章推荐

redis sentinel 主从切换(failover)解决方案,详细配置

redis sentinel 主从切换(failover)解决方案,详细配置 作者:oyhk   2013-10-10 23:55:49    0 评论    629浏览 ...
  • pi9nc
  • pi9nc
  • 2014年01月01日 17:12
  • 60591

redis sentinel 主从切换(failover)解决方案,详细配置

转载自:http://blog.csdn.net/pi9nc/article/details/17735653  (这个上面没有写 转自哪里,我只能写上他的链接了。)...

redis sentinel 主从切换(failover)解决方案,详细配置

redis sentinel 主从切换(failover)解决方案,详细配置 主从复制简单来说就是把一台redis数据库中的数据同步到另一台redis数据库,并且按照数据流向,数据的发送者我们称作m...

Redis 安装,主从配置及Sentinel配置自动Failover

主页地址:http://redis.io/topics/sentinel sentinel主要功能就是为Redis M-S(master,slaves)集群提供了 1)master存活检测  ...
  • qbw2010
  • qbw2010
  • 2015年03月26日 15:39
  • 441

Redis Sentinel源码分析(二)

sentinelTimer函数周期性运行,第一次在服务启动后1ms执行,后续执行周期1000/server.hz(sentinelTimer函数会修改server.hz的值) sentinelTime...
  • yfkiss
  • yfkiss
  • 2014年03月31日 19:09
  • 4652

Redis Sentinel源码分析(一)

Base 2.8.7 在代码分析前,先总体介绍下sentinel 的机制。 1. 下线定义 sentinel对下线有两种定义: a.主观下线(sdown):sentinel实例本身对服务实例的判断 b...
  • yfkiss
  • yfkiss
  • 2014年03月31日 18:59
  • 8363

redis sentinel哨兵机制的源码分析

sentinel是redis的高可用性解决方案:由一个或多个sentinel实例组成sentinel系统监视多个master 以及master的slave,并在被监视的master进入下线状态时,自动...

Redis源码解析:22sentinel(三)客观下线以及故障转移之选举领导节点

八:判断实例是否客观下线          当前哨兵一旦监测到某个主节点实例主观下线之后,就会向其他哨兵发送”is-master-down-by-addr”命令,询问其他哨兵是否也认为该主节点主观下线...
  • gqtcgq
  • gqtcgq
  • 2016年06月05日 10:24
  • 1032

Redis源码解析:24sentinel(五)TLIT模式、执行脚本

十一:TILT模式          根据之前的介绍可知,哨兵的运行,非常依赖于系统时间,但是当系统时间被调整,或者哨兵中的流程因为某种原因(比如负载较高、IO发生阻塞、进程被信号停止等)而被阻塞时...
  • gqtcgq
  • gqtcgq
  • 2016年06月05日 10:47
  • 932
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis Sentinel Failover判定 源码探寻
举报原因:
原因补充:

(最多只允许输入30个字)