Redis中的Sentinel(二)

Sentinel

初始化Sentinel状态。

在应用了Sentinel的专用代码之后,接下来,服务器会初始化一个sentinel.c/sentinelState结构(简称Sentinel状态),这个结构
保存了服务器中所有和Sentinel功能有关的状态(服务器的一般状态仍然由redis.h/redisServer保存);

struct sentinelState {
// 当前纪元,用于实现故障转移
unit64_t current_epoch;
// 保存了所有被这个sentinel监视的主服务器
// 字典的键是主服务器的名字
// 字典的值则是一个指向sentinelRedisInstance结构的指针
dict *masters;
// 是否进入了TILT模式?
int tilt;
// 目前正在执行的脚本的数量
int running_scripts;
// 进入TILT模式的时间
mstime_t tilt_start_time;
// 最后一次执行时间处理器的时间
mstime_t previous_time;
// 一个FIFO队列,包含了所有需要执行的用户脚本
list *scripts_queue;
} sentinel;

初始化Sentinel状态的masters属性

Sentinel状态中的masters字典记录了所有被Sentinel监视的主服务器的相关信息,其中:

  • 1.字典的键是被监视主服务器的名字
  • 2.而字典的值则是被监视主服务器对应的sentinel.c/sentinelRedisInstance结构。

每个sentinelRedisInstance结构(简称实例结构)代表一个被Sentinel监视的Redis服务器实例(instance),这个实例可以是主服务器、从服务器,或者另外一个Sentinel。实例结构包含的属性非常多,下方代码展示了实例结构在表示主服务器时使用的其中一部分属性

sentinelRedisInstance.addr属性是一个指向sentinel.c/sentinelAddr结构的指针,这个结构保存着实例的IP地址和端口号:

typedef struct sentinelAddr {
char *ip;
int port;
} sentinelAddr;

对Sentinel状态的初始化将引发对masters字典的初始化,而masters字典的初始化是根据被载入的Sentinel配置文件来进行的。

sentinelRedisInstance结构

typedef struct sentinelRedisInstance {
// 标识值,记录了实例的类型,以及该实例的当前状态
int flags;
// 实例的名字
// 主服务器的名字由用户在配置文件中设置
// 从服务器以及Sentinel的名字由Sentinel自动设置
// 格式为ip:port 例如"127.0.0.1:26379"
char *name;// 实例的运行ID
char *runid;// 配置纪元,用于实现故障转移
uint64_t coding_epoch;
// 实例的地址
sentinelAddr *addr;
// SENTINEL down-after-milliseconds选项设定的值
// 实例无响应多少毫秒之后才会被判断为主观下线(subjectively down)
mstime_t down_after_period;// SENTINEL monitor <master-name> <IP> <port> <quorum>选项中的quorum参数
// 判断这个实例为客观下线(objectively down)所需的支持投票数量
int quorum;// SENTINEL parallel-syncs <master-name> <number>选项的值
// 在执行故障转移操作时,可以同时对新的主服务器进行同步的从服务器数量
int parallel_syncs;
// SENTINEL failover-timeout <master-name> < ms> 选项的值
// 刷新故障迁移状态的最大时限
mstime_t failover_timeout;
// ....
} sentinelRedisInstance;

例子

  • 举个例子。如果用户在启动Sentinel时,指定了包含以下内容的配置文件:
# master1 configure
sentinel monitor master1 127.0.0.1 6379 2
sentinel down-after-milliseconds master1 3000
sentinel parallel-syncs master1 1
sentinel failover-timeout master1 900000
# master2 configure
sentinel monitor master2 127.0.0.1 12345 5
sentinel down-after-milliseconds master2 50000
sentinel parallel-syncs master2 5
sentinel failover-timeout master2 450000

那么Sentinel将为主服务器master1创建如图所示的实例结构,并未主服务器master2创建如图所示的实例结构,而这两个实例结构又会被保存到Sentinel状态的masters字典中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建连向主服务器的网络连接。

初始化Sentinel的最后一步是创建连向被监视主服务器的网络连接,Sentinel将成为主服务器的客户端,它可以向主服务器发送命令,并从命令回复中获取相关的信息。对于每个被Sentinel监视的主服务器来说,Sentinel会创建两个连向主服务器的异步网络连接:

  • 1.一个是命令连接,这个链接专门用于向主服务器发送命令,并接收命令回复
  • 2.另一个是订阅连接,这个连接专门用于订阅主服务器的_sentinel_:hello频道

如图所示,展示了一个Sentinel向被它监视的两个主服务器master1和master2创建命令连接和订阅连接的例子
在这里插入图片描述

疑问

为什么有两个连接?
在Redis目前的发布与订阅功能中,被发送的信息都不会保存在Redis服务器里面,如果在信息发送时,想要接收信息的客户端不在线或者断线,那么这个客户端就会丢失这条信息。因此,为了不丢失_sentinel_:hello频道的任何信息,Sentinel必须专门用一个订阅连接来接收该频道的信息。
另一方面,除了订阅频道之外,Sentinel还必须向主服务器发送命令,以此来与主服务器进行通信,所以Sentinel还必须向主服务器创建命令连接。因为Sentinel需要与多个实例创建多个网络连接,所以Sentinel使用的是异步连接

通过这两个连接,Sentinel 可以实时监控 Redis 实例的状态,并在发生故障时迅速做出反应。此外,通过使用两个连接而不是一个,可以增加系统的健壮性,一旦其中一个连接出现问题,Sentinel 仍然可以通过另一个连接与 Redis 进行通信,以继续执行监视和管理操作。总之,Sentinel 向 Redis 主服务器创建两个连接是为了增强监视的可靠性和鲁棒性,确保 Sentinel 能够及时感知到 Redis 实例的状态变化并采取相应的措施。

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

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

相关文章

SaaS 电商设计 (十) 记一次 5000kw 商品数据ES迁移 (详细的集群搭建以及线上灰度过程设计)

目录 一.背景二.技术目标三.技术方案3.1 整体流程3.2 ES 切换前:完成整体新集群的搭建.i:拓扑结构设计ii: 如何选择整体的 **ES** 集群配置. 3.3 **ES** 版本切换中3.3.1 多client版本兼容3.3.2 Router的设计 3.4 ES 切换后3.5 开箱即用3.5.1 开箱使用 demo 演示3.5.2 使用过程…

2024.3.17力扣每日一题——最小高度树

2024.3.17 题目来源我的题解方法一 深度优先遍历方法二 广度优先遍历方法三 拓扑排序 题目来源 力扣每日一题&#xff1b;题序&#xff1a;310 我的题解 方法一 深度优先遍历 从每一个节点开始进行深度优先遍历并计算以该节点为根节点的树的深度&#xff0c;使用哈希表存储对…

团体程序设计天梯赛-练习集 01

天梯赛题解合集 团体程序设计天梯赛-练习集 (L1-001 - L1-012) 团体程序设计天梯赛-练习集 (L1-013 - L1-024) 团体程序设计天梯赛-练习集 (L1-025 - L1-036) 团体程序设计天梯赛-练习集 (L1-037 - L1-048) L1-001 Hello World 输出题 样例 输入 输出 Hello World!思…

爬虫之数据神器5---Peewee数据库关系映射实践

前言&#xff1a; 继续上一章&#xff1a;爬虫之数据神器4---Peewee事务管理和连接池用法-CSDN博客 本章主要就是对peewee的实战进行一些案例的讲解&#xff01; 正文&#xff1a; 1.模型数据操作 1.1 案例:建立学生和课程模型,实现基本的CRUD 我们先创建Student和Course两…

【LAMMPS学习】七、加速性能(5)加速器包比较

7. 加速性能 7.1.基准测试 7.2.测试性能 7.3.通用技巧 7.4.加速器包 7.5.加速器包比较 接下来将比较和对比各种加速器选项&#xff0c;因为有多种方法可以执行 OpenMP 线程、在 GPU 上运行、优化 CPU 上的向量单元以及在英特尔至强融核&#xff08;协&#xff09;处理器上…

爬虫之数据神器4---Peewee事务管理和连接池用法

前言&#xff1a; 继续上一章节&#xff1a;爬虫之数据神器3---Peewee模型定义详解-CSDN博客 事务管理和连接池的重要性 事务管理和连接池是在开发和维护数据库应用程序时非常重要的概念和技术。 事务管理&#xff1a;事务是指作为一个逻辑单元执行的一系列数据库操作。事务具…

图像处理ASIC设计方法 笔记13 图像旋转ASIC的输入输出电路

文章目录 1 DPRAM:双端口 RAM2 IDT Integrated Device Technology, Inc. 公司介绍3 IDT70T633S10DDI4 TMS320C64145 旋转ASIC的输入输出框图图像旋转ASIC的输入输出电路案例用到的芯片相关介绍如下。 1 DPRAM:双端口 RAM DPRAM 的特点是可以通过两个端口同时访问,具有两套完全…

数据结构入门系列-栈的结构及栈的实现

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 栈 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一段进行插入和删除元素操作&#xff0c;进行数据输入和删除操作的一端称为栈顶&#xff0c;另…

如何在TestNG中获取运行时的测试用例细节?

这篇文章将讨论如何在运行时获取测试用例的细节。我们可能在不同的场景中需要这些信息&#xff0c;比如创建定制的报告或者开发一个实时跟踪系统来监视测试用例的进度。 让我们从使用TestNG运行测试套件开始开始。然后&#xff0c;我们将尝试检索每个测试用例的细节&#xff0…

【授时防火墙】GPS北斗卫星授时信号安全防护装置系统

【授时防火墙】GPS北斗卫星授时信号安全防护装置系统 【授时防火墙】GPS北斗卫星授时信号安全防护装置系统 1、装置概述 卫星信号安全防护装置&#xff08;以下简称“防护装置”&#xff09;是一款专门针对卫星导航授时安全的设备。该设备能接收 BD 系统和 GPS 系统卫星信号&am…

InternLM2-Chat-1.8B 模型测试

在interStudio进行InternLM2-Chat-1.8B模型访问&#xff0c;进入开发机后 配置基础环境 新建conda环境并且进入 conda create -n demo python3.10 -y conda activate demo 下载pytorch等相关包 conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.…

ChernoCPP 2

视频链接&#xff1a;【62】【Cherno C】【中字】C的线程_哔哩哔哩_bilibili 参考文章&#xff1a;TheChernoCppTutorial_the cherno-CSDN博客 Cherno的C教学视频笔记&#xff08;已完结&#xff09; - 知乎 (zhihu.com) C 的线程 #include<iostream> #include<th…

四、MySQL读写分离之MyCAT

一、读写分离概述 1、什么是读写分离&#xff1a; 读写分离&#xff1a;就是将读写操作分发到不同的服务器&#xff0c;读操作分发到对应的服务器 &#xff08;slave&#xff09;&#xff0c;写操作分发到对应的服务器&#xff08;master&#xff09; ① M-S (主从) 架构下&…

Java设计模式:外观模式之优雅门面(九)

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在软件工程中&#xff0c;设计模式是解决常见设计问题的经验总结&#xff0c;它为开发者提供了一种通用的、可复用的解决方案。外…

书生浦语训练营2期-第二节课笔记作业

目录 一、前置准备 1.1 电脑操作系统&#xff1a;windows 11 1.2 前置服务安装&#xff08;避免访问127.0.0.1被拒绝&#xff09; 1.2.1 iis安装并重启 1.2.2 openssh安装 1.2.3 openssh服务更改为自动模式 1.2.4 书生浦语平台 ssh配置 1.3 补充&#xff08;前置服务ok…

Thread的基本用法

目录 正文&#xff1a; 1.线程创建 2.线程休眠 3.获取线程实例 4.线程中断 5.线程等待join() 总结&#xff1a; 正文&#xff1a; 1.线程创建 线程创建是多线程编程的第一步&#xff0c;它涉及到创建一个可以并行执行的新线程。在Java中&#xff0c;有几种不同的方法可…

【Laravel】08 RESTful风格

【Laravel】08 视图模板动态渲染数据 1. RESTful风格 1. RESTful风格 (base) ➜ example-app php artisan make:model Blog -mc Model created successfully. Created Migration: 2024_04_01_143040_create_blogs_table Controller created successfully.(base) ➜ example-…

深入理解微信小程序的自定义组件模型

微信小程序作为一个独立的应用开发平台,提供了丰富的组件库供开发者使用。但在某些复杂的业务场景下,我们需要根据自身的需求来定制化组件。小程序为我们提供了自定义组件的能力,让我们可以更灵活地构建应用界面。 如果对微信小程序自定义组件还不太清楚的&#xff0c;请参考 …

简述JMeter实现分布式并发及操作

为什么要分布式并发&#xff1f; JMeter性能实践过程中&#xff0c;一旦进行高并发操作时就会出现以下尴尬场景&#xff0c;JMeter客户端卡死、请求错误或是超时等&#xff0c;导致很难得出准确的性能测试结论。 目前知道的有两个方法可以解决JMeter支撑高并发&#xff1a; …

pta 1036 跟奥巴马一起编程

1036 跟奥巴马一起编程 分数 15 全屏浏览 切换布局 作者 CHEN, Yue 单位 浙江大学 美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014 年底&#xff0c;为庆祝“计算机科学教育周”正式启…