09、redis哨兵的多个核心底层原理的深入解析(包含slave选举算法)
2019独角兽企业重金招聘Python工程师标准>>>
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宕机
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哨兵都允许了主备切换,那么某个哨兵就会执行主备切换操作,此时首先要选举一个slave来
会考虑slave的一些信息
(1)跟master断开连接的时长
(2)slave优先级
(3)复制offset
(4)run id
如果一个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
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配置的
转载于:https://my.oschina.net/u/3915790/blog/3056294
09、redis哨兵的多个核心底层原理的深入解析(包含slave选举算法)相关推荐
- python 底层原理_Python字典的核心底层原理讲解
字典对象的核心是散列表.散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket.每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用.所有 bucket 结构和 ...
- Redis网络多路IO复用以及底层原理
老早听说过Redis是单线程,但指的是什么单线程,为什么单线程,底层实现原理是什么? 单线程指的是Redis中处理网络请求的模块是单线程处理的,并非指整一个Redis软件都是单线程,肯定有其它线程做其 ...
- python字典内存分析_(一)Python入门-3序列:18字典-核心底层原理-内存分析-查找值对象过程...
一:根据键查找"键值对"的底层过程 明白一个键值对是如何存储到数组中的,根据键对象取到值对象,理解起来就 简单了. >>> a.get("name&qu ...
- Runtime底层原理--动态方法解析总结
方法的底层会编译成消息,消息进行递归,先从实例方法开始查找,到父类最后到NSObject.如果在汇编部分快速查找没有找到IMP,就会进入C/C++中的动态方法解析进入lookUpImpOrForwar ...
- 集合深度学习07—Set、HashSet、LinkedHashSet、TreeSet、 底层原理 源码解析
一.Set接口 特点: 唯一 无序(相对List接口部分来说的,无序不等于随机) 没有索引相关的方法 遍历方式: 迭代器 增强 for 循环(底层还是 Itr 迭代器) 二.HashSet 1. Ha ...
- Runtime底层原理--动态方法解析、消息转发源码分析
了解了Runtime函数含义,我们就可以直接使用Runtime的API了,那接下来继续探究Runtime的源码,经过源码分析来更加深刻的了解Runtime原理. 开发应用 都知道Runtime很重要, ...
- iic总线从机仲裁_IIC协议底层原理超详细解析!示波器,逻辑分析仪多图预警
1. 协议基础 1.1. 协议简介 IIC-BUS(Inter-IntegratedCircuit Bus)最早是由PHilip半导体(现在被NXP收购)于1982年开发.主要是用来方便微控制 ...
- REDIS哨兵【Sentinel】模式+哨兵的核心知识点+redis哨兵主从切换的数据丢失问题+上一章铺垫的【异步复制数据丢失问题】+【集群脑裂】
1.redis哨兵模式的前言: 一年一度的问题来了,为啥子要用redis的哨兵模式的呢? 简单粗暴的理解下子,顺带开个玩笑,没有理解好,还望不要见笑: 其实redis的哨兵模式,个人理解:只是说法搞大 ...
- mysql哨兵机制_Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了
前面我们基于实际案例搭建了缓存高可用方案(分布式缓存高可用方案,我们都是这么干的)同时提到了redis主从架构下是如何保证高可用的,讲到了它是通过redis sentinel的机制来实现的. 今天我们 ...
最新文章
- netbackup错误之can not connect on socket(25)
- shell + mysql
- Task三个列子的分享
- 一篇文章指明做JavaWeb项目需要的前置知识+完整项目初解读(萌新必看,十分友好)
- 中科院院士:最让人讨厌的10种研究生导师
- ITextSharp导出PDF表格和图片(C#)
- RMI:Java中的分布式计算框架
- 使用react定义组件的两种方式
- 一般毕业论文的查重要求有哪些?
- PHPWAMP开启SSL,PHPWAMP配置ssl证书
- Excel 批量删除自定义名称
- 两个经纬度偏角_[转载]根据两点的经纬度求方位角和距离,等
- 【转载】外设使用Tips之MSCAN接收ID滤波器设置
- 基于Ext的开发实例_模拟Windows桌面
- element-ui 表格使用多选 如何回显打勾
- directives 引用this
- SpringCloud - LCN分布式事务框架
- 薄冰-英语语法[1]-名词的格 (易混知识)
- POI-word模板替换
- 服务网格——服务网格架构(概念原理2)
热门文章
- python自动化办公培训排名-盘点使用Python进行自动化办公所需要的知识点
- 关于python中程序流程结构-Python程序结构
- python xpath语法-Python Xpath语法
- pythonweb开发-pythonWeb开发
- 川大计算机考研2020招生数,四川大学等大学,2020年研究生招生简章发布,这3个信息很重要!...
- spring中事件发布设计与实现
- NameServer的启动
- LeetCode Path Sum III(前缀和)
- Intellij idea快速查看Java类字节码
- LeetCode Bulb Switcher(约数个数为奇数)