当前位置: 首页 > news >正文

【学习笔记】Reids的哨兵机制

【学习笔记】Reids的哨兵机制

文章目录

  • 【学习笔记】Reids的哨兵机制
    • 前言
    • 什么是哨兵机制?
    • 如何判断主库是否挂掉?
    • 主从库的切换和消息的通知

前言


什么是哨兵机制?

哨兵机制(sentinel) 是Redis解决高可用的一种解决方案:它是由一个或者多个sentinel 实例组成的一个sentinel 系统。

哨兵架构图:

在这里插入图片描述

作用:

  • 监控:Sentinel 会不断检查您的master和slave是否按预期工作。
  • 选主:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主。
  • 通知: Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端,比如告诉客户端master节点变更了,这样客户端写数据的时候才不会找错节点。

为什么需要哨兵机制?

在上节的 Redis的主从复制(此处跳转文章链接) 我们讲到过一个 主库 可以对应多个 从库 ,如果挂掉一个 从库 的话客户端可以访问其他 从库。这并不影响客户端的体验。但是如果是 主库 挂掉呢? 那么客户端的 写命令 又该如何执行呢?

在这里插入图片描述

主库 挂掉我们就需要选择一个 从库 来当主库。那么就需要解决一下三个问题:

  • 主库 是否真的挂掉?
  • 切换哪个 从库 比较好呢?
  • 如何通知把这个消息通知给其他 从库客户端 呢?

其实我们可以把 主库 比作 皇帝 ,当一个皇帝驾崩当然需要由他的很多个儿子中选择继承人的嘛。

第一件事情就是要确认 老皇帝 是否真的驾崩?第二要选择下一任接班人是谁呢?是帅气逼人的太子,还是能文能武的八阿哥呢?第三如果 新皇 登基 ,如何去通知 合作的国家(客户端) 和 远在外地的 其他皇子(其他从库) 呢?

听过上述那接下来我们就一一解释上述问题。

如何判断主库是否挂掉?

一般情况 哨兵 会向 主库和从库 每个1秒发送 ping 。如果 主库和从库 正常,则就会给哨兵一个 回应 。那么 哨兵 就能判断是否 主库和从库 是否正常了。

在这里插入图片描述

主库 在规定的时间内没有回复 哨兵 ,则会被认为是主观下线。如果是网络拥堵造成 主库 不能及时返回响应,那么是不是就会出现误判呢?所以我们就需要多个 哨兵 (三个起步) 来进行判断。

当然也会有客观下线。那怎么让 主库 客观下线呢?我们可以看下图:

在这里插入图片描述

也就是 哨兵之间的投票制 ,上图中的 三大于二,也就会导致 主库 客观下线,然后重新选取 主库

注意:哨兵集群中也是有一个 leader,而这个leader也是决定着主库和从库之间的切换问题。

主从库的切换和消息的通知

哨兵集群 认为原来的 主库 下线时,则就会进行一个 主从库的切换

在这里插入图片描述

我们可以分为以下四步:

  • 第一步:在已下线主节点(旧主节点)属下的所有「从节点」里面,挑选出一个从节点,并将其转换为主节点,选择的规则:
    • 过滤掉已经离线的从节点;
    • 过滤掉历史网络连接状态不好的从节点;
    • 将剩下的从节点,进行三轮考察:优先级、复制进度、ID 号。在每一轮考察过程中,如果找到了一个胜出的从节点,就将其作为新主节点。
  • 第二步:让已下线主节点属下的所有「从节点」修改复制目标,修改为复制「新主节点」;
  • 第三步:将新主节点的 IP 地址和信息,通过「发布者/订阅者机制」通知给客户端;
  • 第四步:继续监视旧主节点,当这个旧主节点重新上线时,将它设置为新主节点的从节点;

至此 主从库转移 完毕。

发布者/订阅者机制」通知给客户端;

  • 第四步:继续监视旧主节点,当这个旧主节点重新上线时,将它设置为新主节点的从节点;

至此 主从库转移 完毕。


题外话:
突然在自己的草稿中发现自己好久之前写的文章,然后又完善了一下嘿嘿,所以就发出来吧。在这里也非常感谢 小林 大佬,本文也是借鉴该大佬的文章嗷。

相关文章:

  • 傻白入门芯片设计,芯片键合(Die Bonding)(四)
  • Servlet(Cookie和Session)
  • 四轴斜转魔方
  • 详解设计模式:工厂方法模式
  • C++游戏game | 井字棋游戏坤坤版(配资源+视频)【赋源码,双人对战】
  • 综合实验 电子记事本的设计与实现——Java
  • CSS 选择器
  • 进程的调度
  • 程序员注意!35岁前,别靠死工资过日子
  • Ubuntu22.2下C语言编程实现,首次,最佳适应算法
  • SpringBoot: Controller层的优雅实现
  • C语言学习笔记(十)
  • 前端框架Vue语法部分(一)
  • 进程创建进程终止进程等待
  • 【Linux】一万七千字详解 —— 基本指令(二)
  • 多维时序 | MATLAB实现CNN-GRU多变量时间序列预测
  • 为了摸鱼,我开发了一个工具网站
  • jenkins 共用宿主机中的docker自动化部署
  • 如何借助现有股票量化交易平台编写策略和回测分析
  • 腾讯产品经理的自动化工作流
  • 摩天大楼天津117大厦复工背后:停工近十年,未知挑战和压力仍在
  • 史学巨擘的思想地图与学术路径——王汎森解析梁启超、陈寅恪、傅斯年
  • 人民日报:在大有可为的时代大有作为
  • 路边“僵尸车”被人以1450元卖了,嫌疑人被刑拘
  • 10台核电新机组获核准,上海核电厂商独揽超500亿元订单
  • 日中友好议员联盟代表团访问中国人民对外友好协会