概念介绍:

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. 《HTTP权威指南》– 9.识别和认证

    客户端识别与Cookie机制 承载用户相关信息的HTTP首部 From Email地址 User-Agent 浏览器软件 Referer 跳转链接<来自> Author ziation 用 ...

  2. JavaScript:箭头函数:省略写法

    之所以把箭头函数拎出来,是因为它不仅仅是声明函数的一种方式,它还是函数式编程的重要根基,它使得函数的使用更加的灵活,同时,它的语法,也相对于function声明的函数更加灵活和复杂. 箭头函数的省略写 ...

  3. go_xml_learn

    结构体转换为xml: type Person struct { XMLName xml.Name `xml:"person"` Name string `xml:"nam ...

  4. 关于Git在Visual studio及Git Bush中的日常操作教程,有图有说明,会一直更新本页内容... (Git相对SVN具有更加安全的分布式存储, 分支版本之间切换秒级速度, 分支版本强大灵活等特点)

    >安装命令行和TortoiseGit UI程序. <git bash的安装> https://git-scm.com/downloads <windows可视化工具 Torto ...

  5. Hadoop详解(07) - Hdfs数据压缩

    Hadoop详解(07) - Hdfs数据压缩 概述 压缩技术能够有效减少底层存储系统(HDFS)读写字节数.压缩提高了网络带宽和磁盘空间的效率.在运行MR程序时,I/O操作.网络数据传输. Shuf ...

  6. Springboot启动时加载

    @Component public class SpringBootInitialization1 implements ServletContextListener { @Override publ ...

  7. ArcGIS插件 - 易至天工影像加载插件

    众所周知,谷歌地图由于其分辨率高.更新速度快,且一直免费,受到行业内外各种人士的青睐,也正因如此,有人利用,有人嫉妒,导致它在国内市场无法再继续下去了.各大相关软件产商也主动或被动下架相关服务,可还是 ...

  8. [cocos2d-x]registerScriptHandler和registerScriptTapHandler区别

    一 .调用registerScriptHandler 的对象不同相应的响应函数和调用方式也不相同 1. 对象为layer时调用方式为: local function onNodeEvent(event ...

  9. MySQL优化四,高性能优化

    一,查询优化器 这个部分的整个过程是由MySQL的存储引擎来做的,优化器就会根据存储引擎来使用原来的开销, 优化后的开销,哪个更好一点? 1.如果是查询语句(select语句),首先会查询缓存是否已有 ...

  10. Metasploit2通关教程

    Metasploitable2靶机介绍: Metasploitable2 虚拟系统是一个特别制作的ubuntu操作系统,本身设计作为安全工具测试和演示常见漏洞攻击.这个版本的虚拟系统兼容VMware. ...