Redis中的Sentinel(一)

Sentinel

概述

Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属性的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

例子

  • 举个例子。图中展示了一个Sentinel系统监视服务器的例子其中:
    1.用双环图案表示的是当前的主服务器server1
    2.用单环图表示的是主服务器的三个从服务器server2、server3以及server4
    3.server2、server3、server4三个从服务器正在复制主服务器server1,而Sentinel系统则在监视所有四个服务器
    在这里插入图片描述
  • 假设这时,主服务器server1进入下线状态,那么从服务器server2、server3、server4对主服务器的复制操作将被中止,并且Sentinel系统会察觉到server1已下线,如图所示(下线的服务器用虚线表示)
    在这里插入图片描述
  • 当server1的下线时长超过用户设定的下线时长上限时,Sentinel系统就会对
    server1执行故障转义操作:
    1.首先,Sentinel系统会挑选server1属下的其中一个从服务器,并将这个被选中的
    从服务器升级为新的主服务器
    2.之后,Sentinel系统会向server1属性的所有从服务器发送新的复制指令,让它们称为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕
    3.另外,Sentinel还会继续监视已下线的server1,并在它重新上线时,将它设置为新的
    主服务器的从服务器
    在这里插入图片描述

如图所示。Sentinel将系统2升级为新的主服务器,并让服务器server3和server4成为
sever2的从服务器的过程,之后,如果server1重新上线的话,它将被Sentinel系统降级
为server2的从服务器
在这里插入图片描述

启动并初始化Sentinel

redis-sentinel /path(你自己的路径)/sentinel.conf

或者

redis-server /path(你自己的路径)/sentinel.conf -- sentinel

这两个命令的效果完全相同。
当一个Sentinel启动时,他需要执行以下步骤:

  • 1.初始化服务器
  • 2.将普通Redis服务器使用的代码替换成Sentinel专用代码
  • 3.初始化Sentinel状态
  • 4.根据给定的配置文件,初始化Sentinel的监视主服务器列表。}
  • 5.创建连向主服务器的网络连接

初始化服务器。

首先,因为Sentinel本质上只是一个运行在特殊模式下的Redis服务器,所以启动Sentinel的第一步,就是初始化一个普通的Redsi服务器,不过因为Sentinel执行的工作和普通Redis服务器执行的工作不同,
所以Sentinel的初始化过程和普通Redis服务器的初始化过程并不完全相同。例如,普通服务器在初始化时会通过载入RDB文件或者AOF文件来还原数据库状态,但是因为Sentinel并不使用数据库,所以初始化Sentinel时就不会载入RDB文件或者AOF文件
在这里插入图片描述

使用Sentinel专用代码。

启动Sentinel的第二个步骤就是将一部分普通Redis服务器使用的代码替换成Sentinel专用代码。比如说,普通Redis服务器使用redis.h/REDIS_SERVERPORT常量的值作为服务器端口:

#define REDIS_SERVERPORT 6379

而Sentinel则使用sentinel.c/REDIS_SENTINEL_PORT常量的值作为服务器端口:

#define REDIS_SENTINEL_PORT 26379

除此之外,普通Redis服务器使用redis.c(6.0版本以上可能在server.c)/redisCommandTable作为服务器的命令表:

struct redisCommand redisCommandTable[] = {{"get",getCommand,2,"read-only fast @string",0,NULL,1,1,1,0,0,0},
{"getex",getexCommand,-2,"write fast @string",0,NULL,1,1,1,0,0,0},
{"set",setCommand,-3,"write use-memory @string",0,NULL,1,1,1,0,0,0},
{"setnx",setnxCommand,3,"write use-memory fast @string",0,NULL,1,1,1,0,0,0},
{"setex",setexCommand,4,"write use-memory @string",0,NULL,1,1,1,0,0,0},
{"append",appendCommand,3,"write use-memory fast @string",0,NULL,1,1,1,0,0,0},
{"strlen",strlenCommand,2,"read-only fast @string",0,NULL,1,1,1,0,0,0},
{"del",delCommand,-2,"write @keyspace",0,NULL,1,-1,1,0,0,0},
{"unlink",unlinkCommand,-2,"write fast @keyspace",0,NULL,1,-1,1,0,0,0},
{"exists",existsCommand,-2,"read-only fast @keyspace",0,NULL,1,-1,1,0,0,0},
{"mget",mgetCommand,-2,"read-only fast @string",0,NULL,1,-1,1,0,0,0},
// ....
}

而Sentinel则使用sentinel.c/sentinelcmds作为服务器的命令表,并且其中的INFO命令会使用Sentinel模式下的专用实现sentinel.c/sentinelInfoCommand函数,而不是普通Redis服务器使用的
实现redis.c/infoCommand函数:

struct redisCommand sentinelcmds[] = {{"ping",pingCommand,1,"fast @connection",0,NULL,0,0,0,0,0},{"sentinel",sentinelCommand,-2,"admin",0,NULL,0,0,0,0,0},{"subscribe",subscribeCommand,-2,"pub-sub",0,NULL,0,0,0,0,0},{"unsubscribe",unsubscribeCommand,-1,"pub-sub",0,NULL,0,0,0,0,0},{"psubscribe",psubscribeCommand,-2,"pub-sub",0,NULL,0,0,0,0,0},{"punsubscribe",punsubscribeCommand,-1,"pub-sub",0,NULL,0,0,0,0,0},{"publish",sentinelPublishCommand,3,"pub-sub fast",0,NULL,0,0,0,0,0},{"info",sentinelInfoCommand,-1,"random @dangerous",0,NULL,0,0,0,0,0},{"role",sentinelRoleCommand,1,"fast read-only @dangerous",0,NULL,0,0,0,0,0},{"client",clientCommand,-2,"admin random @connection",0,NULL,0,0,0,0,0},{"shutdown",shutdownCommand,-1,"admin",0,NULL,0,0,0,0,0},{"auth",authCommand,-2,"no-auth fast @connection",0,NULL,0,0,0,0,0},{"hello",helloCommand,-1,"no-auth fast @connection",0,NULL,0,0,0,0,0},{"acl",aclCommand,-2,"admin",0,NULL,0,0,0,0,0,0},{"command",commandCommand,-1, "random @connection", 0,NULL,0,0,0,0,0,0}
};

sentinel命令表也解释了为什么在Sentinel模式下Redis服务器不能执行诸如SET、DBSIZE、EVAL等等这些命令,因为服务器根本没有在命令表中载入这些命令。PING、SENTINEL、INFO、SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE和PUNSUBSCRIBE这七个命令就是客户端可以对Sentinel执行的全部命令了

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

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

相关文章

DIY蓝牙键盘(1) - 理解 键盘报文(免费)

DIY蓝牙键盘(1) - 理解键盘报文 1. 键盘报文体验 一个键盘对于用户的体验是,用户按按键A他能看到字母A会在主机上显示出来。那这是如何实现的? 其实很简单,只要键盘发送下面的两个报文给主机,字母A就能在主机上显示出来。 (1)…

JS详解-手写Promise!!!

前言: 针对js的深入理解,作者学习并撰写以下文章,由于理解认知有限难免存在偏差,请大家指正!所有定义来自mdn。 Promise介绍: 对象表示异步操作最终的完成(或失败)以及其结果值. 描…

python-基础篇-字符串、列表、元祖、字典-字符串

文章目录 2.3字符串、列表、元祖、字典2.3.1字符串2.3.1.1字符串介绍2.3.1.1.1python中字符串的格式:2.3.1.1.2字符串在内存中的存储方式 2.3.1.2字符串的输入输出2.3.1.2.1字符串输出2.3.1.2.2字符串输入2.3.1.2.3组字符串的方式 2.3.1.3下标和切片2.3.1.3.1下标索…

挖一挖:PostgreSQL Java里的double类型存储到varchar精度丢失问题

前言 大概故事是这样的,PostgreSQL数据库,表结构: create table t1(a varchar);然后使用标准的Java jdbc去插入数据,其基本代码如下: import java.sql.*; public class PgDoubleTest {public static void main(Stri…

聊聊测试用例评审流程

测试人员将需求熟悉完成后,开始编写相应的测试用例,待测试用例编写完成后只是测试用例完成前的第一步,后边的流程需要组织线上或线下评审会议等等。 首先要了解测试用例评审的最终目的是什么:提高测试用例的质量和覆盖率&#xff…

学浪里面的视频怎么保存到本地

很多人都在学浪里面买了课程,可是却找不到下载学浪课程的方法,这里Leo小黑教大家如何把学浪里购买的视频课程下载下来 注意:此方法不可以下载直播回放 1.解压我给大家准备的小浪助手.exe 2.打开小浪助手.exe 3.要是有抖音账号和学浪绑定的手机账号一样那就可以直接…

3.6k star, 免费开源跨平台的数据库管理工具 dbgate

3.6k star, 免费开源跨平台的数据库管理工具 dbgate 分类 开源分享 项目名: dbgate -- 免费开源跨平台的数据库管理工具 Github 开源地址: GitHub - dbgate/dbgate: Database manager for MySQL, PostgreSQL, SQL Server, MongoDB, SQLite and others. Runs under…

Python如何解决“滑动拼图”验证码(8)

前言 本文是该专栏的第67篇,后面会持续分享python爬虫干货知识,记得关注。 做过爬虫项目的同学,或多或少都会接触到一些需要解决验证码才能正常获取数据的平台。 在本专栏之前的文章中,笔者有详细介绍通过python来解决多种“验证码”(点选验证,图文验证,滑块验证,滑块…

【Java笔记】多线程0:JVM线程是用户态还是内核态?Java 线程与OS线程的联系

文章目录 JVM线程是用户态线程还是内核态线程什么是用户态线程与内核态线程绿色线程绿色线程的缺点 线程映射稍微回顾下线程映射模型JVM线程映射 线程状态操作系统的线程状态JVM的线程状态JVM线程与OS线程的状态关系 Reference 今天复盘一下Java中,JVM线程与实际操作…

全流程基于GIS、python机器学习技术的地质灾害风险评价与信息化建库应用

入门篇,ArcGIS软件的快速入门与GIS数据源的获取与理解;方法篇,致灾因子提取方法、灾害危险性因子分析指标体系的建立方法和灾害危险性评价模型构建方法;拓展篇,GIS在灾害重建中的应用方法;高阶篇&#xff1…

(三)LTspice学习交流分析

文章目录 前言一、Edit simulation cmd二、添加激励总结 前言 上一节我们学习了LTspice的安装,很简单,无脑安装 (一)LTspice简介 (二)LTspice学习之简介2 今天我们来学习一下LTspice另一个非常重要的仿真功…

改进YOLO:YOLOv8结合swin transformer

目录 1、修改yaml文件 2、添加 SwinTransformer.py 3、修改 tasks.py 4、根目录增加文件 1、修改yaml文件 修改 ultralytics/cfg/models/v8/yolov8.yaml backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] #…