哨兵

在一个典型的一主多从的Redis系统中,当主数据库遇到异常中断服务后,需要手动选择一个从数据库升级为主数据库,整个过程需要人工介入,难以自动化。

Redis2.8提供了哨兵2.0(2.6提供了1.0,但是问题较多),哨兵顾名思义就是监控Redis系统的运行状况。它的功能包括一下两个:

  • 监控主数据库和从数据库是否正常运行;
  • 主数据库出现故障时自动将从数据库升级为主数据库;

哨兵是一个独立的进行,在一个一主多从的Redis系统中,可以使用多个哨兵监控整个Redis系统,哨兵之间也会互相监控。

配置

基于前面的一主两从架构,为他们加入哨兵。

可以在三个redis节点的redis目录下找到sentinel.conf文件,这个文件就是哨兵的配置文件,修改配置如下:

sentinel monitor mymaster 192.168.2.101 6379 3

其中mymaster是要监控的主数据库名字,可以自定义;

接下来是主数据库的ip和端口;

最后一个3是指哨兵最低通过票数;

如果你需要后台启动,则修改daemonize参数:

daemonize yes

配置后如果有防火墙,不要忘记打开哨兵的端口,默认是26379。

最后,开启哨兵:

redis-sentinel /yourpath/sentinel.conf

做个测试,关闭主数据库(192.168.2.101)后,等待30秒(默认30秒):

  • 哨兵将从数据库中的一个节点升级成主数据库(192.168.2.102);
  • 将另一个从数据库(192.168.2.103)的主数据库(192.168.2.101)切换到新的主数据库(192.168.2.102);

随后启动刚才关闭的主数据库(192.168.2.101)

  • 哨兵自动将其转为从数据库;

原理

监控过程

哨兵启动后,会与要监控的主数据库建立两条连接:

  1. 一条用来用来订阅__sentinel__:hello频道以获取其他哨兵节点的信息;
  2. 另一条用来定期向主数据库发送INFO等命令来获取主数据库本身的信息;

在和主数据库建立连接后,哨兵会定时执行下面3个操作:

  1. 每10秒哨兵会向主数据库和从数据库发送INFO命令;
  2. 每2秒哨兵会向主数据库和从数据库的__sentinel__:hello频道发送自己的信息;
  3. 每1秒哨兵会向主数据库和从数据库和其他哨兵发送PING命令;

第一个操作是发送INFO命令,目的是获取主数据库的信息,以及主数据库的从数据库的信息,从而实现新节点的自动发现,并对从数据库也建立两条连接。

第二个操作是订阅__sentinel__:hello频道,并发送哨兵本身的信息,与同样监控该数据库的其他哨兵分享自己的信息,同时也能识别哨兵是否是新哨兵。哨兵与哨兵之间也会建立一个链接,用来发送PING命令;

第三个操作是发送PING命令,在发现了从数据库和其他哨兵后,要做的就是定时监控Redis服务是否停止,时间间隔与配置文件中的down-after-milliseconds有关,当这个值小于1秒时,哨兵会每隔该值的时间发送PING命令,当这个值大于1秒时,哨兵会每隔1秒发送一次PING命令。

配置方式是在sentinel.conf文件中加入:

sentinel down-after-milliseconds mymaster 600 # 600毫秒发送一个PING

当超过down-after-milliseconds时,如果PING的数据库未回复,则哨兵认为其主观下线。主观下线可以理解为当前的哨兵认为该节点下线了。

如果该节点是主数据库,则哨兵们会进一步判断是否需要对其进行故障修复:

哨兵会发送SENTINEL is-master-down-by-addr命令询问其他哨兵,判断他们是否也认为该主数据库下线,如果达到quorum参数,也就是我们在配置哨兵时的命令:

sentinel monitor mymaster 192.168.2.101 6379 3

的最后一个参数3,哨兵们会认为这个主数据库客观下线,并选举一个领头哨兵对主从系统发起故障恢复。

领头哨兵选举

要进行故障恢复,则需要选举出一个领头哨兵,领头哨兵的选择算法是Raft算法,具体过程如下:

发现主数据库客观下线的哨兵节点(A节点)想每个哨兵节点发送命令,要求对方选择自己成为领头哨兵;

如果目标哨兵节点没有选择过其他人,则会同意将A设置成领头哨兵;

如果A发现超过半数且超过quorum参数个哨兵节点同意选择自己,则A成功成为领头哨兵;

当有多个哨兵同时参选,则会出现没有任何节点当选的可能,此时每个参选节点将等待一个随即时间重新发起竞选,直到选举成功。

故障恢复

选择出领头哨兵后,会把从数据库中的一个挑选出来升级为主数据库:

  1. 所有先线的从数据库中,选择优先级最高的,优先级可以通过slave-priority来设置;
  2. 如果有多个一样优先级的从数据库,则复制的命令偏移量越大,越优先(与down掉的主数据库最接近);
  3. 如果还有多个备选,则选择运行ID较小的(运行ID不会重复);

选择好节点后,领头哨兵将想这个节点发送slaveof no one,升级他为主数据库。

然后想其他从数据库发送slaveof命令切换主数据库。

最后更新内部的记录,将已经停止服务的旧的主数据库更新为新的主数据库的从数据库,当其回复后自动以从数据库的身份加入到主从架构中。

哨兵部署

哨兵的推荐部署方案:

  1. 为每个节点(无论是主数据库还是从数据库)都部署一个哨兵;
  2. 使每个哨兵与其对应的节点的网络环境相同或相近;

设置quorum的值为N/2+1,这样使得只有当大部分哨兵统一后才会选择领头哨兵进行故障恢复;

Redis哨兵的配置和原理的更多相关文章

  1. redis哨兵模式配置

    java对redis的读写 依赖包:jedis.jar maven下: <!-- https://mvnrepository.com/artifact/redis.clients/jedis - ...

  2. Redis 哨兵模式配置

    搭建步骤 第一步: 在 redis.conf 配置文件目录下拷贝三份 sentinel.conf 文件 [root@node-01 redis-5.0.9]# cp sentinel.conf sen ...

  3. Redis哨兵、复制、集群的设计原理与区别

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

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

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

  5. Redis哨兵、复制、集群的设计原理,以及区别

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

  6. redis之哨兵 springboot配置

    转载自https://blog.csdn.net/m0_37367413/article/details/82018125 springboot整合redis哨兵方式配置 2018年08月24日 14 ...

  7. redis哨兵架构的基础知识及部署和管理

    一.前言 1.哨兵的介绍 sentinal,中文名是哨兵 哨兵是redis集群架构中非常重要的一个组件,主要功能如下 ()集群监控,负责监控redis master和slave进程是否正常工作 ()消 ...

  8. Redis哨兵知识点总结

    1.Redis哨兵介绍 sentinal,中文名是哨兵 A.哨兵是redis集群架构中非常重要的一个组件,主要功能如下 集群监控,负责监控redis master和slave进程是否正常工作 消息通知 ...

  9. Redis 主从集群搭建及哨兵模式配置

    最近搭建了redis集群及哨兵模式,为方便以后查看特此记录下来: 1.Redis安装 2.主从架构 2.1 Redis主从架构图 2.2Redis主从结构搭建 Redis集群不用安装多个Redis,只 ...

随机推荐

  1. mongodb 在PHP中常见问题及解决方法

    1.$in needs an array 解决:查询用到in操作的时候,说in操作对应的不是我一个数组,或者数组索引不是以0开始的 方法:array_values重新生成一个索引为0开始的数组即可 $ ...

  2. vscode 超好用的前端插件

    一 vscode 前端调试接口的插件 作为前端工程师,接口的调试是我们必不可少的工作.以前用过postman,但是作为一个vscode重度使用者,我希望看看vscode能否进行对接口的调试.省的跟后台 ...

  3. Jenkins+Git的搭建和自动部署

    前言 Jenkins在工作中都使用过,之前都是运维去搭建部署,弄好了之后给我一个网址去构建项目就可以了,所以也都是一直没了解过安装过程. 今天在自己的服务器上搭建了一遍,中间有遇到很多坑,特在此归纳总 ...

  4. opencv——感兴趣区域(ROI)的分析和选取[详细总结]

    引言 在利用OpenCV对图像进行处理时,通常会遇到一个情况,就是只需要对部分感兴趣区域进行处理.因此,如何选取感兴趣区域呢?(其实就是"抠图"). 在学习opencv的掩码运算后 ...

  5. opencv——机器视觉检测和计数

    引言 在机器视觉中,有时需要对产品进行检测和计数.其难点无非是对于产品的图像分割. 由于之前网购的维生素片,有时候忘了今天有没有吃过,就想对瓶子里的药片计数...在学习opencv以后,希望实现对于维 ...

  6. CLS的探索:Python如何让日志免费云化

    前言 日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集.日志存储到日志检索,图表分析.监控告警.日志投递等多项服务,协助用户通过日志来解决业务运 ...

  7. checked 和 prop() (散列性比较少的)

    在<input  class="sex1" type="radio" checked>男 checked表示该框会被默认选上 prop()操作的是D ...

  8. 发现数据结构与算法之美的第n次重新学习 ——— 初遇数据结构与算法(了解)

    你的数据结构怎么学的?提起数据结构,计算机与软件,it行业内无人不知,无人不晓.但是,当你真正的去通过数据结构与算法内容去实践内容时,真的能联系起来吗?那肯定的 不管是考研还是做项目,数据结构都是必学 ...

  9. JAVA基础——变量、常量

    变量 java中,变量时最基本的存储单元,其要素包括变量名,变量类型和作用域. 注意事项: 每个变量都有类型,类型可以是基本类型,也可以是引用类型. 变量名必须是合法的标识符 变量声明时一条完整的语句 ...

  10. Linux_LVM管理

    一.Ivm的应用场景及其弊端 1.应用场景: 随着公司的发展,数据增长较快,最初规划的磁盘容量不够用了 2.弊端: 数据不是直接存放在硬盘上,而是在硬盘的.上面又虚拟出来--层逻辑卷存放数据,故而增加 ...