更多Redis入门系列文章,参见Redis入门-大纲
Sentinal概述
单就主从模式而言,master节点挂了以后,redis不会从slave节点重新选一个做master。使用Sentinal可以很好解决这个问题。当master节点挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master。
每个sentinel节点其实就是一个redis实例,与主从节点不同的是sentinel节点作用是用于监控redis数据节。由于sentinel也有挂掉的可能,所以一般sentinel也会启动多个形成一个sentinel集合。
对于一组主从节点,sentinel只是在其外部额外添加的一组用于监控作用的redis实例。
Sentinal注意事项:
客户端不要直接连接Redis,而是连接sentinel的ip和port,由sentinel来提供具体的可提供服务的Redis实现。
sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义。
当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不许要担心。
一个sentinel或sentinel集群可以管理多个主从Redis。
sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了
定时监控任务
Redis通过三个定时任务完成对各个节点的监控:
1) 每隔10秒,每个Sentinel节点会向Master节点和Slave节点发送info命令获取最新的拓扑结构,比如:1
2
3
4
5# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.202,port=6379,state=online,offset=67874,lag=1
slave1:ip=192.168.1.203,port=6379,state=online,offset=68015,lag=0
对上述结果解析就可以找到相应的从节点。
该定时任务的作用:
向主节点发送info命令获取从节点信息,所以sentinel不需要显示配置监控从节点
当有新的从节点加入,可以立刻感知出来
节点不可达,或者故障转移后,可通过info命令实时更新拓扑信息
2) 每隔2秒,每一个sentinel 节点会向Redis数据节点的sentinel:hello 频道上发送该sentinel节点对于主节点的判断以及当前sentinel节点的信息,同时每一个sentinel节点也会订阅该频道。
3) 每隔1秒,每一个sentinel节点会向主节点,从节点,其余sentinel节点发送一条ping命令,做一次心跳检测,来确认这些节点当前是否可达。
主观下线和客观下线
当sentinel对主节点,从节点和其他sentinel节点发送ping命令进行心跳检测,如果超过down-after-milliseconds没有进行回复,Sentinel节点就会判定该节点失败,这个行为叫做主观下线。
当sentinel主观下线是主节点的时候,该sentinel会通过sentinel is-master-down-by-addr,命令向其他sentinel节点询问对主节点的判断,当超过一定个数(配置文件中配置的quorum数目和当前sentinel节点集合数的一半,两者较大值)的sentinel节点认为主节点确实存在问题,这时候sentinel节点会做出客观下线的决定。
领导者Sentinel节点的选举
当sentinel节点对于主节点已经做了客观下线时,会选举一个sentinal leader专门用来处理故障转移。Redis使用Raft算法实现领导者选举。
每一个在线的sentinel节点都有资格成为领导者,当它确认主节点主观下线的时候,会向其他节点发送sentinel is-master-down-by-addr命令,要求将自己设置为leader。
收到命令的sentinel节点,如果没有同意过其他其他sentinel的节点is-master-down-by-addr命令,将同一该请求,否则拒绝。
如果该sentinel发现自己的票数已经大于等于max(quorum,sentinel节点数/2+1),那么它将成为领导者。
如果此过程没有选举出leader,将进入下一次选举。
所以我们也可以这样理解,谁最先确认主节点客观下线,谁最有可能成为Leader。
故障转移
1)从从节点列表选择一个节点作为新的主节点,选择方法如下:
过滤不健康的从节点
选择slave-priority (可配置)最高的,如果存在即返回,不存在就继续
选择复制偏移量最大的从节点,如果存在即返回,不存在就继续
选择runid最小的从节点
2) sentinel leader会对前一步选择的从节点执行slaveof no one命令,让其成为主节点。
3)sentinel leader向剩余的从节点发送命令,让他们成为新的主节点的从节点,复制规则详见主从复制。
4) sentinel节点集合会将原来的主节点更新为从节点,并保持对其关注,当起恢复后命令其去复制新的主节点,成为新主节点的从节点。