哨兵模式主从数据同步

  • 1. 前言
  • 2.哨兵机制的基本流程
  • 3.如何选定新主库

1. 前言

  无论是写服务中断,还是从库无法进行数据同步,都是不能接受的。所以,如果主库挂了,我们就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。这就涉及到三个问题:

  • 主库真的挂了吗?
  • 该选择哪个从库作为主库?
  • 怎么把新主库的相关信息通知给从库和客户端呢?

  这就要提到哨兵机制了。在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移的这三个问题。

2.哨兵机制的基本流程

  哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。

  • 我们先看监控。监控是指哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行。如果从库没有在规定时间内响应哨兵的 PING 命令,哨兵就会把它标记为“下线状态”;同样,如果主库也没有在规定时间内响应哨兵的 PING 命令,哨兵就会判定主库下线,然后开始自动切换主库的流程。
  • 这个流程首先是执行哨兵的第二个任务,选主。主库挂了以后,哨兵就需要从很多个从库里,按照一定的规则选择一个从库实例,把它作为新的主库。这一步完成后,现在的集群里就有了新主库。
  • 然后,哨兵会执行最后一个任务:通知。在执行通知任务时,哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。同时,哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。

      在这三个任务中,通知任务相对来说比较简单,哨兵只需要把新主库信息发给从库和客户端,让它们和新主库建立连接就行,并不涉及决策的逻辑。但是,在监控和选主这两个任务中,哨兵需要做出两个决策:
  • 在监控任务中,哨兵需要判断主库是否处于下线状态;
  • 在选主任务中,哨兵也要决定选择哪个从库实例作为主库。

主观下线和客观下线
  哨兵进程会使用 PING 命令检测它自己和主、从库的网络接情况,用来判断实例的状态。如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”
  如果检测的是从库,那么,哨兵简单地把它标记为“主观下线”就行了,因为从库的下线影响一般不太大,集群的对外服务不会间断。
  但是,如果检测的是主库,那么,哨兵还不能简单地把它标记为“主观下线”,开启主从切换。因为很有可能存在这么一个情况:那就是哨兵误判了,其实主库并没有故障。一旦哨兵判断主库下线了,就会开始选择新主库,并让从库和新主库进行数据同步,这个过程本身就会有开销,例如,哨兵要花时间选出新主库,从库也需要花时间和新主库同步。而在误判的情况下,主库本身根本就不需要进行切换的,所以这个过程的开销是没有价值的。正因为这样,我们需要判断是否有误判,以及减少误判。
  哨兵机制也是类似的,它通常会采用多实例组成的集群模式进行部署,这也被称为哨兵集群。引入多个哨兵实例一起来判断,就可以避免单个哨兵因为自身网络状况不好,而误判。
  在判断主库是否下线时,不能由一个哨兵说了算,只有大多数的哨兵实例,都判断主库已经“主观下线”了,主库才会被标记为“客观下线”,这个叫法也是表明主库下线成为一个客观事实了。这个判断原则就是:少数服从多数。同时,这会进一步触发哨兵开始主从切换流程。
如下图所示,
  Redis 主从集群有一个主库、三个从库,还有三个哨兵实例。在图片的左边,哨兵 2 判断主库为“主观下线”,但哨兵 1 和 3 却判定主库是上线状态,此时,主库仍然被判断为处于上线状态。在图片的右边,哨兵 1 和 2 都判断主库为“主观下线”,此时,即使哨兵 3 仍然判断主库为上线状态,主库也被标记为“客观下线”了。

  简单来说,“客观下线”的标准就是,当有 N 个哨兵实例时,最好要有 N/2 + 1 个实例判断主库为“主观下线”,才能最终判定主库为“客观下线”。这样一来,就可以减少误判的概率,也能避免误判带来的无谓的主从库切换。(当然,有多少个实例做出“主观下线”的判断才可以,可以由 Redis 管理员自行设定)。

3.如何选定新主库

  一般来说,我把哨兵选择新主库的过程称为“筛选 + 打分”。简单来说,我们在多个从库中,先按照一定的筛选条件,把不符合条件的从库去掉。然后,我们再按照一定的规则,给剩下的从库逐个打分,将得分最高的从库选为新主库,如下图所示:

  在选主时,除了要检查从库的当前在线状态,还要判断它之前的网络连接状态。如果从库总是和主库断连,而且断连次数超出了一定的阈值,我们就有理由相信,这个从库的网络状况并不是太好,就可以把这个从库筛掉了。具体怎么判断呢?你使用配置项 down-after-milliseconds * 10。其中,down-after-milliseconds 是我们认定主从库断连的最大连接超时时间。如果在 down-after-milliseconds 毫秒内,主从节点都没有通过网络联系上,我们就可以认为主从节点断连了。如果发生断连的次数超过了 10 次,就说明这个从库的网络状况不好,不适合作为新主库。
  好了,这样我们就过滤掉了不适合做主库的从库,完成了筛选工作。
  接下来就要给剩余的从库打分了。我们可以分别按照三个规则依次进行三轮打分,这三个规则分别是从库优先级、从库复制进度以及从库 ID 号。只要在某一轮中,有从库得分最高,那它就是主库了,选主过程到此结束。如果没有出现得分最高的从库,那么就继续进行下一轮。

  • 第一轮:优先级最高的从库得分高
      用户可以通过 slave-priority 配置项,给不同的从库设置不同优先级。比如,你有两个从库,它们的内存大小不一样,你可以手动给内存大的实例设置一个高优先级。在选主时,哨兵会给优先级高的从库打高分,如果有一个从库优先级最高,那么它就是新主库了。如果从库的优先级都一样,那么哨兵开始第二轮打分。

  • 第二轮:和旧主库同步程度最接近的从库得分高
      这个规则的依据是,如果选择和旧主库同步最接近的那个从库作为主库,那么,这个新主库上就有最新的数据。
      如何判断从库和旧主库间的同步进度呢?
      主从库同步时有个命令传播的过程。在这个过程中,主库会用master_repl_offset 记录当前的最新写操作在 repl_backlog_buffer 中的位置,而从库会用 slave_repl_offset 这个值记录当前的复制进度
      此时,我们想要找的从库,它slave_repl_offset 需要最接近 master_repl_offset。如果在所有从库中,有从库的 slave_repl_offset 最接近 master_repl_offset,那么它的得分就最高,可以作为新主库
      就像下图所示,旧主库的 master_repl_offset 是 1000,从库 1、2 和 3 的slave_repl_offset 分别是 950、990 和 900,那么,从库 2 就应该被选为新主库。

      当然,如果有两个从库的 slave_repl_offset 值大小是一样的(例如,从库 1 和从库 2 的slave_repl_offset 值都是 990),我们就需要给它们进行第三轮打分了。

  • 第三轮:ID 号小的从库得分高。
      每个实例都会有一个 ID,这个 ID 就类似于这里的从库的编号。目前,Redis 在选主库时,有一个默认的规定:在优先级和复制进度都相同的情况下,ID 号最小的从库得分最高,会被选为新主库。到这里,新主库就被选出来了,“选主”
      这个过程就完成了。我们再回顾下这个流程。首先,哨兵会按照在线状态、网络状态,筛选过滤掉一部分不符合要求的从库,然后,依次按照优先级、复制进度、ID 号大小再对剩余的从库进行打分,只要有得分最高的从库出现,就把它选为新主库。

06 | 哨兵机制: 主库挂了, 如何不间断服务相关推荐

  1. Redis核心技术与实战-学习笔记(七)哨兵机制

    一.主库挂了,如何不间断服务? 主库挂了,需要运行一个新的主库:将从库切换为主库.这就涉及到三个问题: 主库真的挂了吗? 选择哪个从库作为主库? 如何把新主库相关信息通知给从库和客户端 Redis主从 ...

  2. Zookeeper实现Master选举(哨兵机制)

    master选举使用场景及结构 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作.此类问题现在多采用master-salve模式,也就是常说的主从模式, ...

  3. 为什么至少三个哨兵_Redis集群哨兵机制

    Redis主从复制 什么是主从复制 ​ 持久化保证了即使 Redis 服务重启也不会丢失数据,因为 Redis 服务重启后会将硬盘上持久化的数据恢复到内存中,但是当 Redis 服务器的硬盘损坏了可能 ...

  4. Redis总结以及击穿,雪崩,缓存穿透,哨兵机制解答

    Redis Redis是什么? Redis 是一个使用 C 语言开发的高速缓存数据库. Redis进行数据库切换命令 SELECT  index   数据库索引号index用数字值指定,以0作为起始索 ...

  5. Redis——Redis哨兵机制原理

    摘要 redis的主从复制是redis系统的高可用前提,从库宕机依然可以将请求发送给主库或者其他从库,但是 Master 宕机,只能响应读操作,写请求无法再执行.所以主从复制架构面临一个严峻问题,主库 ...

  6. 10蚂蚁-分布式解决方案——3.ZooKeeper实现选举策略与哨兵机制

    Zookeeper实现哨兵机制 master选举使用场景及结构 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作.此类问题现在多采用master-sal ...

  7. 分布式缓存架构(3)-Redis事务主从复制哨兵机制

    Redis的主从复制 概述: redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库,一类是从数据库,主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是 ...

  8. java redis 主从 哨兵_Redis主从复制与哨兵机制

    Redis主从复制 1.redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数 ...

  9. redis哨兵机制在集群中的应用

    一.数据存放的2种方式 假设来了一批数据,怎么放入redis集群? 1.分片 2.镜像全量(lvs后面放的就是镜像全量) 对于redis来讲,镜像全量这种方式无效.比如一台节点内存4G,3台也是4G, ...

最新文章

  1. 测试在强电磁场下基于HALL的电流传感器 ACS712-5A是否会有到影响?
  2. 自动化运维工具SaltStack详细部署
  3. 【Java】登录操作中随机生成验证码的工具类
  4. CodeForces - 1529E Trees of Tranquillity(贪心+线段树)
  5. python做excel表格代码_python操作excel表格
  6. 从Airbnb的发展历程和网易云的大起大落看IT行业创新(第5周课后作业)
  7. MySQL入门之PHP的MySQL数据库编程
  8. [Perl系列—] 2. Perl 中的引用使用方法
  9. 成为高级程序员的 10 个步骤
  10. 计算机关机管理软件,局域网管理利器--大势至远程开关机工具
  11. Java之—hutool工具类二维码生成跟背景图合并输出
  12. LWM2M简介-学习记录
  13. 微型计算机原理与接口技术 考题,微机原理与接口技术试题答案
  14. 数据库实验——T-SQL编程
  15. MSM8960处理器概述
  16. 帝国php获取栏目id,帝国CMS如何获取子栏目
  17. 边缘化(marginalization )和稀疏化(sparsification)---ceres-solver
  18. 为何quot;矮矬穷quot;出身的成功…
  19. iOS系统越狱研究现状梳理
  20. 吴军老师《给中学生/大学生的书单》----Yohao整理

热门文章

  1. HPU-- 1190 確率
  2. OO Design之SOLID原则
  3. 里bl2和bl3为什么分开_分手挽回:为什么不建议过早同居
  4. python type instance_Python type, types and isinstance()使用
  5. 如何减小电压跟随器输出电阻_机器人如何保护电池的电源管理系统 免受热坏?(附:PDF文档下载)...
  6. 设置行内元素宽高和背景色后,行内元素文本不水平垂直居中解决方案
  7. Windows10选择文件打开方式没有始终允许的解决方案
  8. 计算机专业新老生交流会ppt,铜陵学院实践部新老生交流会.ppt
  9. linux qt libs,linux下qt使用第三方库的那些事
  10. 吴恩达 matlab,吴恩达机器学习记录--Matlab 一些基本操作