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的更多相关文章

  1. [redis读书笔记] 第二部分 集群

    1. 一个集群会包含多个节点(一个节点就是一个reid是服务器),CLUST MEET <ip><port>可以添加一个node到集群,命令执行后,两个node之间就会进行握手 ...

  2. [redis读书笔记] 第二部分 单机数据库 RDB持久化

    内存中的rdb是会存为文件以做到RDB持久化的.RDB文件时一个二进制文件. 一 载入与存储 文件的载入是在server启动时进行的(rdbload()),因为AOF的更新频率比RDB高,所以如果AO ...

  3. [redis读书笔记] 第二部分 单机数据库 数据库实现

    一 数据库基本实现/命令下发的实现 redis.c里,大家能看到redisCommandTable[] 的实现,列出了支持的所有命令.大部分的入参为redisClient *c,当一条REDIS命令下 ...

  4. 《javascript权威指南》读书笔记——第二篇

    <javascript权威指南>读书笔记——第二篇 金刚 javascript js javascript权威指南 今天是今年的196天,分享今天的读书笔记. 第2章 词法结构 2.1 字 ...

  5. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  6. [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串

    本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...

  7. redis读书笔记

    1.redis两种存储机制(持久化) Redis的存储机制分为:Snapshot和AOF 都先将内存存储在内存中. (1)Snapshot当数据累计到一定的阈值,就会触发dump将数据一次性写入到数据 ...

  8. Getting Started With Hazelcast 读书笔记(第二章、第三章)

    第二章 起步 本章就相当简单粗暴了,用一个个例子说明hazelcast怎么用. 1.map,set,list这些集合类都是开箱即用的,只要从Hazelcast的实例中获取一份就行. 2.增加了Mult ...

  9. Java Concurrency in Practice 读书笔记 第二章

    第二章的思维导图(代码迟点补上):

随机推荐

  1. ArcGIS Desktop 10.1 下载地址及破解

    ArcGIS Desktop 10.1 正式版请到这里下载 http://pan.baidu.com/share/link?shareid=27476&uk=3608003693 正式版破解方 ...

  2. VS 超级好用的 Ctrl E E

    C# Interactive 推荐!!! 先看我怎么用的:随便创建一个类 有些编译期的的值不知道查文档又太麻烦怎么办?自己写个控制台测试咩?试试 C# 交互 罢, 选中这个类ctrl EE 然后输入 ...

  3. 月薪30k的Java架构师JVM常见面试题解析

    在做程序员的路上经常会遇到的JVM一些经典面试题,今天给大家分享出我自己的解题思路,希望对大家有帮助,后续有空会持续更新. 1.什么情况下会发生栈内存溢出. 思路: 描述栈定义,再描述为什么会溢出,再 ...

  4. 阿里云Centos7.X 如何对外开放端口

    一句话:如果你是买的各大厂商的云服务器,去安全组配置对应需要使用到的端口就可以啦! 因为博主用的是阿里云,所以这里就只介绍下阿里云如何开放端口,按着下面三张图来操作就行嘞 这个时候有同学就说了,不通过 ...

  5. 基于iTextSharp的PDF操作(PDF打印,PDF下载)

    基于iTextSharp的PDF操作(PDF打印,PDF下载) 准备 1. iTextSharp的简介 iTextSharp是一个移植于java平台的iText项目,被封装成c#的组件来用于C#生成P ...

  6. 三分钟网络基础-ARP协议

    什么是 ARP 协议 地址解析协议 ARP (Address Resolution Protocal):在同一局域网下,根据已知道的主机或路由器的 IP 地址,找出其相应的硬件地址. 高速缓存 每一个 ...

  7. flask模板 flask-bootstrap

    1.模板 a.block块中继承前面block块的内容,需要添加{{super()}} b.macro 宏:   作用:在模板中定义函数(定义函数->注意添加()->可以使用from 模板 ...

  8. [洛谷P1606] [USACO07FEB] 荷叶塘Lilypad Pond

    Description 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令人惊讶的莲花,还有一些格子是岩石,其余的只是 ...

  9. 趣学CCNA 路由与交换

    第1章 OSI和TCP/IP 11.1 协议与协议分层 31.2 OSI参考模型 61.2.1 物理层 91.2.2 数据链路层 91.2.3 网络层 101.2.4 传输层 101.2.5 会话层 ...

  10. 博客与微信小程序的同步

    在此之前,先说说自己最近的打算,才购买了阿里云的服务器,想做一个网站和图床网盘之类的方便自己使用. 考虑到小程序,又打算将自己的博客内容放到小程序中.从零开发实属困难,应该还要一段时间才能完成. 目前 ...