三个定时监控任务

1.每隔十秒,每隔sentinel节点会向主节点和从节点发送info命令,获取最新的拓扑结构

2.每隔两秒,每个sentinal节点会向redis数据节点的_sentinel_:hello频道上发送sentinel节点对主节点的判断以及sentinel节点的信息,同时每个sentinel也会订阅该频道(发现新节点,sentinel节点之间交换主节点的状态)

3.每隔一秒,每个sentinel节点会向主节点,从节点,其余sentinel节点发送一条ping命令,做一次心跳检测,来确定这些节点是否可达。

1、sdown(主观下线)和odown(客观下线)转换机制

sdown和odown两种失败状态

sdown是主观宕机,就一个哨兵如果自己觉得一个master宕机了,那么就是主观宕机

odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观宕机

sdown达成的条件很简单,如果一个哨兵ping一个master,超过了is-master-down-after-milliseconds指定的毫秒数之后,就主观认为master宕机

sdown到odown转换的条件很简单,如果一个哨兵在指定时间内,收到了quorum指定数量的其他哨兵也认为那个master是sdown了,那么就认为是odown了,客观认为master宕机

领导者sentinel节点选举

redis使用rafr算法实现领导选举 https://raft.github.io/

redis sentinel领导者选举的思路:

1.每个在线的sentinel节点都有资格成为领导者,当它确认主节点主观下线时,会向其他sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者

2.收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的sentinel is-master-down-by-addr命令,将同意该请求,否则拒绝

3.如果该Sentinel节点发现自己的票数已经大于等于Max(quorum,num(sentinels)/2+1),那么它将成为领导者

4.如果此过程没有选举出领导者,将进入下一次选举

2、哨兵集群的自动发现机制

哨兵互相之间的发现,是通过redis的pub/sub系统实现的,每个哨兵都会往__sentinel__:hello这个channel里发送一个消息,这时候所有其他哨兵都可以消费到这个消息,并感知到其他的哨兵的存在

每隔两秒钟,每个哨兵都会往自己监控的某个master+slaves对应的__sentinel__:hello channel里发送一个消息,内容是自己的host、ip和runid还有对这个master的监控配置

每个哨兵也会去监听自己监控的每个master+slaves对应的__sentinel__:hello channel,然后去感知到同样在监听这个master+slaves的其他哨兵的存在

每个哨兵还会跟其他哨兵交换对master的监控配置,互相进行监控配置的同步

3、slave配置的自动纠正

哨兵会负责自动纠正slave的一些配置,比如slave如果要成为潜在的master候选人,哨兵会确保slave在复制现有master的数据; 如果slave连接到了一个错误的master上,比如故障转移之后,那么哨兵会确保它们连接到正确的master上

4、slave->master选举算法(故障转移)

如果一个master被认为odown了,而且majority哨兵都允许了主备切换,那么某个哨兵就会执行主备切换操作,

1 此时首先要选举一个slave来

会考虑slave的一些信息

(1)跟master断开连接的时长

(2)slave优先级最高的从节点列表

(3)复制offset最大的从节点(复制的最完整)

(4)runid最小的从节点

如果一个slave跟master断开连接已经超过了down-after-milliseconds的10倍,外加master宕机的时长,那么slave就被认为不适合选举为master

(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state

接下来会对slave进行排序

(1)按照slave优先级进行排序,slave priority越低,优先级就越高

(2)如果slave priority相同,那么看replica offset,哪个slave复制了越多的数据,offset越靠后,优先级就越高

(3)如果上面两个条件都相同,那么选择一个run id比较小的那个slave

2 Sentinel领导者节点会对第一步选举出来的从节点执行slaveof no one 命令让其成为主节点

3 Sentinel领导者节点会向剩余的从节点发送命令,让他们成为新主节点的从节点,复制规则和parallel-syncs参数有关

4 Sentinel节点集合会将原来的主节点更新为从节点,并保持着对其关注,当其恢复后命令它去复制新的主节点

5、quorum(最终要达到的票数)和majority

每次一个哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个哨兵来做切换,这个哨兵还得得到majority哨兵的授权,才能正式执行切换

如果quorum < majority,比如5个哨兵,majority就是3,quorum设置为2,那么就3个哨兵授权就可以执行切换

但是如果quorum >= majority,那么必须quorum数量的哨兵都授权,比如5个哨兵,quorum是5,那么必须5个哨兵都同意授权,才能执行切换

6、configuration epoch

哨兵会对一套redis master+slave进行监控,有相应的监控的配置

执行切换的那个哨兵,会从要切换到的新master(salve->master)那里得到一个configuration epoch,这就是一个version号,每次切换的version号都必须是唯一的

如果第一个选举出的哨兵切换失败了,那么其他哨兵,会等待failover-timeout时间,然后接替继续执行切换,此时会重新获取一个新的configuration epoch,作为新的version号

7、configuraiton传播

哨兵完成切换之后,会在自己本地更新生成最新的master配置,然后同步给其他的哨兵,就是通过之前说的pub/sub消息机制

这里之前的version号就很重要了,因为各种消息都是通过一个channel去发布和监听的,所以一个哨兵完成一次新的切换之后,新的master配置是跟着新的version号的

其他的哨兵都是根据版本号的大小来更新自己的master配置的

redis 哨兵原理相关推荐

  1. Redis追命连环问,你能回答到第几问?(下)主从复制及哨兵原理

    上次的Redis连环问问到了Redis是什么,Redis支持的数据类型,缓存雪崩缓存穿透缓存击穿,内存淘汰策略和持久化策略等. ​ Redis常见面试题连环问,你能回答到第几问?(上) Redis常见 ...

  2. Redis实战原理解析

    Redis简介:Redis 是完全开源免费的,是一个高性能的key-value数据库,目前市面上主流的no-sql数据库有Redis.Memcache.Tair(淘宝自研发),Redis的官网:htt ...

  3. 深入学习Redis高可用架构:哨兵原理及实践

    Redis 主从复制的作用有数据热备.负载均衡.故障恢复等:但主从复制存在的一个问题是故障恢复无法自动化. 本文将要介绍的哨兵,它基于 Redis 主从复制,主要作用便是解决主节点故障恢复的自动化问题 ...

  4. Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别

    前一篇文章高并发架构系列:Redis为什么是单线程.及高并发快的3大原因详解谈了Redis高并发快的3个原因,本篇主要谈Redis的高可用,两篇合起来就可以把redis的高并发和高可用搞清楚了. 谈到 ...

  5. Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别

    谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能. ...

  6. Redis哨兵 详解 原理解析

    Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复. 1.1.哨兵原理 1.1.1.集群结构和作用 哨兵的结构如图: 哨兵的作用如下: 监控:Sentinel 会不断检查您的ma ...

  7. Redis哨兵模式(原理剖析)

    Redis哨兵模式(原理剖析) 前言 一.Sentinel模式概述 二.配置哨兵模式 1.哨兵配置 1.1 优点: 1.2 缺点: 总结 前言 在Redis中主从复制解决高可用的方案是:当主节点服务器 ...

  8. 带哨兵节点的链_深入学习Redis高可用架构:哨兵原理及实践

    原标题:深入学习Redis高可用架构:哨兵原理及实践 " 在上篇文章<深入学习 Redis 高可用的基石:主从复制>中曾提到,Redis 主从复制的作用有数据热备.负载均衡.故障 ...

  9. Redis 哨兵模式原理

    主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用.这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式. 一.哨兵 ...

最新文章

  1. 在Ubuntu 14.04.5 64bit上安装git GUI客户端GitKraken
  2. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]
  3. 波场DApp数据分析
  4. javaweb项目搭建ehcache缓存系统
  5. div显示在上层_将某个div层显示在最上面(总结)
  6. C# 虹软离线SDK引擎 人脸识别
  7. Linux ---yum源详解
  8. Ubuntu 汉化及kate汉化和使用自带终端的解决方式
  9. VEP视频文件怎么转换成普通视频文件mp4
  10. css 鼠标划过 图片放大 实现
  11. 网上商城-java基础练习项目-仿照雷蛇商城
  12. 怎么判断苹果开发者账号是否认证了
  13. 基于Java Servlet图片服务器
  14. 微微一笑很倾城(3)
  15. 物联网卡开启养老新模式
  16. 依托飞凌FETA40i-C核心板实现光时域反射仪的原理应用
  17. windows记事本特别注意
  18. Fineplus v1.4 显IP For QQ2007
  19. 【开源项目】Flutter版 玩安卓,android开发模拟器推荐
  20. 受限玻尔兹曼机(RBM)在Tensorflow的实现

热门文章

  1. 【前端】Vue2全家桶案例《看漫画》之六、图片阅读页
  2. 【小程序专栏】多种开发方式对比-跨端?低代码?原生?还是云开发?
  3. hsqldb数据库启动遇到的问题
  4. 春节假期北京收费公路免费通行 高峰日交通量或超200万
  5. Oracle必备知识
  6. Android-8.0应用夜间模式在旋转屏幕等操作后导致的日夜间模式切换混乱问题
  7. python写一个智能AI的狼吃羊
  8. Ubuntu下几种常用的文本编辑器
  9. 数据对账组件Data-Reconcile:高效可信对账利器
  10. linux之sudo apt-get install