哨兵模式搭建和原理总结

哨兵模式

简介

哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master并将所有slave连接到新的master。

哨兵的作用

对master和slave是否正常运行进行监控。 master存活检测、master与slave运行情况检测。通知当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。自动故障转移:断开master与slave连接,选取一个slave作为新的master,将其他slave连接到新的master,并告知客户端新的服务器地址。哨兵只进行消息传递,配置哨兵数量为单数。

配置哨兵

启动哨兵 redis-sentinel sentinel-端口号.conf

sentinel auth-pass <服务器名称> 连接服务器口令

sentinel monitor <自定义服务名称><主机地址><端口><主从服务器总量> 设置哨兵监听的主服务器信息,最后的参数决定了最终参与选举的服务器数量(-1)

sentinel down-after-milliseconds <服务名称><毫秒数(整数)> 指定哨兵在监控Redis服务时,判定服务器挂掉的时间周期,默认30秒 (30000),也是主从切换的启动条件之一

sentinel parallel-syncs <服务名称><服务器数(整数)> 指定同时进行主从的slave数量,数值越大,要求网络资源越高,要求约小,同步时间约长

sentinel failover-timeout <服务名称><毫秒数(整数)> 指定出现故障后,故障切换的最大超时时间,超过该值,认定切换失败, 默认3分钟

sentinel notification-script <服务名称><脚本路径> 服务器无法正常联通时,设定的执行脚本,通常调试使用。

实操

第一步,创建3个哨兵服务端,一个master服务端,两个slave服务端,两个哨兵客服端,一个master客服端,一个slave客服端。

第二步,查看哨兵配置文件,把文件移到conf目录下

移到conf目录success

第三步,设置编辑哨兵配置文件,把dir更改为redis data所在目录

第四步,把编辑好的端口为26379的哨兵复制到另外两个哨兵配置中。sed 's/26379/26380/g' sentinel-26379.conf > sentinel-26380.conf

第五步,复制一份slave服务端端口为6380的conf到6381中。

第六步,把data目录里面的数据全部都清掉。

第七部,启动master服务端,和2个slave端。启动端口为26379的哨兵。

使用 redis-cli -p 26379启动哨兵客服端,哨兵客服端里面不能进行set,get操作,只能使用info等查询指令。

可以看到关于哨兵的信息,连接了一个master,2个slave,一个哨兵。每启动一个哨兵日志就会多一条关于添加哨兵的信息

第八步,连接主从客服端。测试master是否正常,之后把master端服务shutdown,哨兵会显示日志,会推荐一个新的master,在原来的master上面测试命令发现失败。

工作原理

主从切换中经历三个阶段 : 监控 ,通知 , 故障转移

阶段一:监控阶段

用于同步各个节点的状态信息 ,获取各个sentinel和master的状态是否在线 ,master属性为 runid ,role:master 也包含各个slave的详细信息 ;根据master中的slave信息获取所有slave的状态,slave属性包含runid , role:slave,master_host、master_port ,offset等。

先获取各个哨兵之间的状态①哨兵给master发送信息(info),②通过cmd连接master③再发送信息给slave(info)

阶段二:通知阶段

哨兵之间相互通信,并发送信息给主从服务器

阶段三:故障转移阶段

如果一个哨兵挂了,他会向master发送信息,确认会被标记为主观下线,当超过一半的哨兵确认为主观下线状态,则master会标记为客观下线状态,哨兵自己会在服务器列表中挑选备选master,首先会更据在线的的状态,在排除响应慢的,之后与原master断开时间长的,就是选取最新数据的,最后根据优先原则判断,如优先级相同,就判断offset和runid大小。向新的master发送slave of no one,再向其他slave发送slave of 新masterIP端口。

原理总结

1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令。

2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。

3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。

4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。

5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令 。

6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 。

7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。

若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

posted @ 2020-11-12 23:02  Anthony-bird  阅读(673)  评论(0编辑  收藏  举报