百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis哨兵原理,我忍你很久了

mhr18 2024-11-30 12:41 18 浏览 0 评论



Redis 主从复制的作用中有这么一句话“主从复制是高可用的基石”,那什么是高可用呢?高可用就是减少系统不能提供的时间,也就是常听到的以 6 个 9 为基准。实现高可用必不可少的就是哨兵和集群。


图片来自 Pexels


本文主要围绕如下几个方面介绍哨兵机制:

  • 什么是哨兵
  • 哨兵的作用
  • 如何配置哨兵
  • 哨兵工作原理
  • 总结


本文实现环境:

  • centos 7.3
  • redis 4.0
  • redis 工作目录 /usr/local/redis
  • 在虚拟机进行模拟操作


什么是哨兵


先简单说几句我们在配置主从复制时有一种情况就是主节点宕机了,谁来提供服务呢?


当主节点宕机后主从复制就没有存在的意义了,数据为王的时代没有了数据何谈什么高可用。

这个时候就横空出世了一位老大哥名叫哨兵,老大哥说这个问题我来帮你们处理。


既然主节点 master 作为老大不领你们玩了。我就从你们四个中间再挑选出来一位老大,然后你们跟着他玩。


等不带你们玩的那个老大回来后他的身份就失效了,就不再是你们的老大了。他只能跟着我挑选出来的老大玩。


上边这段对话过程就是我们配置哨兵的意义到底在哪,跟谁玩就是谁给谁数据,知道了哨兵的作用我们就在继续。


最后我们用专业术语来解释一下什么是哨兵:

哨兵,英文名 Sentinel,是一个分布式系统,用于对主从结构中的每一台服务器进行监控,当主节点出现故障后通过投票机制来挑选新的主节点,并且将所有的从节点连接到新的主节点上。


哨兵的作用


上文中我们谈到的对话过程就是哨兵的作用之一:自动故障转移。


谈到作用肯定就是这个哨兵到底在工作中到底干了什么事情。我们先用比较干巴的概念描述一下,然后在下文的工作原理会一一谈到。


哨兵的三个作用:

  • 监控:监控谁?支持主从结构的工作一个是主节点一个是从节点,那肯定就是监控这俩个了。监控主节点和从节点是否正常运行;检测主节点是否存活,主节点和从节点运行情况。
  • 通知:哨兵检测的服务器出现问题时,会向其他的哨兵发送通知,哨兵之间就相当于一个微信群,每个哨兵发现的问题都会发在这个群里。
  • 自动转移故障:当检测到主节点宕机后,断开与宕机主节点连接的所有从节点,在从节点中选取一个作为主节点,然后将其他的从节点连接到这个最新主节点的上。并且告知客户端最新的服务器地址。


这里有一个注意点,哨兵也是一台 Redis 服务器,只是不对外提供任何服务。配置哨兵时配置为单数。


那么为什么配置哨兵服务器的数量为单数呢?带着这个疑问你会在下文看到你想要的答案。


如何配置哨兵


准备工作


我们开始配置哨兵,开启八个客户端,三个哨兵、一个主节点、俩个从节点、一个主节点客户端、一个从节点客户端。

sentinel.conf 配置解读


哨兵使用的配置文件是 sentinel.conf,如下图:

我们来对 sentinel.conf 配置信息进行解读:

但是大多数都是注释,这里给大家提供一个命令来过滤这些无用信息:

cat sentinel.conf | grep -v '#' | grep -v '^#39; 


①port 26379:对外服务端口号。


②dir /tmp:存储哨兵的工作信息。


③sentinel monitor mymaster 127.0.0.1 6379 2:监控的是谁,名字可以自定义,后边的 2 代表的是,如果有俩个哨兵判断这个主节点挂了那这个主节点就挂了,通常设置为哨兵个数一半加一。


④sentinel down-after-milliseconds mymaster 30000:哨兵连接主节点多长时间没有响应就代表挂了。后边 30000 是毫秒,也就是 30 秒。


⑤sentinel parallel-syncs mymaster 1:这个配置项是指在故障转移时,最多有多少个从节点对新的主节点进行同步。


这个值越小完成故障转移的时间就越长,这个值越大就意味着越 多的从节点因为同步数据而不可用。


⑥sentinel failover-timeout mymaster 180000:在进行同步的过程中,多长时间完成算有效,系统默认值是 3 分钟。


开始配置


使用命令 cat sentinel.conf | grep -v '#' | grep -v '^#39; > ./data/sentinel-26379.conf 把 sentinel.conf 过滤后的信息移到 /usr/local/redis/conf 下。

然后打开 sentinel-26379.conf 修改信息存放目录:

再快速的复制两个哨兵配置文件,端口为 26380 和 26381:

sed 's/26379/26381/g' sentinel-26379.conf > sentinel-26381.conf


测试主从复制处于正常工作状态,启动三台 redis 服务器,端口分别为 6379、6380、6381:

查看主节点信息,是有俩台从节点在连接着,端口分别为 6380、6381。


这里有一个小小的点就是 lag 怎么一个是 1 一个是 0 呢?lag 是延迟时间,我这里是本地测试所以会出现 0 的情况,使用云服务器是很少出现的。


lag 的值为 0 和 1 都属于正常。

测试主节点添加一个 hash 值,hset kaka name kaka:

分别从 slave1 和 slave2 获取 kaka 的值,检测主从复制是否正常运行。


经过测试我们的主从结构是正常运行的,如下图:

启动一个哨兵 redis-sentinel 26379-sentinel.conf:

连接 26379 哨兵,主要是最后一行,监控的主节点名为 mymaster,状态正常,从节点有俩个,哨兵数量为 1 个。

再来查看一下 26379 的哨兵配置信息,这个时候已经改动了:

在启动一个 26380 的哨兵,redis-sentinel 26380-sentinel.conf,这里注意一下最后一行多了一条信息,这个 id 就是我们 26379 配置文件新增的 id。

然后我们来到哨兵 26379 的客户端,同样也是新增的 26380 哨兵的 id:

这个时候我们再查看一下 26379 哨兵的配置文件,第一次查看配置文件是没有配置 26380 哨兵的,第二次查看时配置了 26380 哨兵后添加的信息。

最后我们需要把哨兵客户端 3 启动起来,端口号为 26381。启动起来之后,我们的配置信息和服务端的信息也会改动,添加哨兵 26380 有的信息,哨兵 26381 也会有。


直到这里我们对哨兵的配置就结束了,接下来我们把主节点 Master 给宕掉。

等待 30 秒后我们来到 26379 哨兵的客户端,这里新增了一些信息,那么这些信息都做了什么呢?让我们细细道来。

这里边的信息我们先需要知道几个:


①+sdown:这个信息后是指三个哨兵里边有一个认为主节点宕机了。


②+odown:这个信息是指其他俩个哨兵去连接了一下主节点,发现确实是主节点宕机了,然后发起了一轮投票。这里使用的是 redis 4.0,版本之间这块信息有点差异。


③+switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380:直到这里是哨兵发起投票的结果,推选端口为 6380 的 redis 为主节点。


④+slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380:这里就把端口为 6381 与 6379 和新的主节点 6380 做了一个连接。


⑤+sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380:最后一句是端口为 6379 的还是没有上线,于是给踢下线。


当我们在重新把 6379 的 redis 服务器上线后,就可以看到哨兵服务端响应了俩句。一句是去除 6379 的下线。最后一句就是重连 6379 到新的主节点上。

这个时候主节点就是 6380 了,在 6380 的 redis 客户端设置值,检测主从复制是否正常工作。


在新的主节点 6380 添加 list 类型:

在 6379 和 6381 获取这个值,至此,我们的哨兵模式就配置完成了。

哨兵工作原理


配置完哨兵后,就需要对其工作原理进行解析了,只有知道其工作流程,才能对哨兵有更好的理解。


本文讲解原理没有那么干巴!让你可以把一篇技术文章当故事去看。


进入正题,哨兵作用是监控、通知、故障转移。那么工作原理也是围绕这三点来讲的。


监控工作流程


监控工作流程如下:


哨兵发送 info 指令,并且保存所有哨兵状态,主节点和从节点的信息。


主节点会记录 redis 实例的信息,主节点记录的信息跟哨兵记录的信息看起来是一样的,实际上还是有点区别。


哨兵会根据在主节点拿到的从节点信息,给对应的从节点也发送 info 指令。


接着哨兵 2 来了,同样的也会给主节点发送 info 指令,并且建立 cmd 连接。


这个时候哨兵 2 也会保存跟哨兵 1 一样的信息,只不过是保存的哨兵信息是 2 个。


这个时候为了每个哨兵的信息都一致它们之间建立了一个发布订阅。为了哨兵之间的信息长期对称它们之间也会互发 ping 命令。


当再来一个哨兵 3 时,也会做同样的事情,给主节点和从节点发送 info。并且跟哨兵 1 和哨兵 2 建立连接。


通知工作流程


sentinel 会给主从的所有节点发送命令获取其状态,并且会把信息发布到哨兵的订阅里。

故障转移原理


哨兵会一直给主节点发送 publish sentinel:hello,直到哨兵报出 sdown,这个词这会是有不是有点熟悉了。没错就是我们上文中把主节点断开后哨兵服务端报出的信息。


哨兵报出主节点 sdown 后还没有完,哨兵还会往内网里发布消息说明这个主节点挂了。发送的指令是 sentinel is-master-down-by-address-port。


其余的哨兵接收到指令后,主节点挂了吗?让我去看看到底挂没挂。发送的信息也是 hello。


其余的哨兵也会发送他们收到的信息并且发送指令 sentinel is-master-down-by-address-port 到自己的内网,确认一下第一个发送 sentinel is-master-down-by-address-port 的哨兵说你说的对,这个家伙确实挂了。


当所有人都认为主节点挂了后就会修改其状态为 odown。当一个哨兵认为主节点挂了标记的是 sdown,当半数哨兵都认为挂了其标记的状态是 odown。这也就是配置哨兵为什么配置单数的原因。


对于一个哨兵认为主节点挂了称之为主观下线,半数哨兵认为主节点挂了称之为客官下线。


一旦被认为主节点客官下线后,哨兵就会进行下一步操作:

这时哨兵已经检测到问题所在了,那么到底是那个哨兵去负责推选新的主节点呢!不能是张三也去,李四也去,王五也去,这样就乱套了、于是就需要在所有的哨兵里选出领头的,那么是如何选的呢!请看下图。


这个时候,五个 sentinel 就在一起开会了,所有的哨兵都在一个内网中,然后他们会做一件事情就是五个 sentinel 会同时发送指令 sentinel is-master-down-by-address-port 并且携带上自己竞选次数和 runid。

每个 sentinel 既是参选者也是投票者,每个 sentinel 都有一票,信封就代表自己的投票权。

当 sentinel1 和 sentinel4 同时把指令发送到群里准备竞选时,sentinel2 这个时候就说我先接到谁的指令就把票投给谁。


假如 sentinel1 发的早,那么 sentinel2 的票就会投给 sentinel1。

按照这样的规则一直发起投票直到有一个 sentinel 的票数为总 sentinel 数量的一半之多。


假设说是 sentinel1 的票数满足总哨兵数量的一半之多后,sentinel1 就会当选。这个时候就进行到了下一个阶段。

在上边哨兵已经选出了 sentinel1 为代表去所有的从节点找出一个作为主节点。这个挑选主节点不是随便拿一个是有一定的规则的。


先把不在线的干掉:

响应慢的干掉,sentinel 会给所有的 redis 发送信息,响应速度慢的就会被干掉。

与原主节点断开时间最久的干掉,这里由于演示不够用了,所有新增了一个 slave5,没有任何意义哈!

以上三个点都判断结束后还有 salve4 和 slave5,就会根据优先原则来进行筛选:

  • 首先会根据优先级,如果优先级一样在进行其他判断。
  • 判断 offset 偏移量,判断数据同步性,假如说 slave4 的 offset 为 90,slave5 偏移量为 100。那么哨兵就会认为 slave4 的网络是不是有问题,于是就会选 slave5 为新的主节点。那如果说是 slave4 和 slave5 的 offset 相同呢!还有最后一个判断。
  • 最后一步就是判断 runid 了,也就是职场中的论资排辈了,也就说根据 runid 的创建时间来判断,时间早的上位。

选出新的主节点后就要对所有的节点发送指令了。

总结


关于哨兵的所有知识点就已经说完了,本文最重要的就是哨兵的工作原理了。


我们在简单的梳理一下其工作原理:

  • 首先进行监控,并且所有的哨兵同步信息。
  • 哨兵向订阅里边发布信息。
  • 故障转移:哨兵发现主节点下线→哨兵开启投票竞选负责人→由负责人推选新的主节点→新的主节点断开原主节点,并且其他的从节点连接新的主节点,原主节点上线后作为从节点连接。


以上就是笔者对哨兵的理解,如果错误欢迎指出,以便及时改正。

相关推荐

Spring Boot 分布式事务实现简单得超乎想象

环境:SpringBoot2.7.18+Atomikos4.x+MySQL5.71.简介关于什么是分布式事务,本文不做介绍。有需要了解的自行查找相关的资料。本篇文章将基于SpringBoot...

Qt编写可视化大屏电子看板系统15-曲线面积图

##一、前言曲线面积图其实就是在曲线图上增加了颜色填充,单纯的曲线可能就只有线条以及数据点,面积图则需要从坐标轴的左下角和右下角联合曲线形成完整的封闭区域路径,然后对这个路径进行颜色填充,为了更美观...

Doris大数据AI可视化管理工具SelectDB Studio重磅发布!

一、初识SelectDBStudioSelectDBStudio是专为ApacheDoris湖仓一体典型场景实战及其兼容数据库量身打造的GUI工具,简化数据开发与管理。二、Select...

RAD Studio 、Delphi或C++Builder设计代码编译上线缩短开发时间

#春日生活打卡季#本月,Embarcadero宣布RADStudio12.3Athens以及Delphi12.3和C++Builder12.3,提供下载。RADStudio12.3A...

Mybatis Plus框架学习指南-第三节内容

自动填充字段基本概念MyBatis-Plus提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。原理自动填充功能通过实现com.baomidou.myba...

「数据库」Sysbench 数据库压力测试工具

sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以...

如何选择适合公司的ERP(选erp系统的经验之谈)

很多中小公司想搞ERP,但不得要领。上ERP的目的都是歪的,如提高效率,减少人员,堵住财务漏洞等等。真正用ERP的目的是借机提升企业管理能力,找出管理上的问题并解决,使企业管理更规范以及标准化。上ER...

Manus放开注册,但Flowith才是Agent领域真正的yyds

大家好,我是运营黑客。前天,AIAgent领域的当红炸子鸡—Manus宣布全面放开注册,终于,不需要邀请码就能体验了。于是,赶紧找了个小号去确认一下。然后,额……就被墙在了外面。官方解释:中文版...

歌浓酒庄总酿酒师:我们有最好的葡萄园和最棒的酿酒师

中新网1月23日电1月18日,张裕董事长周洪江及总经理孙健一行在澳大利亚阿德莱德,完成了歌浓酒庄股权交割签约仪式,这也意味着张裕全球布局基本成型。歌浓:澳大利亚年度最佳酒庄据悉,此次张裕收购的...

软件测试进阶之自动化测试——python+appium实例

扼要:1、了解python+appium进行APP的自动化测试实例;2、能根据实例进行实训操作;本课程主要讲述用python+appium对APP进行UI自动化测试的例子。appium支持Androi...

为什么说Python是最伟大的语言?看图就知道了

来源:麦叔编程作者:麦叔测试一下你的分析能力,直接上图,自己判断一下为什么Python是最好的语言?1.有图有真相Java之父-JamesGoshlingC++之父-BjarneStrou...

如何在Eclipse中配置Python开发环境?

Eclipse是著名的跨平台集成开发环境(IDE),最初主要用来Java语言开发。但是我们通过安装不同的插件Eclipse可以支持不同的计算机语言。比如说,我们可以通过安装PyDev插件,使Eclip...

联合国岗位上新啦(联合国的岗位)

联合国人权事务高级专员办事处PostingTitleIntern-HumanRightsDutyStationBANGKOKDeadlineOct7,2025CategoryandL...

一周安全漫谈丨工信部:拟定超1亿条一般数据泄露属后果严重情节

工信部:拟定超1亿条一般数据泄露属后果严重情节11月23日,工信部官网公布《工业和信息化领域数据安全行政处罚裁量指引(试行)(征求意见稿)》。《裁量指引》征求意见稿明确了行政处罚由违法行为发生地管辖、...

oracle列转行以及C#执行语句时报错问题

oracle列转行的关键字:UNPIVOT,经常查到的怎么样转一列,多列怎么转呢,直接上代码(sshwomeyourcode):SELECTsee_no,diag_no,diag_code,...

取消回复欢迎 发表评论: