[redis读书笔记] 第二部分 sentinel
1.sentinel的初始化,会制定master的IP和port,然后sentinel会创建向被监视主服务器的命令连接和订阅连接:
- 命令连接是用来和主服务器之间进行命令通信的
- 订阅连接,用于订阅主服务器的__sentinel__:hello 频道

sentinelState是sentinel的功能相关状态的记录,里面有个dict *masters;它的键是master的名字,值是一个sentinelRedisInstance的结构,这个结构会有一个dict *slave,键是slave的名字(IP:PORT),值是slave的sentinelRedisInstance,也就是说master的instance里存着slave的instance。
2. 获取主服务器信息
sentinel是通过配置文件来获得主服务器的信息并建链的。
sentinel以每十秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,解析回复来获取主服务器的当前信息。
sentinel一方面可以获得主服务器的runid,自身的role(master/slave),也可以获得主服务器属下所有从服务器的信息,IP,port等信息。所以,sentinel对从服务器的发现是无需任何信息的。而从服务器的信息就会分别存在上面所属的dict *master的instance里的dict *slave对应的instance里。


3. 获取从服务器的信息
sentinel为从服务器创建instance后,还会创建连接到从服务器。同样也包含命令连接和订阅连接。
命令连接创建好后,sentinel同样向从服务器每10s发送一个INFO命令,得到的回复里有slave的run id,role,复制偏移量,主从连接状态,以及master的IP Port等信息,sentinel会以此更新从服务器的instance。
4. 向主服务器和从服务器发送消息
默认情况下,sentinel以2s的频率,向服务器的__sentinel__:hello频道发送消息,
包含sentinel的IP port rundi epoch,以及主服务器的name ip port epoch。

5. 接收来自主服务器和从服务器的频道信息
sentinel与服务器建立订阅连接后,会向服务器订阅__sentinel__:hello的频道,一致持续到和服务器断链。
也就是说,对于每个与sentinel建链的服务器,sentinel即通过命令连接向服务器的hello频道发送消息,也通过订阅连接从服务器的hello频道接收消息。
所以,对于监视同一个服务器的多个sentinel,一个sentinel发送的消息会被其他所有的snetinel收到,更新其他sentinel对发送者的信息。

而其他sentinel的信息,从在master 的instance结构里的dict *sentinels里,类似于dict *slave, 键是IP:port,值是sentinels的instance
// 其他同样监控这个主服务器的所有 sentinel
dict *sentinels; /* Other sentinels monitoring the same master. */

6 sentinel彼此间的命令连接
sentinel发现新的sentinel后,除了在字典里创建dict,还会对新的sentinel创建命令连接,
7. 检测主观下线状态
默认情况下,sentinel每秒向master、slave、其他sentinel发送PING命令,通过返回来判断对方是否在线,如果在配置的时间内没有返回或者返回一直有问题,sentinel就认定这个服务器已经下线,即主观下线。
8. 检测客观下线状态(只针对主服务器进行这个操作)
sentinel发现一个主观下线的主服务器,会命令询问其他sentinel,看他们是否也认为主服务器下线(可以是主观也可以是客观下线),当sentinel收到足够数量的下线状态后,就判定主服务器为客观下线,进行故障转移操作。交互是通过该is-master-down-by-address 来实现。
9. 选举领头sentinel(raft算法)
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个sentinel会进行协商,选举出一个领头的sentinel,由它来做故障转移操作。
- 当选取领头sentinel时,各个sentinel都往其他sentinel发送is-master-down-by-address,并在消息中指明自己的runID和current_epoch,以此通知对方自己要竞选局部领头sentinel。
- 收到消息的sentinel,如果之前没有收到过别的请求,就选择这消息里的runID为局部领头,并把这个runID和epoch放回消息中回复给源sentinel,如果之前已经选择别的sentinel X为局部领头,就把X的runID和epoch放消息里回复
- 收到回复的sentinel,首先看epoch和自己的是否相等,如果相等,再比较runID,如果发现消息里的runID是自己的,说明自己当选了局部领头,超过半数的snetinel选择了自己为局部领头,它就成为了领头sentinel,可以进行移除故障操作。
- 给定时间内没有选出领头sentinel,过段时间后再次选举。
----------------------
main函数中,serverCron里会启动sentinel的主函数sentinelTimer。
createSentinelRedisInstance{
// 选择要添加的表
// 注意主服务会被添加到 sentinel.masters 表
// 而从服务器和 sentinel 则会被添加到 master 所属的 slaves 表和 sentinels 表中
}
[redis读书笔记] 第二部分 sentinel的更多相关文章
- [redis读书笔记] 第二部分 集群
1. 一个集群会包含多个节点(一个节点就是一个reid是服务器),CLUST MEET <ip><port>可以添加一个node到集群,命令执行后,两个node之间就会进行握手 ...
- [redis读书笔记] 第二部分 单机数据库 RDB持久化
内存中的rdb是会存为文件以做到RDB持久化的.RDB文件时一个二进制文件. 一 载入与存储 文件的载入是在server启动时进行的(rdbload()),因为AOF的更新频率比RDB高,所以如果AO ...
- [redis读书笔记] 第二部分 单机数据库 数据库实现
一 数据库基本实现/命令下发的实现 redis.c里,大家能看到redisCommandTable[] 的实现,列出了支持的所有命令.大部分的入参为redisClient *c,当一条REDIS命令下 ...
- 《javascript权威指南》读书笔记——第二篇
<javascript权威指南>读书笔记——第二篇 金刚 javascript js javascript权威指南 今天是今年的196天,分享今天的读书笔记. 第2章 词法结构 2.1 字 ...
- STL源码分析读书笔记--第二章--空间配置器(allocator)
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...
- [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串
本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...
- redis读书笔记
1.redis两种存储机制(持久化) Redis的存储机制分为:Snapshot和AOF 都先将内存存储在内存中. (1)Snapshot当数据累计到一定的阈值,就会触发dump将数据一次性写入到数据 ...
- Getting Started With Hazelcast 读书笔记(第二章、第三章)
第二章 起步 本章就相当简单粗暴了,用一个个例子说明hazelcast怎么用. 1.map,set,list这些集合类都是开箱即用的,只要从Hazelcast的实例中获取一份就行. 2.增加了Mult ...
- Java Concurrency in Practice 读书笔记 第二章
第二章的思维导图(代码迟点补上):
随机推荐
- 更好用的 Python 任务自动化工具:nox 官方教程
英文| nox tutorial 出处| nox 官方文档 译者| 豌豆花下猫@Python猫 Github地址:https://github.com/chinesehuazhou/nox_doc_c ...
- 美食家app开发日记
民以食为天. 作为一个20年几乎没做过饭的吃货,从这个假期开始,想利用些时间,自己动手尝试,做些好吃的出来,一方面给父母减轻点负担,获得点成就感,一方面体验生活,学学厨艺,感受生活的乐趣和美好,其三, ...
- java8新特性Lambda和Stream
Java8出来已经4年,但还是有很多人用上了jdk8,但并没用到里面的新东西,那不就等于没用?jdk8有许多的新特性,详细可看下面脑图 我只讲两个最重要的特性Lambda和Stram,配合起来用可以极 ...
- 机器学习-MNIST数据集使用二分类
一.二分类训练MNIST数据集练习 %matplotlib inlineimport matplotlibimport numpy as npimport matplotlib.pyplot as p ...
- Qt Installer Framework翻译(7-4)
组件脚本 对于每个组件,您可以指定一个脚本,来准备要由安装程序执行的操作.脚本格式必须与QJSEngine兼容. 构造 脚本必须包含安装程序在加载脚本时创建的Component对象. 因此,脚本必须至 ...
- ASP.NET MVC4 使用UEditor富文本
原帖:http://user.qzone.qq.com/369175376/infocenter?ptlang=2052 第一步:先到http://ueditor.baidu.com/webs ...
- .net 项目更改默认命名空间
这个项目是我去年毕业设计做的项目,项目创建的时候由于手抖把Landlordtenant写成了 LandloRdtenant(R大写了),当时不知道如何改回来又担心改完之后报错也就没管了. 今天尝试使用 ...
- .NET异步编程之APM模式
目录 1.AMP模式简介 2.使用BeginInvoke实现异步委托 3.原始线程怎么知道新线程已经运行完毕 4.使用AsyncCallback委托实现回调模式 5.源代码下载 shanzm-2020 ...
- TortoiseSVN使用教程[多图超详细]
安装及下载client 端 下载Windows 端程序:http://tortoisesvn.net/downloads.一般而言,如果是32-bit的Windows XP 应该使用TortoiseS ...
- 如何提取CSDN博客正文内容
document.getElementById("article_content").outerHTML; 在任意的一片博文运行以上代码都可以获得正文内容,但是对于代码.字体都没有 ...