[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 读书笔记 第二章
第二章的思维导图(代码迟点补上):
随机推荐
- 算法学习导图+经典排序算法PHP实现
周末抽时间整理下算法,完整导图可点击下面链接获取. 点我看完整算法导图 八种排序算法的php实现 代码如下 拷贝后可直接运行 先上个运行后的图 代码:(有的自己些的 有的根据网友整理) <?ph ...
- 通过模拟Mybatis动态代理生成Mapper代理类,讲解Mybatis核心原理
本文将通过模拟Mybatis动态代理生成Mapper代理类,讲解Mybatis原理 1.平常我们是如何使用Mapper的 先写一个简单的UserMapper,它包含一个全表查询的方法,代码如下 pub ...
- Scala 学习(3)之「类——基本概念1」
类 小提示:可以通过:paste进入 Scala 的多行模式,输入对应的代码块之后,按ctrl + D退出多行模式,然后再调用刚才输入的函数或者方法进行测试 //定义类,包含 field 以及方法 c ...
- VMware Workstation CentOS7 Linux 学习之路(2)--.net core环境安装
1.为了安装.NET,需要注册微软签名密钥和添加微软相关的支持.这个操作每台机器只能做一次. Add the dotnet product feed(其实就是向微软提交投名状,表示我这台服务器要用co ...
- Proxmox VE:自建虚拟化方案
Proxmox VE 简介 Proxmox Virtual Environment,或 Proxmox VE,是来自德国的开源虚拟化方案.软件和社区支持都是免费的,企业用户则可以通过订阅制获得付费商业 ...
- Python的re模块,正则表达式用法详解,正则表达式中括号的用法
Python的re模块,正则表达式 #导入re模块 import re 1.match方法的使用: result = re.match(正则表达式,待匹配的字符串) 正则表达式写法: 第一部分: 字 ...
- (转) fuzzing XSS filter
//转自isno在wooyun知识库所写 题记:这是09年自己写的总结文章,之后多年也不搞这个了,技术显然是过时了,但我觉得思路还是有用的,算抛砖引玉吧,各位见笑 0x00 前言 这是一篇学习总结,首 ...
- Qt Installer Framework翻译(7-2)
包文件夹 安装程序包含的组件,要么是内嵌的,要么可以从远程存储库加载.在这两种情况下,都需要为组件使用一种安装程序可以读取的文件格式和结构. 包文件夹结构 将所有组件放在相同的根文件夹中,即包文件夹. ...
- NOIP【2016普及组】 考后有感(买铅笔,回文日期,海港,魔法阵)
普及组考试已落下大幕,但我们那扑通扑通等待成绩的心仍然无法平静,先来给四道题做一个总结: 一. 买铅笔 自评难度:1星 其实这道题没有什么难度,生命之题,满分必拿,100分,保底啦~\(≧▽≦)/~ ...
- unity调试native c/c++ dll
最近使用xlua,需要添加自定义的c lua库.研究了一下unity调试native c/c++ dll.方法如下: 通过Unity打开VS工程 VS菜单栏[工具]-> [选项] 在选项对话框中 ...