什么是哨兵?

哨兵(Sentinel)是 redis 的高可用性解决方案,前面我们讲的主从复制它是高可用的基础,需要人工介入才能完成故障转移,哨兵可以解决这个问题,在主从复制情况下,当主节点发生故障时,哨兵可以自动的发现故障并且完成故障转移,实现真正的 redis 高可用。在哨兵集群中,哨兵会监视所有的 redis 服务器和其他 sentinel 节点状态,来保证 redis 的高可用。

哨兵的搭建

哨兵本质也是一个 redis 服务,只是跟普通的 redis 服务提供了不一样的功能。哨兵是一个分布式架构,因为你要保证 redis 高可用,首先需要保证自己高可用,所以如果我们需要搭建哨兵的话,最少需要部署三个实例,最好是奇数个,因为在后续的故障转移中会涉及到投票。

哨兵的配置文件我们可以在 redis 的 GitHub 项目下下载,在项目下有一个叫做 sentinel.conf 的文件,可以使用它作为我们哨兵的配置模板,当然你也可以使用 redis.conf 配置文件,只需要添加哨兵相关配置就好了。

哨兵相关的配置项不多,主要有以下几个配置项:

// 端口号,默认是 redis 实例+20000,所以我们沿用这个规则就好了
port 26379
// 是否守护进程运行
daemonize yes
// 日志存放的位置,这个非常重要,通过日志可以查看故障转移的过程
logfile "26379.log"
// 监视一个名为 mymaster(自定义) 的 redis 主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 ,
// 最后面的 2 代表着至少有两个哨兵认为主服务器出现故障才会进行故障转移,否则认定主服务未失效
sentinel monitor mymaster 127.0.0.1 6379 2
// 哨兵判断服务器失效的响应时间,超过这个时间未接收到服务器的回应,就认为该服务器失效了
sentinel down-after-milliseconds mymaster 30000
// 完成故障转移之后,最多多少个从服务器可以同时发起数据复制,数字越小,说明完成全部从服务数据复制的时间越长
// 数字越大,对主服务器的压力就变大了
sentinel parallel-syncs mymaster 1
// 故障转移超时时间
sentinel failover-timeout mymaster 180000

对于每个 Sentinel 实例配置除了 port 和 logfile 不同之外,其他配置项都是一样的。修改好配置后,我们可以使用 ./redis-sentinel sentinel.conf 命令来启动哨兵,命令跟 redis 实例启动差不多,因为哨兵也是 redis 实例,所以我们可以使用 ./redis-cli -p 26379 info sentinel 命令查看当前的哨兵信息,如下图所示:

问题:如何在只配置 master 服务器的情况下,发现从服务器和其他 Sentinel ?

从服务器的发现,Sentinel 可以通过询问主服务器来获取从服务器的信息,对于发现其他 Sentinel 节点,则通过发布与订阅功能实现,通过向频道 sentinel:hello 发送信息来实现的,主要有以下两步:

1、每个 Sentinel 每 2 秒会通过发布与订阅功能向所有的主服务和从服务器的 sentinel:hello 频道发送一条信息, 信息中包含了 Sentinel 的 IP 地址、端口号和运行 ID (runid)

2、每个 Sentinel 都订阅了被它监视的所有主服务器和从服务器的 sentinel:hello 频道, 查找之前未出现过的 sentinel (looking for unknown sentinels)。 当一个 Sentinel 发现一个新的 Sentinel 时, 它会将新的 Sentinel 添加到一个列表中, 这个列表保存了 Sentinel 已知的, 监视同一个主服务器的所有其他 Sentinel

哨兵故障转移原理

故障转移是哨兵的主要工作,这背后的实现逻辑也是非常的复杂,具体的实现逻辑还请查看相关书籍,我对哨兵的故障转移总结了以下三点:

1、监听服务器

每个 Sentinel 节点每隔 1 秒对主节点、从节点、其他 Sentinel 节点发送 ping 命令做心跳检测,来判断服务器的状态。

节点也会对 Sentinel 进行相应的回复,在这些回复中,以下三种回复是有效回复:

  • 返回 +PONG
  • 返回 -LOADING
  • 返回 -MASTERDOWN

如果节点在哨兵配置文件设置的 master-down-after-milliseconds 选项的值内,一直没有哪怕一次有效回复,那么 Sentinel 会把该服务器标记为下线状态,我们把这种下线称为主观下线,也就是说只有这个 sentinel 认为该服务器是下线状态。

如果被主观下线的服务器是主服务器时,sentinel 为了确认这个主服务器是否真的下线,该 Sentinel 会向其他的同样监听主服务器的 Sentinel 进行询问,看他们是否也认为主服务器进入下线状态,当有足够多的 Sentinel 都认为主服务器下线时,该 Sentinel 会将主服务器判断为客观下线,这是真正的下线了,并且会对它进行故障转移操作。

2、选举 Sentinel 节点完成转移任务

故障转移并不是所有的 sentinel 共同完成,而是选举出一台 sentinel 节点作为领导者来完成这次故障转移,所以当主服务器被标记为客观下线时,sentinel 之间就会通过 Raft 算法选举出一个领导者来完成故障转移工作。redis 选举领头的 sentinel 的规则和方法大致如下:

  • 所有在线的 sentinel 都有资格被选为领导者,也就是说每个 sentinel 都有成为领导者的机会
  • 当 sentinel 标记主服务器为主观下线时,会向其他 Sentinel 节点发送 sentinel is-master-down-by-addr 命令, 要求将自己设置为领导者
  • 收到命令的 Sentinel 节点,采用先到先得的规则,如果没有同意过其他 Sentinel 节点的 sentinel is-master-down-by-addr 命令,将同意该请求,否则拒绝
  • 如果该 Sentinel 节点发现自己的票数已经超过半数,那么它将成为领导者
  • 如果在规定时间内,没有选举出 sentinel 领导者,那么将在一段时间后再次选举,知道选出 sentinel 领导者为止。

3、选举新 master 服务器完成故障转移

选举出来的 sentinel 领导者将完成剩下的故障转移工作,故障转移主要有以下三步:

1、挑选出新的主服务器

在已下线的主服务器的所有从服务器中,挑选出一个从服务器,并将其转换为主服务器,选择新的主服务器的规则如下:

  • 在失效主服务器属下的从服务器当中, 那些被标记为主观下线、已断线、或者最后一次回复 PING 命令的时间大于五秒钟的从服务器都会被淘汰
  • 在失效主服务器属下的从服务器当中, 那些与失效主服务器连接断开的时长超过 down-after 选项指定的时长十倍的从服务器都会被淘汰
  • 在经历了以上两轮淘汰之后剩下来的从服务器中, 选出复制偏移量(replication offset)最大的那个从服务器作为新的主服务器; 如果复制偏移量不可用, 或者从服务器的复制偏移量相同, 那么带有最小运行 ID 的那个从服务器成为新的主服务器

对挑选出来的从服务器执行 slaveof no one 命令,使其成为主节点。

2、修改其他从服务器的复制目标

当新的主服务器出现后,sentinel 的领导者下一步需要做的就是,让其他从服务器去复制新的主服务器,通过向其他从服务器发送 slaveof new_master port 命令来完成,复制规则和配置文件的 parallel-syncs 参数有关

3、将旧的主服务器变成从服务器

故障转移操作最后要做的就是将已下线的主服务器设置为新的主服务的从服务器,并保持对其关注,等它恢复后命令它去复制新的主节点。

上面就是 redis 哨兵的一些知识,希望看完之后你有所收获。

最后

目前互联网上很多大佬都有 Redis 系列教程,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

欢迎扫码关注微信公众号:「平头哥的技术博文」,和平头哥一起学习,一起进步。

三分钟带你入门 redis 高可用架构之哨兵的更多相关文章

  1. Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】

    No cross,no crown . 不经历风雨,怎么见彩虹. Redis哨兵模式,用现在流行的话可以说就是一个"哨兵机器人",给"哨兵机器人"进行相应的配置 ...

  2. 如何构建 Redis 高可用架构?

    温国兵 民工哥技术之路 今天 1 .题记 Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API. 如今,互 ...

  3. Redis高可用架构—Keepalive+VIP

    最近整理一下Redis高可用架构的文档,也准备分享出来,虽然这些架构也不是很复杂.Redis的高可用方案目前主要尝试过5种方式,其中2种方式已经在线上使用. 1)Redis Master-Slave ...

  4. Redis 高可用架构设计(转载)

    转载自:https://mp.weixin.qq.com/s?__biz=MzA3NDcyMTQyNQ==&mid=2649263292&idx=1&sn=b170390684 ...

  5. Redis高可用架构

    前言 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器.楼主是一枚JAVA后端程序员,也算是半个运维工程师了.在Linux服务器上搭建Redis,怎 ...

  6. 基于Docker-compose搭建Redis高可用集群-哨兵模式(Redis-Sentinel)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_110 我们知道,Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3) ...

  7. 5分钟带你入门Redis

    转载请标明出处: http://blog.csdn.net/forezp/article/details/61471712 本文出自方志朋的博客 1.redis概述 redis是一个开源的,先进的 k ...

  8. Redis高可用集群-哨兵模式(Redis-Sentinel)

     前言 Redis哨兵模式,用现在流行的话可以说就是一个“哨兵机器人”,给“哨兵机器人”进行相应的配置之后,这个"机器人"可以7*24小时工作,它能能够自动帮助你做一些事情,如监控 ...

  9. redis高可用之sentinel哨兵

    一,单实例模式 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 二,主从模式 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份.当一 ...

随机推荐

  1. 再整理:Visual Studio Code(vscode)下的通用C语言环境搭建

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/czlhxm/p/11794743.ht ...

  2. [翻译]Jupyter notebook .NET Core 内核预览1

    当您想到Jupyter Notebooks时,您可能会考虑使用Python,R,Julia或Scala而不是.NET编写代码. 今天,我们很高兴宣布您可以在Jupyter Notebooks中编写.N ...

  3. 读书笔记-《Maven实战》-2018/5/3

    5.7依赖调解 1.当一个项目有以下依赖关系的时候:A->B->C->X(1.0).A->D->X(2.0),X作为A的传递依赖而拥有两个版本,Maven为了解决以上问题 ...

  4. 子树问题(DP)

    这题显然是DP 首先,\(dp[i][j]\)表示树深度小于等于i,树的大小为j的有根树的数量$ 可以循环枚举根节点编号次大的子树的大小k. \(dp[i][j]=\sum^{j-1}_{k=1}dp ...

  5. 通俗易懂了解Vue组件的生命周期

    1.前言 在使用vue2.0进行日常开发中,我们总有这样的需求,我就想在页面刚一加载出这个表格组件时就发送请求去后台拉取数据,亦或者我想在组件加载前显示个loading图,当组件加载出来就让这个loa ...

  6. python——高阶函数:高阶函数

    python高阶函数 00初识高阶函数 一等公民 函数在python中是一等公民(First-Class Object),同样和变量一样,函数也是对象,只不过是可调用的对象,所以函数也可以作为一个普通 ...

  7. RocketMQ ACL使用指南

    目录 1.什么是ACL? 2.ACL基本流程图 3.如何配置ACL 3.1 acl配置文件 3.2 RocketMQ ACL权限可选值 3.3.权限验证流程 4.使用示例 4.1 Broker端安装 ...

  8. vue学习笔记(五)条件渲染和列表渲染

    前言 在众多的编程语言中,我们的基础语法总是少不了一些专业语法,比如像定义变量,条件语句,for循环,数组,函数等等,vue.js这个优秀的前端框架中也有同样的语法,我们换一个名词,将条件语句改成专业 ...

  9. PowerMock学习(一)之PoweMock的入门--模拟新增学生操作

    关于powermock 在TDD领域Mock框架有很多,比如EasyMock,JMock,Mockito.可能有些同学会好奇了,为什么要重点把powermock拿出来呢,因为powermock可以解决 ...

  10. Linux服务器更改Apache2默认页面

    方式一 获取root权限 su root //或者 sudo -i 进入 /var/www目录下 cd /var/www 创建目录 mkdir -m 777 myhtml // myhtml为自己创建 ...