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

news2024/12/29 10:48:08

前言

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

导读

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

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

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

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

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

多哨兵模式的疑问

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

817a633809424f59b95b5add1fe5fddb.png

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

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

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

3f754e41994a4666bf83eda984309252.png

Redis架构如下:

10bd3fb864a74f7998de7767d0b895d0.png

就是简单的一主二从。

Sentinel的架构如下:

e0150d0465894e309fd5648bc7f4e2b0.png

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

e5b7b9b8a62b4ae6a5d1b22597863912.png

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

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

8fa9dc68ff3043dda35d1526d0f7a8d5.png

这个26380的:

a7389efcbac942fe9738ef576740cd4e.png

这是26379的:

57118f66efb345d58d9420402a0162ae.png

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

sentinel monitor mymaster 127.0.0.1 6379 2

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

测试关闭主节点:

f399cd0515424e6e960a9ae49b4a9ef4.png

已关闭,此时看从节点:

78cda6e7b3a74a13b68ce04c79a11513.png

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

7aa9d6ba6a324e89a372ddce115112f5.png

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

9b4270e2102549b2b443b98a9c365add.png

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

d8237dad61574174b200506ad93ffd04.png

大概在几秒后,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的判断。我们可以认为他们是通过主节点达到数据共享的。

9cb8c0a3f08d407abfdac679ac30cb8f.png

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

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

bfed9fd640834aa783972fd7ae7250f4.png

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到了多少?如果还有其他疑问,不放评论区留言和小伙伴们一起讨论吧,最后,不要吝啬你们的赞,动动小手,给博主一个大大的支持吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32的homeassistant(采用FreeRTOS操作系统)【第三章:HA服务器搭建、数据展示】

第三章开发环境 硬件设备STM32与各类传感器(与前两章一致)服务器设备腾讯云(阿里云等云服务器或自建服务器端均可)移植环境Homeassistant、EMQ 具体实现方案 视频教程 homeassistant配置MQTT集成以及传感器实体(ST…

C语言程序设计——结构体、枚举、联合

一、结构体 1. 概念 结构体是一种自定义的数据类型,它是一些值的集合,这些值称为成员变量,结构体由多个数据成员组成,这些成员可以是不同类型的变量。 2. 结构体的声明 2.1 一般声明 struct student {char name[10];int age; …

Nginx系列之 一 反向代理

目录 Nginx系列之 一 入门_开着拖拉机回家的博客-CSDN博 一、Nginx概述 二、反向代理 2.1 正向代理 2.2 反向代理 三、反向代理实战 3.1测试服务器 3.2 配置文件说明 3.3 反向代理实战案例一 1、目的 2、具体实现 3.4 反向代理实战案例二 1、目的 2、具体实现 入…

力扣 860. 柠檬水找零

题目来源:https://leetcode.cn/problems/lemonade-change/description/ C题解:由于收到的钱币只有5,10,20三种,对于5元直接收,对于10元找零1张5元,对于20元找零15元,可以找零105或者…

java 使用 geotools 将 shp 文件(zip压缩包)转换为 geoJson 格式

步骤0:你也可以参考这篇文章 :java实现geojson格式数据与shp文件相互转换 步骤1:引入引入geotools工具。 步骤2:编写工具类,获取shp的zip文件。 步骤3:编写工具类,解析shp文件成为jsonObject…

6.7Jmeter5.1,非GUI模式,通过命令行传递线程数和运行时间

原创文章,谢绝转载。 一、前提 本次做性能测试,需求是需要在Linux下的非GUI模式下执行。但用命令行执行时,线程数需要改变,为了执行方便,不需要每次都在脚本中修改线程数,那么线程数都需要通过参数传递&…

如何使用自有数据微调ChatGLM-6B

构建自己的数据集 数据格式:问答对 官网例子 ADGEN 数据集任务为根据输入(content)生成一段广告词(summary)。 { "content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖…

【雕爷学编程】Arduino动手做(22)——8X8 LED点阵MAX7219屏2

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这…

AI图像生成无需代码连接集简云数据表的方法

1 场景描述 人工智能的出现,各个领域都开始尝试将AI作为提高工作效率的必备工具。除了AI对话等,越来越多的AI图像生成工具也出现在市场上。这些AI图像生成工具可以自动创建惊人的图像、艺术作品和设计,从而帮助设计师和创意人员更快速地实现其…

下个月要备多少货?伙伴云零代码进销存系统让您一目了然

大量企业的商业模式是销售实体商品,他们需要进销存系统来帮助企业管理好采购、销售、仓储的业务流程,从而更高效稳定的获得利润,因此进销存是企业的核心业务场景。来看看伙伴云零代码进销存系统如何精准计算进货出货数量,让中小企…

unable to get local issuer certificate (_ssl.c:992)‘)]

操作系统mac os python 版本 python3.11 import edge_tts import asyncio TEXT "how are you"print(TEXT) voice zh-CN-YunxiNeural output 4.mp3 rate -4% volume 0% async def my_function():tts edge_tts.Communicate(text TEXT,voice voice,rate rate…

上海汽配IPO上会在即:由镇政府控股,募资还要偿还银行贷款?

近日,上海证券交易所披露的信息显示,上海汽车空调配件股份有限公司(以下简称“上海汽配”)将于7月21日接受上市委审议。据贝多财经了解,上海汽配已于7月13日更新了招股书(上会稿)。 本次冲刺IPO…

学Python编程为什么会对学好数学有帮助呢?

Python编程和数学有什么关系呢?Python的起源是怎样的呢? 我们先来简单认识一下Python,和Python交个朋友。 Python的全拼是P—Y—T—H—O—N,发音是Python,汉语解释是蟒蛇的意思。 我们再来看Python的图标&#xff0c…

STM32实现MLX90614非接触测温串口显示(标准库与HAL库实现)

目录 模块选择 编程环境 MLX90614基本原理 通信协议(SMBus通信,类IIC通信) 代码实现 STM32与模块之间接线表 1.标准库实现温度采集 2.HAL库实现温度采集 模块选择 STM32F103C8T6 MLX90614 非接触式红外测温传感器 编程环境 KEIL5&…

了解交换机接口的链路类型(access、trunk、hybrid)

上一个章节中讲到了vlan的作用及使用,这篇了解一下交换机接口的链路类型和什么情况下使用 vlan在数据包中是如何体现的,在上一篇的时候提到测试了一下,从PC1去访问PC4的时候,只从E0/0/2发送给了E0/0/3这是,因为两个接…

手把手GDB调试

确保你的程序有可调式的信息 使用gcc编译一个程序 ,带上一些额外的参数 -o0 -g-o0 :避免编译器优化,使用最低的优化等级,默认的编译选项 -g :生产调试信息 如果你已经有一个工程demo,使用cmake时注意使用Debug模式&…

Java使用poi-tl生成word文档添加超链接及添加多个超链接情况

首先是生成单个超链接情况,很简单 就是通过字符替换就行,但是替换的value格式是 TextRenderData data.put("attachment",Texts.of("文件名").link("http://wenjianlj文件路径.com").create()); 就是在替换的data&#…

spring复习:(39)注解方式的ProxyFactoryBean

一、定义接口 package cn.edu.tju.study.service;public interface MyService {void myMethod(); }二、定义实现类: package cn.edu.tju.study.service;public class MyServiceImpl implements MyService{Overridepublic void myMethod() {System.out.println(&qu…

认识一个失意的李白:如何制作一个人物生平二维码?

电影《长安三万里》的火爆,又一次唤醒了我们对大唐盛世的憧憬和向往。 飞流直下的瀑布、洒落床前的月光、花间独酌的美酒、胡天八月的大雪、越过青天的白鹭、长河孤烟的大漠、钟鼓馔玉的宴会……每每读起,那景象如在眼前。 对于一代又一代读着唐诗、听…

小程序一码跳多端的实现架构。。。

以常用的小程序,微信,支付宝为例, 现在要实现一个二维码,通过微信扫跳转微信小程序,通过支付包扫,跳转支付宝小程序,(其他小程序也如此) 实现思路,H5页面周转…