sentinel 模式以100ms(理想状况下)的速度调用sentinelTimer并发
一、 执行sentinelCheckTiltCondition判断是否进入tilt模式异步
检查当前之间与sentinel.previous_time的时间差值,若是为负值或者大于阀值进入tilt模式,进入tilt模式会发送消息到+tilt频道函数
二、 执行sentinelHandleDictOfRedisInstances函数spa
对master执行sentinelHandleRedisInstance日志
i. 尝试重连若是断开链接的话orm
ii. 发送周期性命令排序
10000ms发送一个info命令ip
a) 异步回复处理策略it
i. 判断runnid,更新该master的runnid若是如今ri->runnid = NULL, 若是非NULL, 会比较两次runnid是否一致,若是不一致认为master重启过了,将发送消息到+reboot频道通知该master重启了io
ii.
down_after_period小于1000ms,则在down_after_period时间内发送一个ping命令,不然以1000ms为周期发送
a) 异步回复处理
i. 根据回复修改last_avail_time、last_ping_time 和last_pong_time
当回复PONG、LOADING、MASTERDOWN时,last_avail_time设置为当前时间,last_ping_time设置为0
Last_pong_time 设置为当前时间
大于2000ms发送一个hello
a) 异步回复处理
i. 修改上次pub时间last_pub_time
iii. 检验tilt模式
当当前时间减去sentinel.tilt_start_time 大于30个ping周期,一共30s时,取消tilt模式,并发送消息到频道-tilt中
iv. 检查master是否主观下线
检验命令线路:当前时间- 命令链接建立时间,而且未收到ok(状态为PONG,LOADING,MASTERDOWN)的ping回复,而且当前时间-last_ping_time 大于 down_after_period/2 ,而且当前时间-last_pong_time 大于 down_after_perod/2。断开链接
检验pubsub线路:当前时间-pubsub链路创建时间大于最小重连周期15s,而且当前时间-上一次收到消息是3倍的publish周期,则kill掉链接
若是last_ping_time 不等于0(不等于0表示收到的ping回复不是PONG,LOADDING,MASTERDOWN的任意一种),而且当前时间-last_ping_time的差值大于down_after_peroid而且role_reported为slave,当前时间减去role_reported_time 大于down_after_peroid+2倍的info命令周期,设为主观下线,并发送消息到+sdown频道,不然取消主观下线,发送消息到-sdown频道(即master从新活起来了)
v. 检查master是否客观下线
首先它得是主观下线状态,若是不是主观下线状态取消客观下线,并发消息到-odown频道。
若是sentinel认为该master是主观下线,那么计算该master下面的sentinel认为该master是主观下线的个数,若是个数大于该master的quorum,则认为是客观下线,并发送消息到+odown频道
vi. 是否须要故障转移
前提必须是已是客观下线状态
若是当前时间与上一次尝试故障转移的时间的差值小于该master的failover_timeout的2倍,写日志,return
若是不是以上的两种状况,开始故障转移
a) 设置该master的failover_state 为SENTINEL_FAILOVER_STATE_WAIT_START
b) 设置该master的flag为SRI_FAILOVER_IN_PROGRESS
c) 发送sentinel is-master-down-by-addr 命令自荐为局部领头sentinel
i. 先到者先得或者请求者纪元大于被请求者的局部领导纪元,请求者将设为被请求者的局部领头sentinel。
ii. 请求者收被请求者的应答后更新本身的为响应信息中指定的局部领头(多是本身也多是被请求者原来的局部领头sentinel,二者达成一致)
iii. 统计局部领头sentinel的得票数,超过通常为领头sentinel
领头sentinel进入SENTINEL_FAILOVER_STATE_SELECT_SLAVE状态
i. 找出有效的slave
slave不能是SRI_S_DOWN|SRI_O_DOWN|SRI_DISCONNECTED的任意一个
slave->slave_priority 不能为0
slave->last_avail_time不能大于5个sentinel ping 周期即5s
slave->info_refresh时间必须是在3个sentinel info时间周期内,即30s
slave->master_link_down_time 不能大于(如今的时间-减去主观down的时间+10个down_after_prioid
ii. 对有效的slave进行快速排序,对比slave的priority
iii. 第一个为推荐的slave
iv. 若是没有找到推荐的slave,清除failover标记,从新尝试
进入SENTINEL_FAILOVER_STATE_SEND_SLAVEOF_NOONE
i. 发送slaveof no one 命令给推荐的slave,使得其进入完成slave到master的转换
进入SENTINEL_FAILOVER_STATE_WAIT_PROMOTION状态
i. 等待slave完成转换,检查当前时间与刚进入该状态的时间差值,当这个差值超过failover_time时,重置failover状态,从新尝试
ii. 经过向slave发送info命令,发现该slave的role变为master,说明完成slave到master的转换,进入SENTINEL_FAILOVER_STATE_RECONF_SLAVES状态
进入SENTINEL_FAILOVER_STATE_RECONF_SLAVES状态
i. 给slave发送slave of promoted_slave’s ip prmmoted_slave’s port完成其余slave的master为新的master
ii. 检查全部的slave状态是否完成指向新的master,全部以完成,这些状态信息来自于法案送info消息给slave,进入SENTINEL_FAILOVER_STATE_UPDATE_CONFIG状态。
进入SENTINEL_FAILOVER_STATE_UPDATE_CONFIG状态
重置信息