概念介绍:

Sentinel(哨兵)是Redis的高可用性解决方案,主要是通过一个或多个Sentinel实例组成的Sentinel系统对任意多个主服务器以及这些主服务器的所有从服务器进行监视,当某个主服务器下线后,Sentinel系统自动将该主服务器下的某个从服务器升级为新的主服务器,然后由新的主服务器继续处理来自客户端的命令请求。Sentinel系统工作状况如下图所示:

当server1的下线时长超过用户设定的下线时长上限时,Sentinel系统就会对server1执行故障转义操作:

1 首先,Sentinel系统会挑选server1属下的一个从服务器,并将它升级为主服务器

2 随后,Sentinel系统会向server1的其它所有从服务器发送新的复制命令,让它们成为新的主服务器的从服务器,当所有从服务器开始复制新的主服务器时,故障转义操作执行完毕。

3 另外,Sentinel系统还会继续监视已经下线的server1,当它重新上线时,将他设置为新的主服务器的从服务器。

Sentinel系统进行故障转移的过程比较复杂,我们接下来一一介绍:

(一) 启动并初始化Sentinel

  • 1.初始化服务器:

Sentinel本质上是一个运行在特殊模式下的redis服务器,它的特殊之处在于与普通的Redis服务器执行的工作是不同的,如下表所示列出了两者的功能点不同:

功能 使用情况
数据库和键值对方面额命令,比如Set、DEL、FLUSHDB 不适用
事务命令,比如MULTI、WATCH 不适用
脚本命令,比如EVAL 不适用
RDB持久化命令,比如SAVE、BGSAVE 不适用
AOF持久化命令,比如BGREWRITEOF 不适用
复制命令,比如SLAVEOF Sentinel内部可以使用,但是客户端不可以使用
发布与订阅命令,比如PUBLISH、SUBSCRIBE

SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE四个命令

在Sentinel内部和客户端可以使用,但PUBLISH命令不可以在内部使用

文件事件处理器(负责发送命令请求、处理命令回复) 在Sentinel内部使用,但关联的文件事件处理器和普通Redis服务器不同
事件事件处理器(负责执行serverCron函数)

Sentinel内部使用,时间事件的处理器仍然是serverCron函数,serverCron函数

会调用sentinel.c/sentinelTimer函数,后者包含了sentinel要执行的所有操作

从上面表格可以看出Sentine是没有使用到数据库相关的功能的,因此在初始化的时候,不用载入RDB文件和AOF文件。

  • 2.使用Sentinel专用代码:

普通服务器使用redis.h/REDIS_SERVERPORT常量的值作为服务器端口,而普通Redis服务器使用sentinel.c/REDIS_SENTINEL_PORT常量的值作为服务器端口。

此外普通服务器使用redis.c/redisCommandTable作为服务器的命令表,而Sentinel使用sentinel.c/sentinelcmds作为服务器的命令列表。

  • 3 初始化sentinel状态

服务器初始化sentinel状态要做的工作就是初始化一个sentinel.c/sentinelState结构(简称“sentinel状态”),该结构保存了所有与sentinel功能有关的状态。sentinelState结构如下图所示:

  • 4 初始化Sentinel状态的master属性

Sentinel状态的masters字典记录了所有被监视的主服务器相关的信息,其中:字典的键是被监视主服务器的名字,字典键对应的值是被监视主服务器对应的sentinel.c/sentinelRedisInstance的结构,sentinelRedisInstance可以对应主服务器,从服务器,或者另外一个sentinel。sentinelRedisInstance的结构如下图所示:

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

  • 5 创建连向主服务器的网络连接:

初始化sentinel的最后一步是创建连向被监视主服务器的网络连接,用以发送命令与从命令回复中获取信息。sentinel会创建两个连向主服务器的连接:

一个是命令链接,该连接专门用于向主服务器发送命令,并接受命令回复。

另一个是订阅连接,该连接专门用于订阅主服务器的_sentinel_:hello频道。

(二) 获取主服务器信息

Sentinel默认以每十秒一次的频率,通过命令连接向主服务器发送INFO命令,并通过分析命令回复获取主服务器器的信息。获取的信息主要有如下两个方面:

1 关于服务器本身的信息,比如run_id域记录的服务器运行id,以及role域记录的服务器角色。

另一方面,获取关于主服务器下所有的从服务器信息,每个从服务器都有一个slave字符串开头的行记录,每行的ip=域记录了从服务器的的IP地址,port==域记录了从服务器的端口号。根据IP地址和port端口,sentinel无须用户提供从服务器的地址信息,就可以自动发现从服务器的。

sentinel根据主服务器的run_id和role域的信息,将对主服务器的实力结构进行更新,如果run_id不同,比如主服务器重启,则会对实例结构更新。而主服务器返回的从服务器信息,如果已经存在,则进行更新,会在slaves字典中为这个主服务器创建一个新的实例结构。

(三)获取从服务器信息

当sentinel发现主服务器有新的从服务器时,除了在为这个主服务器创建一个新的从服务器实例结构之外。还会创建连接到从服务器的命令连接以及订阅连接。之后会默认每十秒通过命令连接向从服务器发送Info命令,并通过命令回复提取一下信息,并根据这些信息对从服务器的实力结构进行更新。

1 从服务器的运行ID run_id

2 从服务器的角色role

3 主服务器的IP地址master_host,以及master_port

4 主从服务器的连接状态master_link_status

5 从服务器的优先级slave_priority

6 从服务器的复制偏移量slave_repl_offset

(四)向主服务器和从服务器发送信息

默认情况下,sentinel会每两秒,通过命令连接向所有被监视的主服务器和从服务器发送一下格式的命令:

PUBLISH __sentinel__:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"

(五)REDIS-哨兵与集群的更多相关文章

  1. Spring Boot(十三):整合Redis哨兵,集群模式实践

    前面的两篇文章(Redis的持久化方案, 一文掌握Redis的三种集群方案)分别介绍了Redis的持久化与集群方案 -- 包括主从复制模式.哨兵模式.Cluster模式,其中主从复制模式由于不能自动做 ...

  2. Redis Sentinel分布式集群

    helm部署Redis哨兵分布式集群 Redis Sentinel集群 介绍 Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现.故障自动转移.配置中心和客 ...

  3. Redis高可用(持久化、主从复制、哨兵、集群)

    Redis高可用(持久化.主从复制.哨兵.集群) 目录 Redis高可用(持久化.主从复制.哨兵.集群) 一.Redis高可用 1. Redis高可用概述 2. Redis高可用策略 二.Redis持 ...

  4. 关于redis的主从、哨兵、集群

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  5. 关于redis主从|哨兵|集群模式

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  6. Redis主从哨兵和集群搭建

    主从配置 哨兵配置 集群配置 1.主从: 国王和丞相,国王权力大(读写),丞相权利小(读) 2.哨兵: 国王和王子,国王死了(主服务挂掉),王子继位(从服务变主服务) 3.集群: 国王和国王,一个国王 ...

  7. redis主从|哨兵|集群模式

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  8. Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】

    No cross,no crown . 不经历风雨,怎么见彩虹. Redis哨兵模式,用现在流行的话可以说就是一个"哨兵机器人",给"哨兵机器人"进行相应的配置 ...

  9. redis主从、集群、哨兵

    redis的主从.集群.哨兵 参考: https://blog.csdn.net/robertohuang/article/details/70741575 https://blog.csdn.net ...

  10. (六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)

    参考并感谢 官方文档 https://hub.docker.com/_/redis GitHub https://github.com/antirez/redis happyJared https:/ ...

随机推荐

  1. GitHub上的一个Latex模板

    代码下载:GitHub的项目地址或者在LATEX项目报告模板下载. 编译环境:Latex的编译器,如Ctex软件. 把源码clone或者下载到本地后,根据他的说明 如何开始 使用report.tex开 ...

  2. 掌握webpack(一)一张图让你明白webpack中output的filename、path、publicPath与主流插件的关系

    webpack的核心概念,放到2022年相信很多的小伙伴都已经非常清楚了.但是,对于webpack配置中的output.path.output.filename以及output.publicPath, ...

  3. doc指令

    ## 打开doc指令方法 1. 开始菜单 --所有应用--Windows系统--命令提示符 2. win+r 输入cmd 3. 桌面文件夹下面按住shift+右键选择在此处打开窗口 4. 文件导航栏路 ...

  4. 假如你想在VUE的main.js里根据条件按需引入注册组件以及样式,那就这样子写,附赠自己写的vue一个框架配置多系统按需加载系统路由以及组件办法

    假如你想在VUE的main.js里根据条件按需引入注册组件以及样式,那就这样子写 举例来说我想要引入大屏的一些组件,但是原来框架已经集成了多个项目,路由也是按需加载的,想要实现组件按需加载 先在mai ...

  5. Windows喝水记录工具v2.0

    Windows喝水记录工具v2.0 作者以前基本不喝水,后面体检出来身体出现了一些问题(肾结晶什么的),多喝水可以减轻甚至痊愈,由于没有喝水的习惯怕喝多或者喝少,所以做了这个桌面小工具,喝一杯记录一下 ...

  6. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(5)-Charles如何设置捕获Https会话

    1.简介 在大数据时代,互联网时代,个人信息安全尤为重要,网络安全在近日多起电信诈骗事情发酵下的情况下,引起国家,企业,个人对于互联网安全进一步的重视.而之前很多以http协议传输的网站出现的网站信息 ...

  7. 一文讲尽Thread类的源码精髓

    摘要:今天,我们就一起来简单看看Thread类的源码. 本文分享自华为云社区<[高并发]Thread类的源码精髓>,作者:冰 河. 前言 最近和一个朋友聊天,他跟我说起了他去XXX公司面试 ...

  8. 逗号(,)运算符在Javascript中

    逗号运算符 逗号运算符是二元运算符,它能够先执行运算符左侧的操作数,然后再执行右侧的操作数,最后返回右侧操作数的值. 逗号表达式: 一般形式:表达式1,表达式2,表达式3,......表达式n 求解过 ...

  9. Linux实时同步

    实时同步 一.概述 背景: 以前,通过rsync+定时任务实现对文件的定时备份/同步 现在,对于NFS来说,需要进行实时同步 选择: 分布式存储 使用实时同步服务+NFS 选择公有云对象存储OSS,七 ...

  10. 一把梭:REST API 全用 POST(转载)

    一把梭:REST API 全用 POST(转载) 原文链接: https://coolshell.cn/articles/22173.html 写这篇文章的原因主要还是因为V2EX上的这个贴子,这个贴 ...