一些关于redis哨兵模式的总结

redis的哨兵模式,其实是主从模式的升级,主从模式适用于当请求量大的时候,多个从节点可以分摊主节点的请求量压力,但只有主节点可以进行存数据,从节点一般都只能苟进行取数据的操作,不过可以通过redis.conf文件里面的相关参数进行配置,设定从节点也可以进行存数据。

哨兵模式,则是在主从模式的基础上,增加了“哨兵节点”的配置(sentinel),哨兵节点不参与数据存取,它的行为正如它的名词解释,负责监控主从节点,当主节点出现宕机情况了,哨兵会判断是否将从节点推举为主节点。

具体点讲,这里的监控,其实是哨兵会不间断的向主从节点发送PING请求,若是超过一定时间(可配置,sentinel.conf文件)未收到回复,则判定该节点状态为down(宕机),哨兵最好是三个起步,奇位个数。虽然单哨兵节点即可实现哨兵模式,但是单哨兵节点,同样有单节点的隐患(哨兵节点其实也是一个redis节点),倘若有多个哨兵,那在运行期间,除了向主从节点发送ping请求,哨兵之间也会互相通信,若是有某个哨兵节点状态为down了,则选举主节点时,该节点会被剔除投票资格。

讲一下最重要两条的哨兵配置吧

redis-sentinelconf文件里有这么两个配置:
1sentinel monitor <masterName> <ip> <port> <quorum>

四个参数含义:
masterName这个是对某个master+slave组合的一个区分标识(一套sentinel是可以监听多套master+slave这样的组合的)。
ip port 就是master节点的 ip 端口号。
quorum这个参数是进行客观下线的一个依据,意思是至少有 quorum sentinel主观的认为这个master有故障,才会对这个master进行下线以及故障转移。因为有的时候,某个sentinel节点可能因为自身网络原因,导致无法连接master,而此时master并没有出现故障,所以这就需要多个sentinel都一致认为该master有问题,才可以进行下一步操作,这就保证了公平性和高可用。

2sentinel down-after-milliseconds <masterName> <timeout>
这个配置其实就是进行主观下线的一个依据masterName这个参数不用说了,timeout是一个毫秒值,表示:如果这台sentinel超过timeout这个时间都无法连通master包括slaveslave不需要客观下线,因为不需要故障转移)的话,就会主观认为该master已经下线(实际下线需要客观下线的判断通过才会下线)

那么,多个sentinel之间是如何达到共识的呢?
这就是依赖于前面说的第二个定时任务,某个sentinel先将master节点进行一个主观下线,然后会将这个判定通过sentinel is-master-down-by-addr这个命令问对应的节点是否也同样认为该addrmaster节点要做客观下线。最后当达成这一共识的sentinel个数达到前面说的quorum设置的这个值时,就会对该master节点下线进行故障转移。quorum的值一般设置为sentinel个数的二分之一加1,例如3

主观下线
所谓主观下线(Subjectively Down 简称 SDOWN)指的是单个Sentinel实例对服务器做出的下线判断,即单个sentinel认为某个服务下线(有可能是接收不到订阅,之间的网络不通等等原因)。
主观下线就是说如果服务器在down-after-milliseconds给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(SDOWN )。
sentinel会以每秒一次的频率向所有与其建立了命令连接的实例(master,从服务,其他sentinel)发ping命令,通过判断ping回复是有效回复,还是无效回复来判断实例时候在线(对该sentinel来说是主观在线)。
sentinel配置文件中的down-after-milliseconds设置了判断主观下线的时间长度,如果实例在down-after-milliseconds毫秒内,返回的都是无效回复,那么sentinel回认为该实例已(主观)下线,修改其flags状态为SRI_S_DOWN。如果多个sentinel监视一个服务,有可能存在多个sentineldown-after-milliseconds配置不同,这个在实际生产中要注意。

客观下线
客观下线(Objectively Down 简称 ODOWN)指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断,然后开启failover
客观下线就是说只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(ODOWN)。
只有当master被认定为客观下线时,才会发生故障迁移。
sentinel监视的某个服务主观下线后,sentinel会询问其它监视该服务的sentinel,看它们是否也认为该服务主观下线,接收到足够数量(这个值可以配置)的sentinel判断为主观下线,既任务该服务客观下线,并对其做故障转移操作。
sentinel通过发送 SENTINEL is-master-down-by-addr ip port current_epoch runid,(ip:主观下线的服务idport:主观下线的服务端口,current_epochsentinel的纪元,runid*表示检测服务下线状态,如果是sentinel 运行id,表示用来选举领头sentinel)来询问其它sentinel是否同意服务下线。
一个sentinel接收另一个sentinel发来的is-master-down-by-addr后,提取参数,根据ip和端口,检测该服务时候在该sentinel主观下线,并且回复is-master-down-by-addr,回复包含三个参数:down_state1表示已下线,0表示未下线),leader_runid(领头sentinal id),leader_epoch(领头sentinel纪元)。
sentinel接收到回复后,根据配置设置的下线最小数量,达到这个值,既认为该服务客观下线。
客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对失效的主服务器执行自动故障迁移操作。

       此外,哨兵模式配置过程中,倘若主节点,也就是master节点有配置 requirepass参数,不管是从节点还是哨兵节点的配置,都要配置 masterauth这个参数,值同上述的requirepass参数,否则在进行主从模式搭建,哨兵扫描时,会出现无法找到对应master节点的情况,谨记。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值