[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 读书笔记 第二章
第二章的思维导图(代码迟点补上):
随机推荐
- String字符串,输入一串字符判断其中数字,字母,其他的字符的个数
public class StringClassTest { public static void main(String[] args) { //遍历字符串 String str = "H ...
- Scala实践5
一.Scala的层级 1.1类层级 Scala中,Any是所其他类的超类,在底端定义了一些有趣的类NULL和Nothing,是所有其他类的子类. 根类Any有两个子类:AnyVal和AnyRef.其中 ...
- 云资源中的低成本战斗机——竞价实例,AWS、阿里云等六家云厂商完全用户使用指南
云端资源价格 预留实例:长期持有,批发路线,价格最便宜. 按需实例:即买即用,零售路线,价格最贵. 这两种资源,基于不同区域/价格的六家云厂商价格对比,连同原始数据文档我们已经打包成了一份电子文档,有 ...
- js的内存泄漏场景、监控以及分析
内存泄漏 Q:什么是内存泄漏? 字面上的意思,申请的内存没有及时回收掉,被泄漏了 Q:为什么会发生内存泄漏? 虽然前端有垃圾回收机制,但当某块无用的内存,却无法被垃圾回收机制认为是垃圾时,也就发生内存 ...
- 【LC_Lesson7】---将两个有序链表合成新的一个有序链表
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...
- flask路由要点
1.参数类型intfloatstringpath uuid<any(a, b): an> 枚举, an必须是any中的值2.多个url指向一个视图函数是可行的3.url_for('蓝图名字 ...
- 安装Jupyter Notebook
1.安装Ipython pip3 install -i https://pypi.douban.com/simple ipython 2.安装jupyter pip3 install -i https ...
- session跨域丢失问题
配置一个 filter package com.psm.filter; import javax.servlet.*; import javax.servlet.http.HttpServletReq ...
- 异步查询转同步加redis业务实现的BUG分享
在最近的性能测试中,某一个查询接口指标不通过,开发做了N次优化,最终的优化方案如下:异步查询然后转同步,再加上redis缓存.此为背景. 在测试过程中发现一个BUG:同样的请求在第一次查询结果是OK的 ...
- prometheus和zabbix的对比
前言: 新公司要上监控,面试提到了Prometheus 是公司需要的监控解决方案,作为喜新厌旧的程序员,我当然是选择跟风了,之前主要做的是zabbix,既然公司需要prometheus,那没办法,只能 ...