Redis中的Sentinel(四)

Sentinel

接收来自主服务器和从服务器的频道消息。

当Sentinel与一个主服务器或者从服务器建立起订阅连接之后,Sentinel就会通过订阅连接,向服务器发送以下命令:

SUBSCRIBE _sentinel_:hello

Sentinel对_sentinel_:hello频道的订阅会一直持续到Sentinel与服务器的连接断开为止。这也就是说,对于每个与Sentinel连接的服务器,Sentinel既通过命令连接向服务器的_sentinel_:hello频道发送消息,又通过订阅连接从服务器的_sentinel_:hello频道接收消息,如图所示。对于监视同一个服务器的多个Sentinel来说,一个Sentinel发送的信息会被i其他Sentinel接收到,这些信息会被用于更新其他Sentinel对发送信息Sentinel的认知,也会被用于更新其他Sentinel对被监视服务器的认知
在这里插入图片描述

例子

  • 举个例子。假设现在有sentinel1/2/3三个Sentinel在监视同一个服务器,那么当sentinel1向服务器的_sentinel_:hello频道发送一条信息时,所有订阅了_sentinel_:hello频道的Sentinel(包括sentinel1自己在内)
    都会收到这条信息,如图所示。当一个Sentinel从_sentinel_:hello频道收到一条信息时,Sentinel会对这条信息进行分析,提取出信息中的
    Sentinel IP地址、Sentinel端口号、Sentinel运行ID等八个参数,并进行以下检查:
    1.如果信息中记录的Sentinel运行ID和接收信息的Sentinel的运行ID相同,那么说明这条信息时Sentinel自己发送的,Sentinel将丢弃这条信息,不做进一步处理
    2.相反地,如果信息中记录的Sentinel运行ID和接收信息的Sentinel的运行ID不相同,那么说明这条信息是监视同一个服务器的其他Sentinel发来的,接收信息的Sentinel将根据信息中的各个参数,对相应主服务器
    的实例结构进行更新
    在这里插入图片描述

更新sentinels字典

Sentinel为主服务器创建的实例结构中的sentinels字典保存了除了Sentinel本身之外,所有同样监视这个主服务器的其他Sentinel的资料:

  • 1.sentinels字典的键是其中一个Sentinel的名字,格式为ip:port,比如对于IP地址为127.0.0.1,端口号为26379的Sentinel来说,这个Sentinel在sentinels字典中的键就是"127.0.0.1:26379"
  • 2.sentinels字典的值则是键所对应的Sentinel的实例结构,比如对于键"127.0.0.1:26379"来说,这个键在sentinels字典中的值就是IP为1270.0.01,端口号为26379的Sentinel的实例结构

当一个Sentinel接收到其他Sentinel发来的信息时(我们称呼发送信息的Sentinel为源Sentinel,接收信息的Sentinel为目标Sentinel),目标Sentinel会从信息中分析并提取出以下两方面参数:

  • 1.与Sentinel有关的参数:源Sentinel的IP地址、端口号、运行ID和配置纪元
  • 2.与主服务器有关的参数:源Sentinel正在监视的主服务器的名字、IP地址、端口号和配置纪元

根据信息中提取出主服务器参数,目标Sentinel会在自己的Sentinel状态的masters字典中查找相应的主服务器实例结构,然后根据提取出的Sentinel参数,检查主服务器实例结构的sentinels字典中,源Sentinel的实例结构是否存在:

  • 1.如果源Sentinel的实例结构已经存在,那么对源Sentinel的实例结构进行更新
  • 2.如果源Sentinel的实例结构不存在,那么说明源Sentinel是刚刚开始监视主服务器的新Sentinel,目标Sentinel会为源Sentinel创建一个新的实例结构,并将这个结构添加到sentinels字典里面
例子

举个例子。假设分别有127.0.0.1:26379、127.0.0.1:26380、1270.0.1:26381三个Sentinel正在
监视主服务器127.0.0.1:6379,那么当127.0.0.1:26379这个Sentinel接收到以下信息时:

1."message"
2."_sentinel_:hello"
3."127.0.0.1,26379,a5bd47a1e569ed14567eca650de57f9d83301638,0,mymaster,127.0.0.1,6379,0"1."message"
2."_sentinel_:hello"
3."127.0.0.1,26381,a5bd47a1e569ed14567eca650de57f9d83301637,0,mymaster,127.0.0.1,6379,0"1."message"
2."_sentinel_:hello"
3."127.0.0.1,26380,a5bd47a1e569ed14567eca650de57f9d83301636,0,mymaster,127.0.0.1,6379,0"

Sentinel将执行以下动作:

  • 1.第一条信息的发送者127.0.0.1:26379自己,这条信息会被忽略。
  • 2.第二条信息的发送者为127.0.0.1:26381,Sentinel会根据这条信息中提取出的内容,对sentinels字典中的127.0.0.1:26381对应的实例进行更新
  • 3.第三条信息的发送者为127.0.0.1:26380,Sentinel会根据这条信息提取出的内容,对sentinels字典中的127.0.0.1:26380所对应的实例结构进行更新图中展示了Sentinel127.0.0.1:26379为主服务器127.0.0.1:6379创建的实例结构,以及结构中的sentinels字典和127.0.0.1:26379一样,其他两个Sentinel也会创建类似于图中所示的sentinels字典,区别在于字典中保存的
    Sentinel信息不同:
  • 1.127.0.0.1:26380创建的sentinels字典会保存127.0.0.1:26379和127.0.0.1:26381两个Sentinel的信息
  • 2.而127.0.0.1:23681创建的sentinels字典则会保存127.0.0.1:26379和127.0.0.1:26380两个Sentinel的信息

因为一个Sentinel可以通过分析接收到的频道信息来获知其他Sentinel的存在,并通过发送频道信息来让其他Sentinel知道自己的存在,所以用户在使用Sentinel的时候并不需要提供各个Sentinel的地址信息,监视同一个
主服务器的多个Sentinel可以自动发现对方
在这里插入图片描述

创建连向其他的Sentinel的命令连接

当Sentinel通过频道信息发现一个新的Sentinel时,它不仅会为新Sentinel在sentinels字典中创建相应的实例结构,还会创建一个连向新Sentinel的命令连接,而新Sentinel也同样会创建连向这个Sentinel的命令连接,最终监视同一主服务器将形成相互连接的网络:SentinelA有连向SentinelB的命令连接,而SentinelB也有连向SentinelA的命令连接。如图所示,三个监视同一主服务器的Sentinel之间是如何互相连接的。使用命令连接的各个Sentinel可以通过向其他Sentinel发送命令请求来进行信息交换
在这里插入图片描述

Sentinel之间不会创建订阅连接

Sentinel在连接主服务器或者从服务器时,会同时创建命令连接和订阅连接,但是在连接其他Sentinel时,却只会创建命令连接,而不创建订阅连接。这是因为Sentinel需要通过接收主服务器或者从服务器发来的
频道信息来发现未知的新Sentinel,所以才需要建立订阅连接,而相互已知的Sentinel只要使用命令连接来进行通信就足够了

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux之文件系统、inode和动静态库制作和发布

一、背景 1.没有被打开的文件都在磁盘上 --- 磁盘级文件 2.对磁盘级别的文件,我们的侧重点 单个文件角度 -- 这个文件在哪里,有多大,其他属性是什么? 站在系统角度 -- 一共有多少文件?各自属性在哪里&#xff1f…

linux 安装 pptp 协议

注意:目前iOS已不支持该协议 yum -y install ppp wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/p/pptpd-1.4.0-2.el7.x86_64.rpm yum -y install pptpd-1.4.0-2.el7.x86_64.rpm vi /etc/pptpd.conf 去除 localip 和 remoteip的注释 …

《图解Vue3.0》- 调试

如何对vue3项目进行调试 调试是开发过程中必备的一项技能,掌握了这项技能,可以很好的定义bug所在。一般在开发vue3项目时,有三种方式。 代码中添加debugger;使用浏览器调试:sourcemap需启用vs code 调试:先开启node服…

栈的详解和例题(力扣有效括号)

感谢各位大佬的光临,希望和大家一起进步,望得到你的三连,互三支持,一起进步 个人主页:LaNzikinh-CSDN博客 收入专栏:初阶数据结构_LaNzikinh篮子的博客-CSDN博客 文章目录 前言一.什么是栈二.栈的实现三.例题&#xff…

深入浅出 -- 系统架构之分布式多形态的存储型集群

一、多形态的存储型集群 在上阶段,我们简单聊了下集群的基本知识,以及快速过了一下逻辑处理型集群的内容,下面重点来看看存储型集群,毕竟这块才是重头戏,集群的形态在其中有着多种多样的变化。 逻辑处理型的应用&…

Java设计模式—享元(FlyWeight)模式

享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象 public abstract class Piece {protected PieceColor m_color;protected PiecePos m_pos;public Piece(PieceColor color ,PiecePos pos){m_color color;m_pos pos;}public ab…

linux 迁移home目录以及修改conda中pip的目录

1)sudo rsync -av /home/lrf /data/home/lrf 将/home目录下的文件进行负责(假设机械硬盘挂载在/data目录下) 2)usermod -d /data/home/lrf -m lrf 修改用户$HOME变量 3)vi /etc/passwd 查看对应用户的$HOME变量是否成…

CTF之矛盾

这一题就是php的弱比较“” 这里要求输入的不是数字,并且输入要为1才打印flag 那我们就输入一个1后面接随便什么字符,因为php的弱比较将字符与数字进行比较的时候,会把字符转换成数字再比较,当转换到字符时后面便都为空了 flag{…

Jetson nano部署Yolov8 安装Archiconda3+创建pytorch环境(详细教程+错误解决)

由于jetson nano 是aarch64架构,Anaconda官方不支持aarch64架构,所以有了一个叫“Archiconda”,其目的就是将conda移植到aarch64平台上 一. 下载地址Releases Archiconda/build-tools GitHub 然后安装archiconda bash Archiconda3-0.2.3…

机器学习周报第36期

目录 一、文献阅读1.1 摘要1.2 论文背景1.3 论文背景1.4 视频处理特征传播1.5 论文方法 二、相关代码 一、文献阅读 论文标题:Object Detection in Videos by High Quality Object Linking 1.1 摘要 与静态图像中的目标检测相比,视频中的目标检测由于…

边界值设计测试用例

​ 边界值分析法(Boundary Value Analysis,BVA)的测试用例来自于等价类的边界,是等价类划分法的补充。根据边界值划分法,等价类分析法中的测试数据不是选取等价类中的典型值或任意值,而是应当选取正好等于、…

TiDB MVCC 版本堆积相关原理及排查手段

导读 本文介绍了 TiDB 中 MVCC(多版本并发控制)机制的原理和相关排查手段。 TiDB 使用 MVCC 机制实现事务,在写入新数据时不会直接替换旧数据,而是保留旧数据的同时以时间戳区分版本。 当历史版本堆积过多时,会导致读…