Java开发 - 深入理解Redis哨兵机制原理

这篇具有很好参考价值的文章主要介绍了Java开发 - 深入理解Redis哨兵机制原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Redis的主从、哨兵模式、集群模式,在前文中都已经有了详细的搭建流程,可谓是手把手教程,也得到了很多朋友的喜欢。由于前文偏向于应用方面,就导致了理论知识的匮乏,我们可能会用了,但却不明所以,所以今天,博主就通过接下里的几篇博客给大家分别讲解Redis哨兵机制的原理和集群模式下的原理。

导读

在开始讲解之前,博主把前面几篇博客的地址放在这里供大家去翻阅:

Java开发 - 让你少走弯路的Redis的主从复制

Java开发 - 让你少走弯路的Redis主从实现单节点哨兵模式

Java开发 - 让你少走弯路的Redis集群搭建

在这三篇Redis内容中,已经从主从到哨兵再到集群给大家一步步做了详细的应用讲解,如果你对Redis的使用还存在一定的问题的话不妨去看看,兴许会有一些新的收获。

多哨兵模式的疑问

在 Redis集群搭建这篇博客的末尾,博主有这么一段话,见下方:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

 一个sentinel哨兵大家会了,但是多个sentinel哨兵怎么让他们彼此之间也能监听到呢?诚如博主所说,多个哨兵和一个哨兵的使用方法是一样的,只需要监听主节点,其他的,哨兵会自动完成。

不信?博主专门搭建了一个多哨兵的Redis,我们来看看。

这是我的Redis和Sentinel配置文件:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

Redis架构如下:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

就是简单的一主二从。

Sentinel的架构如下:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

我们分别启动三个Redis和三个Sentinel:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

至于配置,就和我博客里面的一摸一样,大家可以照着自己做,这里是演示多个sentinel的工作情况。

如果你要是自己看了报文,你就会发现细节:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

这个26380的:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

这是26379的:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

唯一配置变的地方还真有一个,就是在sentinel的配置文件中:

sentinel monitor mymaster 127.0.0.1 6379 2

监听的主节点后面的数字变了,一个sentinel的时候写1,三个sentinel的时候要过半的sentinel认为主节点挂掉才能故障转移和切换,三个,那过半就写2了,如果你有更多sentinel,这个数字也要改变。当然,你写1也行,但可能出现误判的情况。

测试关闭主节点:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

已关闭,此时看从节点:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

出现了短暂的连接被拒绝的情况,此时我们发现sentinel没有任何变化,大概也就是几秒钟的样子,变化产生了:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

此时去看其他的sentinel节点,会发现有明显的选举过程:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

此时如果把sentinel6379下线掉之后,会发生什么?我们试试;

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

大概在几秒后,sentinel做出了反应,同时输出26379离线的通知,但是Redis那边没有任何的反应,这个正常,毕竟不是redis监控哨兵,是吧? 

到这里,还需要博主继续下去吗?一切已经说明了问题。 多哨兵的模式按照博主的方式放心用就行了。

到此,多sentinel使用也算是给大家做了演示,加油哦!

Redis哨兵工作原理

从上面的测试来看,当主节点发生故障挂掉之后,大概时间是18s,sentinel感知到故障,执行自动的故障迁移,当然,这个时间是可以自己调整的。为了了解这种工作机制,我们有必要来了解下sentinel的三种定时监控任务。

INFO指令获得最新节点拓扑图

每个sentinel每隔10s就会向主节点发送INFO命令,然后获取整个Redis节点的拓扑图,这也是为什么,当有节点退出,或有节点加入时,sentinel能极快的感知到拓扑图变化的原因,也是我们只需要指定主节点而不需要指定从节点的原因。

此时还没有完,sentinel通过INFO命令感知到拓扑图后,就发现了主节点下的其他从节点,等到下个10s后,就会同时向主节点和从节点发送INFO命令,以达到监听所有redis节点的目的。

此处应该有图,但是我好懒,我觉得大家应该明白了这个道理了吧?

通过发布订阅获得Master节点和其他Sentinel的信息

每个sentinel间隔2s会向指定频道发送自己关于主节点是否正常的判断,同时还包含当前sentinel节点的信息,其他sentinel通过订阅这个频道就可以达到信息共享的目的,此时就可以判断master节点是不是活的,sentinel节点是不是活的。

解释下关于订阅频道的理解,对于监视同一个主节点的多个Sentinel来说,一个Sentinel发送的信息会被其他Sentinel接收到,这其他Sentinel会根据这些信息来做出对master和对应sentinel的判断。我们可以认为他们是通过主节点达到数据共享的。

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

我们暂时就理解到这里,不再做更多深层的源码方面的理解。

但当博主打开了sentinel26379的配置文件,偶然在最末位发现了这几段自动生成的配置,似乎打开了新世界的大门:

Java开发 - 深入理解Redis哨兵机制原理,Java之微服务简单上手系列,redis,sentinel原理,sentinel定时监控任务,原力计划

known- sentinel就是知道另一个sentinel,这都是自动完成的,其原理博主不得,但猜测是通过Master节点完成的数据的共享,上图似乎也是一个对我们假设的印证。

PING指令⼼跳检测

每个Sentinel每隔1秒会向所有节点( Sentinel 节点、 Master 节点、 Slave 节点)发送PING指令来进⾏⼼跳检测。

选举过程

  • 在上面的案例中,当一个sentinel节点认为Master不可用时,会进行主观下线,但并不会真的下线,而是继续通过sentinel is-masterdown-by-addr指令来获取其他sentinel对Master节点的判断,如果最终判断的值达到了我们设置的quorum值,Master节点就被判定为客观下线;
  • Leader Sentinel(每个发现master服务器进入下线的sentinel都可以要求其他sentinel选自己为sentinel的leader,选举是先到先得)会从原来的Master的Slave中选出一个做为新的主节点
    • 首先过滤所有主观下线的节点;
    • 选择slave-priority最高的节点,有的话返回,没有的话继续;
    • 选择复制偏移量offset最⼤的节点,有的话返回,没有的话继续;
    • 选择run_id(服务器运⾏ ID)最⼩的节点,
  • 最终选出一个节点,Leader Sentinel节点会通过 SLAVEOF NO ONE命令,让选择出来的Slave变为新的Master,再通过SLAVEOF命令让其他还活着的节点成为新的Master的Slave节点。

最后推荐一篇文章,我觉得讲解通信的过程讲的很详细:一文读懂Redis的哨兵机制 - 知乎

好东西当然是要一起分享了。

结语

写到这里,Redis的哨兵模式基本是给大家讲解清楚了,不知道你get到了多少?如果还有其他疑问,不放评论区留言和小伙伴们一起讨论吧,最后,不要吝啬你们的赞,动动小手,给博主一个大大的支持吧。文章来源地址https://www.toymoban.com/news/detail-580606.html

到了这里,关于Java开发 - 深入理解Redis哨兵机制原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • “深入剖析JVM内部机制:理解Java虚拟机的工作原理“

    标题:深入剖析JVM内部机制:理解Java虚拟机的工作原理 介绍: Java虚拟机(JVM)是Java语言的核心组件,负责将Java源代码转换为可以在计算机上运行的机器码。了解JVM的内部机制对于开发人员来说非常重要,因为它可以帮助我们更好地理解Java程序的运行行为和性能优化。本文

    2024年02月12日
    浏览(46)
  • “深入探索JVM内部机制:理解Java虚拟机的工作原理“

    标题:深入探索JVM内部机制:理解Java虚拟机的工作原理 摘要:本文将深入探索Java虚拟机(JVM)的内部机制,讲解JVM的工作原理,并通过示例代码帮助读者更好地理解JVM的工作过程。 正文: 一、JVM概述 Java虚拟机(JVM)是Java程序的运行环境,它负责将Java字节码转换为机器码

    2024年02月11日
    浏览(67)
  • Redis集群(分布式缓存):详解持久化、主从同步原理、哨兵机制、Cluster分片集群,实现高并发高可用

            单机式Redis存在以下问题,因此需要Redis集群化来解决这些问题        Redis数据快照,简单来说就是 把内存中的所有数据都记录到磁盘中 。当Redis实例故障重启后,从 磁盘读取快照文件,恢复数据 。快照文件称为RDB文件,默认是保存在当前运行目录。     (1)

    2024年02月08日
    浏览(59)
  • Java垃圾回收机制深入理解

    Java垃圾回收机制是Java虚拟机(JVM)的核心组件之一,对于内存管理起到至关重要的作用。它能自动追踪并管理应用程序中创建的对象,当这些对象不再使用时,垃圾回收机制会自动回收其占用的内存,使这部分内存能够被再次利用。此机制极大地减少了开发者需要手动管理

    2024年02月09日
    浏览(38)
  • 深入理解 Redis 高可用性方案及其原理

    深入理解 Redis 高可用性方案及其原理 在当今数据驱动的时代,Redis 作为一种高性能的键值存储数据库,在现代应用架构中扮演着举足轻重的角色。无论是作为缓存系统、消息队列还是轻量级数据库,Redis 以其卓越的性能和灵活性赢得了广泛的应用。然而,随着业务规模的不

    2024年03月25日
    浏览(58)
  • 深入理解Java中HashMap的modCount机制

    在Java编程领域中, HashMap 是一个广泛使用的数据结构,它提供了键值对的存储方式,允许我们根据键快速地检索对应的值。由于其高效的查找性能和灵活性, HashMap 在Java编程中扮演着至关重要的角色。它不仅被广泛应用于日常的开发工作,如缓存、数据存储和数据检索等,

    2024年04月27日
    浏览(41)
  • 深入理解java和dubbo的SPI机制

    本质:将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。 java SPI:用来设计给服务提供商做插件使用的。基于策略模式来实现动态加载的机制。我们在程序只定义一个接口,具体的实现交个不同

    2024年02月08日
    浏览(47)
  • 【Redis】聊一下Redis的哨兵机制

    在上一篇文章中,我们学习了数据库的Redis的主从集群复制模式,如果从库出现问题,那么其他主从库还可以处理读写请求,但是如果主库宕机,写请求从库处理不了,整个系统就不可用了,虽然只处理只读请求,显然是不符合业务需求。 如上图中所示当主库出现异常的,如

    2024年02月07日
    浏览(39)
  • 【Redis】哨兵机制

            哨兵模式时给予主从模式的,是为了解决主从模式单点(master)故障导致服务不可用的问题,但并未解决单节点存储能力有限的问题。 主观下线:主服务器master宕机后,哨兵1检测到这个结果,系统并不会马上进行failover,这仅仅是哨兵1认为主服务器不可用,这种现

    2024年02月09日
    浏览(35)
  • Redis之Sentinel(哨兵)机制

    Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包