zoukankan      html  css  js  c++  java
  • 哨兵模式搭建和原理总结

    哨兵模式

    简介

    哨兵(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 的主观下线状态就会被移除。

  • 相关阅读:
    uva11235 FrequentValues (ST表)
    hdu5449 Robot Dog (树形dp+倍增lca)
    [BZOJ1637][Usaco2007 Mar]Balanced Lineup
    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理
    Luogu1119灾后重建
    [APIO2012]派遣
    [HNOI2004]宠物收养场
    [USACO14DEC] 驮运Piggy Back
    [USACO14JAN]滑雪等级Ski Course Rating
    [CODEVS3366] 矿石
  • 原文地址:https://www.cnblogs.com/zzy8080/p/13966847.html
Copyright © 2011-2022 走看看