Redis—听说你速度跟甲斗一样快?——哨兵_若没有足够数量的 sentinel 同意 master 已经下线

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

主观下线就是说如果服务器在down-after-milliseconds给定的毫秒数之内,没有返回Sentinel 发送的 PING 命令的回复,或者返回一个错误,那么 Sentinel 将这个服务器标记为主观下线(SDOWN)

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


### 1.sentinel 工作过程


1.每个sentinel向master、slave以及其他sentinel发送一个ping(1s一次)


2.每个sentinel向master的pub/sub频道道\_\_sentinel\_\_收发hello(包含sentinel ip:port及配置版本信息,所有sentinel通过这种方式达成共识)消息(两秒一次)


3.如果一个实例距离最后一次有效回复ping命令的时间超过down-after-milliseconds ,则这个实例会被Sentinel标记为主观下线


4.当有足够数量的sentinel(大于等于quorum)在指定的时间范围内确认master的确进入了主观下线状态,则master会被标记为客观下线


5.每个Sentinel 向所有Master,Slave发送 INFO 命令(正常十秒一次,标记客观下线后一秒一次)


6.若没有足够数量的Sentinel同意Master已经下线,或者若Master重新向Sentinel 的PING命令返回有效回复,Master的主观下线状态就会被移除  
 7.进行故障切换


8.维护sentinel配置版本及持久化sentinel节点及集群主从关系等信息到sentinel.conf


9.向外部客户端提供有效的redis-master连接信息(在故障切换后会更新)


### 2.leader选举


只能有一个sentinel能指挥完成整个集群的failover,所以当master客观下线时,需要进行sentinel leader选举  
 1.所有的sentinel都有公平被选举成领头的资格(前提未配置sentinel can-failover mymasterno,默认是yes)


2.所有的sentinel都有且只有一次将某个sentinel选举成领头的机会(在一轮选举中),一旦选举某个sentinel为领头,不能更改


3.sentinel设置领头sentinel规则是先到先得,一旦当前sentinel设置了领头sentinel,以后要求设置sentinel为领头请求都会被拒绝


4.每个发现服务客观下线的sentinel,都会要求其它sentinel将自己设置成领头


5.当一个sentinel(源sentinel)向另一个sentinel(目sentinel)发送is-master-down-by-addr ip port current\_epoch runid命令的时候,runid参数不是\*,而是sentinel运行id,就表示源sentinel要求目标sentinel选举其为领头


6.源sentinel会检查目标sentinel对其要求设置成领头的回复,如果回复的leader\_runid和leader\_epoch为源sentinel,表示目标sentinel同意将源sentinel设置成领头


7.如果某个sentinel被半数以上的sentinel设置成领头,那么该sentinel既为领头。


8.如果在限定时间内,没有选举出领头sentinel,暂定一段时间,再选举。



#注意事项:
1)redis集群需要开启外部网络访问,生产不能只侦听环回地址(伪集群测试无所谓了)
2)sentinel节点数量推荐是>=3个的奇数,quorum生效的前提是>=ceil(sentinel节点数量/2)
3)新增sentinel节点时请勿拷贝其它包含动态生成配置的sentinel配置文件


### 3.节点之间如何发现


我们发现sentinel配置文件里只配置了master的地址信息(host和port),并没有配置从节点以及其他哨兵节点的信息,但是我们在哨兵节点和主节点客户端通过`info replication`和`info sentinel`命令却能够发现它们,这是由哨兵的自动发现机制实现的


* 数据节点


一般情况下,哨兵节点每隔10秒(failover时每隔1秒)向主从节点发送info命令,以此获取主从节点的信息


首次执行时只知道给出的主节点信息,通过对主节点执行info命令就可以获取其从节点列表,如此周期执行,就可以不断发现新的节点



1.如果INFO命令目标是从节点:哨兵从返回信息中获取从节点所属的最新主节点ip和port,如果与历史记录不一致,则执行更新;获取从节点的优先级、复制偏移量以及与主节点的链接状态并更新。

2.如果INFO命令目标是主节点:哨兵从返回信息中获取主节点的从机列表,如果从节点是新增的,则将其加入监控列表。

3.无论目标是主节点还是从节点,都会记录其runId。

4.如果节点的角色发生变化,哨兵会记录节点新的角色及上报时间。若此时哨兵运行在TILT模式下,则什么都不做。否则,会执行主从切换相关的逻辑,我们后面再细说


* 哨兵节点


为了相互检查可用性及信息交互,哨兵之间是一直保持连接的,但是我们并没有配置告知它们彼此的存在,它们之间是怎么发现对方并交互的呢?


我们知道哨兵通过`INFO`命令发现了主节点及从节点的地址信息,而redis提供了一种发布订阅的消息通信模式,PUB/SUB。


哨兵们就是通过这一个约好的通道发布/订阅hello信息进行通信



每隔2秒,每个哨兵会通过它所监控的主节点、从节点向__sentinel__:hello通道发布一条hello消息。
每个哨兵会通过它所监控的主节点、从节点订阅__sentinel__:hello通道的消息,以此接收其他哨兵发布的信息



每个哨兵都会维护其监控的主节点信息,如果它接收到其他哨兵消息后,发现自己维护的信息已经过时,则立即执行更行过程。

如果哨兵接受到的信息没有在已有的监控列表中,就意味着发现了一个新的哨兵实例,此时会创建一个新的哨兵实例加入监控列表。在处理新增哨兵实例时,如果它与已存在的哨兵实例runId或者ip、port一致,将只保存最新的实例信息


## 哨兵部署


### 1.相关命令



redis-cli -h -p info sentinel

查看sentinel的整体信息

redis-cli -h -p sentinel masters

查看sentinel监控的所有redis-master信息

redis-cli -h -p sentinel slaves testmaster

查看sentinel监控的testmaster集群中redis-slave信息

redis-cli -h -p sentinel get-master-addr-by-name testmaster

获取testmaster组中的master ip和端口

redis-cli -h -p sentinel reset pattern

重置所有名字和给定模式pattern 相匹配的主服务器。pattern 参数是一个Glob 风格的模式

redis-cli -h -p 26379sentinel failover testmaster

强制对testmaster进行failover

redis-cli -h -p sentinel monitor

动态新增sentinel监控的redis集群

redis-cli -h -p sentinel remove

动态删除sentinel监控的redis集群

redis-cli -h -p sentinel

动态新增sentinel监控集群的配置,类似redis的CONFIG SET命令


### 2.配置字段说明



sentinel monitor mymaster 192.168.149.128 6379 2
#当前Sentinel节点监控 192.168.149.128 6379 这个主节点
#2代表判断主节点失败至少需要2个Sentinel节点节点同意
#mymaster是redis监控主节点的别名

sentinel down-after-milliseconds mymaster 10000
#每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过10000毫秒且没有回复,则判定不可达

sentinel parallel-syncs mymaster 1
#当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起同步操作,限制每次向新的主节点发起同步操作的从节点个数为1

sentinel failover-timeout mymaster 30000
#故障转移超时时间为30000毫秒

sentinel auth-pass
#如果Sentinel监控的主节点配置了密码,可以通过sentinel auth-pass配置通过添加主节点的密码,防止Sentinel节点无法对主节点进行监控
#例如:sentinel auth-pass mymaster 88888888

sentinel notification-script
#在故障转移期间,当一些警告级别的Sentinel事件发生(指重要事件,如主观下线,客观下线等)时,会触发对应路径的脚本,想脚本发送相应的事件参数
#例如:sentinel notification-script mymaster /var/redis/notify.sh

sentinel client-reconfig-script
#在故障转移结束后,触发应对路径的脚本,并向脚本发送故障转移结果的参数。
#例如:sentinel client-reconfig-script mymaster /var/redis/reconfig.sh


![在这里插入图片描述](https://img-blog.csdnimg.cn/b3c30bdb284241889d6e6aaa9da8e334.png)


* master配置



[root@master ~]# vim /etc/redis/redis-sentinel.conf
bind0.0.0.0
port 26379
pidfile /var/redis/sentinel.pid
dir /var/lib/redis
daemonize yes
protected-mode no
logfile /var/log/redis/sentinel.log
sentinel monitor mymaster 192.168.149.128 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 30000



[root@master ~]# systemctl restart redis-sentinel


* slave1配置



[root@slave1 ~]# vim /etc/redis/redis-sentinel.conf
bind0.0.0.0
port 26379
daemonize yes
protected-mode no
dir /var/lib/redis
logfile /var/log/redis/sentinel.log
pidfile /var/redis/sentinel.pid
sentinel monitor mymaster 192.168.149.128 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 30000
sentinel parallel-syncs mymaster 1



[root@slave1 ~]# systemctl restart redis-sentinel


* slave2配置



最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

5)]

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值