前言

最近学习Redis6.x,特做笔记以备忘,与大家共学。课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值得学习!关键是不要钱,嘻嘻!

哨兵(sentinel)概述

哨兵是Redis 复制集 集群的重要组件,主要实现:

1:集群监控:监控主从数据库运行是否正常
2:故障转移:当主数据库出现故障时,自动将从数据库转换成为主数据库
3:配置中心:客户端通过连接哨兵来获得当前Redis服务的主节点地址
4:消息通知:哨兵可以将故障转移的结果发送给客户端

注意:使用Redis-sentinel,redis实例必须在非集群模式下运行

开启哨兵功能

建立一个sentinel.conf文件,里面设置要监控的主数据库的名字,形如:
sentinel monitor 监控的主数据库的名字 127.0.0.1 6380 1

表示哨兵判断主节点是否发生故障的最低票数
(1)这个文件的内容,在运行期间会被sentinel动态进行更改
(2)可以同时监控多个主数据库,一行一个配置即可

哨兵配置详解

1:bind:服务监听地址,用于客户端连接,默认本机地址
2:protected-mode:安全保护模式
3:port:监听的端口号
4:daemonize:是否以后台daemon方式运行
5:pidfile:pid文件位置
6:logfile:log文件位置
7:dir:工作目录
8:sentinel monitor <master-name> <ip> <port> <quorum>:
设置要监控的master服务器
9: sentinel auth-pass <master-name> <password>:连接master服务的密码
10: sentinel down-after-milliseconds <master-name> <milliseconds>:
指定多少毫秒之后,主节点没有应答哨兵,此时哨兵主观上认为主节点下线
11: sentinel parallel-syncs <master-name> <nums>:
表示允许并行同步的slave个数,当Master挂了后,哨兵会选出新的Master,
此时,剩余的slave会向新的master发起同步数据
12: sentinel failover-timeout <master-name> <milliseconds>:
故障转移的超时时间,进行故障转移时,如果超过设置的毫秒,
表示故障转移失败
13: sentinel notification-script <master-name> <script-path> :
配置当某一事件发生时所需要执行的脚本
14: sentinel client-reconfig-script <master-name> <script-path>:
客户端重新配置主节点参数脚本

哨兵基本原理之自动发现

哨兵互相之间的相互自动发现,是通过redis的pub/sub系统实现的,每个哨兵都会往__sentinel__:hello这个channel里发送一个消息,这时候所有其他哨兵都可以消费到这个消息,并感知到其他的哨兵的存在。

每隔两秒钟,每个哨兵都会往自己监控的某个master+slave对应的__sentinel__:hello channel里发送一个消息,内容是自己的host、ip和runid还有对这个master的监控配置。

每个哨兵也会去监听自己监控的每个master+slaves对应的__sentinel__:hello channel,然后去感知到同样在监听这个master+slave的其他哨兵的存在。

每个哨兵跟其他哨兵交换对master的监控配置,互相进行监控配置的同步

哨兵基本原理之选举

quorum:确认客观下线的最少的哨兵数量
majority:授权进行主从切换的最少的哨兵数量

每次一个哨兵要做主备切换,首先需要quorum数量的哨兵认为master客观下线,然后选举出一个哨兵来做切换,这个哨兵还需要得到majority哨兵的授权,才能正式执行切换

选举领导者哨兵

当主节点被判断客观下线以后,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者节点对其进行故障转移操作。

监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法

Raft算法的基本思路是先到先得:即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者

哨兵基本原理之故障转移

故障转移(Slave选举成为Master)

选举出的领导者哨兵,开始进行故障转移操作,大体可以分为3个步骤:

1:在从节点中选择新的主节点:选择的原则是,首先过滤掉不健康的从节点;然后选择优先级最高的从节点(由slave-priority指定);如果优先级无法区分,则选择复制offset最大的从节点;如果仍无法区分,则选择runid最小的从节点

2:更新主从状态:通过slaveof no one命令,让选出来的从节点成为主节点;并通过slaveof命令让其他节点成为其从节点

3:将已经下线的主节点设置为新的主节点的从节点,当其重新上线后,它会成为新的主节点的从节点

哨兵基本原理之配置传播

configuration epoch

新的master选出过后,执行切换的那个哨兵,会从要切换到的新master那里得到一个configuration epoch,这就是一个version号,每次切换的version号都必须是唯一的。

如果第一个选举出的哨兵切换失败了,那么其他哨兵,会等待failover-timeout时间,然后接替继续执行切换,此时会重新获取一个新的configuration epoch,作为新的version号

Configuration传播

哨兵完成master切换之后,会在自己本地更新生成最新的master配置,然后同步给其他的哨兵,就是通过之前说的pub/sub消息机制。

这时version号就很重要了,因为各种消息都是通过一个channel去发布和监听的,所以一个哨兵完成一次master的切换之后,新的master配置是跟着新的version号的。

其他的哨兵都是根据版本号的大小来更新自己的master配置的

哨兵使用建议

1:哨兵节点的数量应为多个,哨兵本身应该集群,保证高可用
2:哨兵节点的数量应该是奇数
3:各个哨兵节点的配置应一致
4:如果哨兵节点部署在Docker等容器里面,尤其要注意端口的正确映射
5:哨兵集群+主从复制,并不能保证数据零丢失

后记

我会持续的把我学习Redis6.x过程的笔记记录下来,跟大家一起学习。希望能坚持下去!

Redis6.x学习笔记(五)哨兵的更多相关文章

  1. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  2. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  3. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  4. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  5. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  7. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  8. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  9. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

  10. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

随机推荐

  1. hdu4720 三角形的外接圆

    题意:       给你四个点,问你第四个点是否在前三个点围成的三角形的外接圆上. 思路:       水题,就是练练用魔板罢了,当该三角形是锐角三角形的时候,圆心是任意两条边中垂线的交点,半径是圆心 ...

  2. PAT 乙级 -- 1011 -- A+B和C

    问题简述 给定区间[-231, 231]内的3个整数A.B和C,请判断A+B是否大于C. 输入格式: 输入第1行给出正整数T(<=10),是测试用例的个数.随后给出T组测试用例,每组占一行,顺序 ...

  3. [CTF]Brainfuck/Ook!编码

    [CTF]Brainfuck/Ook!编码 ---------------------  作者:adversity`  来源:CSDN  原文:https://blog.csdn.net/qq_408 ...

  4. Portswigger web security academy:Cross-origin resource sharing (CORS)

    Portswigger web security academy:Cross-origin resource sharing (CORS) 目录 Portswigger web security ac ...

  5. dependencyManagement 版本管理

    帮别人解决bug的时候碰到,随便记录一下. 使用<dependencyManagement>标签, 做版本管理的时候,需要父子项目关联,就需要子模块中利用<parent> 否则 ...

  6. 获取某日期后一周、一月、一年的日期 php

    //获取某日期后三周同一天日期public static function getNextDate($date){ $return = [ date( 'Y-m-d', strtotime(" ...

  7. Mongodb安装配置以及在thinkphp中的使用

    1.Mongodb安装 Mongodb安装参照此文档: https://www.runoob.com/mongodb/mongodb-window-install.html php的mongodb扩展 ...

  8. Envoy:经过envoy代理后获取客户端真实IP

    在envoy作为前端代理时,用户ip的获取很重要,一般获取ip的方式.都是通过Header中的 X-Forward-For. X-Real-IP或 Remote addr 等属性获取,但是如果确保En ...

  9. [物联网] 电气 & 工控

    原理 一次回路和二次回路 一次回路:强电部分(380伏---22万伏),连接发电机.电动机.变压器.电网线路.电网开关.电网避雷器等等 二次回路:弱电部分,指的是控制线路.保护线路.测量线路.计量线路 ...

  10. Linux单用户模式(修改密码、运行级别)方法详解

    很多新手当面对"忘记 root 账户密码导致无法登陆系统"这个问题时,直接选择重新系统.其实大可不必,我只需要进入 emergency mode(单用户模式)更新 root 账户的 ...