《Redis设计与实现》学习笔记-Sentinel(哨岗、哨兵)

Sentinel是Redis的高可用性解决方案,由一个或多个Sentinel实例组成Sentinel系统,可以用来监视任意多个主服务器和主服务器下的所有从服务器,当监视到主服务器下线之后会自动将下线主服务器下的从服务器升级为新的主服务器,由新主服务器代替已下线主服务器处理命令请求。

Sentinel是一个特殊的Redis服务器实例,Redis由一个或多个Sentinel实例构成Sentinel系统,Sentinel可以用来监测任意多个主服务器和从服务器,当Sentinel由于故障下线之后,Sentinel会进行故障转移,推选出新的主服务器。

启动Sentinel实例

可以通过下列命令启动Sentinel实例:

redis-sentinel /path/to/your/sentinel.conf

或者:

redis-server /path/to/your/sentinel.conf --sentinel

sentinel.conf配置文件示例:

sentinel monitor master1 127.0.0.1 6379 2

sentinel down-after-milliseconds master1 30000

sentinel parallel-syncs master1 1

sentinel failover-timeout master1 900000

Sentinel服务器和普通的Redis服务器使用的命令不一样,Sentinel不使用数据库所以不能使用SET等跟数据库有关的命令,在初始化时也不用载入RDB或AOF文件。

数据结构

Redis中通过sentinelState结构维护Sentinel相关的状态,其中有一个master字典维护被监视的主服务器,字典key是主服务器名称,value为一个sentinelRedisInstance结构。

Sentinel和普通服务器会建立两个连接,一个用来发送普通命令,一个用来订阅频道,用来订阅服务器的_sentinel_:hello频道,Sentinel会发布信息到该频道,在建立订阅连接之后会向服务器发送SUBSCRIBE _sentinel_:hello命令同时也订阅该频道的信息,当主服务器被多个Sentinel监视时,Sentinel可以通过该频道自动发现其它监视同一台主服务器的Sentinel,并把它添加到sentinelRedisInstance结构的sentinels属性中,并且和新发现的sentinel建立命令连接(不会创建订阅连接)。

Sentinel以默认十秒一次的频率,通过命令连接向主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的当前信息。当主服务器接收到INFO命令时会向Sentinel回复当前主服务器的runid、以及该主服务器下所有从服务器的ip和端口并把这些从服务器信息保存到主服务器对应的sentinelRedisInstance结构的slaves属性对应的字典中。

当Sentinel发现了主服务器的新从服务器时会和从服务器建立命令连接和订阅连接,并且发送INFO命令向从服务器获取从服务器的runid、主服务器的ip端口、主从服务器连接状态、主服务器优先级、从服务器复制偏移量。并发这些信息保存到sentinelRedisInstance结构中。

节点通信

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

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

该命令向_sentinel_:hello频道发送了一条消息,把Sentinel ip、Sentinel端口、Sentinel运行id、Sentinel当前配置纪元、主服务器 ip、主服务器端口、主服务器运行id、主服务器当前配置纪元发送到_sentinel_:hello频道,因为所有的Sentinel实例都订阅了_sentinel_:hello频道,所以这条发布消息会被所有的Sentinel实例收到,所有各个Sentinel可以通过这条订阅消息实现自动发现,并把新发现的Sentinel添加到sentinelRedisInstance结构的sentinels属性中。

Sentinel以每秒一次的频率向所有与它创建了命令连接的实例(包括主从服务器、Sentinel服务器)发送PING命令,根据PING的回复来判断实例是否在线,回复+PONG、-LOADING、-MASTERDOWN三种的一种说明在线,否则说明不在线,Sentinel配置了down-after-milliseconds选项,当连续down-after-milliseconds毫秒内都没有回复有效回复,那么Sentinel会把该实例标识为主观下线,把sentinelRedisInstance结构中的flags置成SRI_S_DOWN。

当Sentinel将一个主服务器标识为主观下线后,通过发送SENTINEL is-master-down-by-addr <ip> <port> <curent_epoch> <runid>向其它sentinel询问该主服务器是否下线,当收到足够多的下线判断之后,会把该主服务器标识成客观下线,把flags置成SRI_O_DOWN。主服务器被标识成客观下线之后,各个Sentinel实例会进行协商,推举出一个领头Sentinel,对下线的主服务器进行故障转移,推举出新的主服务器,并且更改相关从服务器的复制目标,如果旧主服务器重新上线,把它变成从服务器。

推举领头Sentinel采用了Raft算法。

时间: 2024-08-23 05:58:31

《Redis设计与实现》学习笔记-Sentinel(哨岗、哨兵)的相关文章

Redis设计与实现读书笔记(一) SDS

作为redis最基础的底层数据结构之一,SDS提供了许多C风格字符串所不具备的功能,为之后redis内存管理提供了许多方便.它们分别是: 二进制安全 减少字符串长度获取时间复杂度 杜绝字符串溢出 减少内存分配次数 兼容部分C语言函数 下面将简要阐述SDS基础结构,并介绍这些功能相应的实现细节. SDS字符类型定义非常简单,以redis3.0.7为例: typedef char *sds; struct sdshdr { unsigned int len; //定义当前字符串长度(不包含'\0')

Redis 设计与实现读书笔记一 Redis字符串

1 Redis 是C语言实现的 2 C字符串是 /0 结束的字符数组 3 Redis具体的动态字符串实现 /* * 保存字符串对象的结构 */ struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 数据空间 char buf[]; }; sdshdr free 0 len 5 buf ---> 'R' 'e' 'd' 'i' 's' '/0' 4 感觉更像 Java 中的 StringBuffer 的设计

linux内核设计与实现学习笔记-模块

模块 1.概念:  如果让LINUX Kernel单独运行在一个保护区域,那么LINUX Kernel就成为了“单内核”.    LINUX Kernel是组件模式的,所谓组件模式是指:LINUX Kernel在运行时,允许“代码”动态的插入或者移出Kernel.    所谓模块是指:相关的一些子程序,数据.入口点和出口点共同组合成的一个单一的二进制映像,也就是一个可装载的Kernel目标文件.    模块的支持,使得系统可以拥有一个最小的内核映像,并且通过模块的方式支持一些可选的特征和驱动程序

《响应式Web设计实践》学习笔记

原书: 响应式Web设计实践 第2章 流动布局 1. 布局选项 传统的固定布局中存在很多问题, 随着屏幕大小的越来越多元化, 固定布局已经不能适用了. 在流动布局中, 度量的单位不再是像素, 而是变成了百分比. 弹性布局与流动布局类似, 但是通常情况下, 弹性布局中会以em来作为单位. 带来一个好处是随着用户增大或减小字体, 适用弹性布局的元素的宽度也会等比例地变化. 但是其也可能出现水平滚动条 混合布局 媒体查询: 媒体查询允许根据设备的信息----诸如屏幕宽度, 方向或者分辨率等属性来使用不

设计心理学1学习笔记 - 日常的设计 - 第五章 认为差错?不,拙劣的设计

每当事故发生,我们分析事故,寻找原因,但当事故由人引起,我们便指责犯错误的人,而我们仍按照过去的方式做事情,如此的分析方式并不会从根本上改变这一切,我们应该用同样的方式对待所有的失败,找到根本原因,重新设计系统,保证不再发生同样的问题. 何以出错?出错的原因有很多,最常见的一种原因是要求人们在任务和流程中作为被自然规律的事情,譬如在数小时内保持警惕,或者在执行多个任务时保持精准的规范控制,最后,也许是最糟糕的归罪方式,是人们对待差错的态度,调查委员会无一例外地会发现犯错的人,重则解雇监禁,轻则反

JavaScript权威设计--CSS(简要学习笔记十六)

1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domain document.write() document.writeIn() 2.查询选取的文本 使用鼠标mouseup事件 3.浏览器定义了多项文本编辑命令(富文本编辑器) 使用Document对象的execCommand()方法. document.queryCommandSupport()判断浏

Redis学习笔记~目录

redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hashs(哈希类型).这些数据类型都 支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排 序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更

Redis Sentinel 学习笔记

转载出处: http://blog.csdn.net/lihao21 概述 Redis Sentinel 是用来实现 Redis 高可用的一套解决方案.Redis Sentinel 由两个部分组成:由一个或者多个 Sentinel 实例组成 Sentinel 系统:由一个主 Redis 服务器(master redis)和多个从 Redis 服务器(slave redis)组成主从备份的 Redis 系统.Sentinel 系统本身是一个分布式的系统,它的作用是监视 redis 服务器,在 ma

Redis学习笔记

Redis学习笔记:Redis是什么?redis是开源BSD许可高级的key-vlue存储系统可以用来存储字符串哈希结构链表.结构.集合,因此常用来提供数据结构服务. redis和memcache相比的独特之处:1.redis可以用来做存储,而memcache是用来做缓存 这个特点主要因为其有"持久化"的功能.2.存储的数据有"结构",对于memcache来说,存储的数据只有1种类型"字符串"而 redis则可以存储字符串.链表.哈希机构.集合.