更多内容,欢迎关注微信公众号:全菜工程师小辉。公众号回复关键词,领取免费学习资料。

当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。 所以更多时候,我们优先考虑哨兵(sentinel) 模式。

Redis sentinel是Redis高可用实现方案:故障发现、故障自动转移、配置中心、客户端通知。从Redis的2.6版本开始提供的,但是当时这个版本的模式是不稳定的,直到Redis的2.8版本以后,这个哨兵模式才稳定下来,在生产环境中,如果想要使用Redis的哨兵模式,也会尽量使用Redis的2.8版本之后的版本。

哨兵虽然有一个单独的可执行文件Redis-sentinel ,但实际上它只是一个运行在特殊模式下的 Redis服务器,你可以在启动一个普通Redis服务器时通过给定--sentinel选项来启动哨兵,哨兵的一些设计思路和zookeeper非常类似。

sentinel的定时任务

sentinel机制中有三种重要的定时任务。

  1. 每10秒每个sentinel对master和slave执行info

作用:

  • 发现slave节点。
  • 确认主从关系。
  1. 每2秒每个sentinel通过master节点的channel交换信息(pub/sub)

作用:

  • 互相通信掌握节点的信息和自身信息,可以感知新加入的sentinel

通过master节点的__sentinel__:hello频道进行交互,所有sentinel订阅这个频道并每2秒向该频道发布信息

  1. 每1秒每个sentinel对其他sentinel和master,slave进行ping

作用:

  • 心跳检测

主观下线和客观下线

主观下线

主观下线:单个sentinel节点对Redis节点通信失败的“偏见”。

这是一种主观下线。因为在复杂的网络环境下,这个sentinel与这个master不通,但是如果master与其他的sentinel都是通的呢?所以是一种“偏见”。

这是依靠的第三种定时:每秒去ping一下周围的sentinel和Redis。对于slave Redis,可以使用这个主观下线,因为他不需要进行故障转移;但是对于master Redis,必须使用客观下线。

客观下线

客观下线:所有sentinel节点对master Redis节点失败“达成共识”(超过quorum个则统一,quorum可配置)。

这是依靠的第二种定时:每两秒,sentinel之间进行“商量”(一个 sentinel 可以通过向另一个 sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线。)

对于master redis的下线,必须要达成共识才可以,因为涉及故障转移,仅仅依靠一个sentinel判断是不够的

领导者选举

当sentinel集群需要故障转移的时候会在集群中选出Leader执行故障转移操作。sentinel采用了Raft协议实现了sentinel间选举Leader的算法,不过也不完全跟论文描述的步骤一致。sentinel集群运行过程中故障转移完成,所有sentinel又会恢复平等。Leader仅仅是故障转移操作出现的角色。

选举流程

  1. 某个sentinel认定master客观下线的节点后,该sentinel会先看看自己有没有投过票,如果自己已经投过票给其他sentinel了,在2倍故障转移的超时时间自己就不会成为Leader。相当于它是一个Follower。
  2. 如果该sentinel还没投过票,那么它就成为Candidate。
  3. 和Raft协议描述的一样,成为Candidate,sentinel需要完成几件事情
    3.1 更新故障转移状态为start
    3.2 当前epoch加1,相当于进入一个新term,在sentinel中epoch就是Raft协议中的term。
    3.3 更新自己的超时时间为当前时间随机加上一段时间,随机时间为1s内的随机毫秒数。
    3.4 向其他节点发送is-master-down-by-addr命令请求投票。命令会带上自己的epoch。
    3.5 给自己投一票,在sentinel中,投票的方式是把自己master结构体里的leader和leader_epoch改成投给的sentinel和它的epoch。
  4. 其他sentinel会收到Candidate的is-master-down-by-addr命令。如果sentinel当前epoch和Candidate传给他的epoch一样,说明他已经把自己master结构体里的leader和leader_epoch改成其他Candidate,相当于把票投给了其他Candidate。投过票给别的sentinel后,在当前epoch内自己就只能成为Follower。
  5. Candidate会不断的统计自己的票数,直到他发现认同他成为Leader的票数超过一半而且超过它配置的quorum(quorum可以参考《redis sentinel设计与实现》)。sentinel比Raft协议增加了quorum,这样一个sentinel能否当选Leader还取决于它配置的quorum。
  6. 如果在一个选举时间内,Candidate没有获得超过一半且超过它配置的quorum的票数,自己的这次选举就失败了。
  7. 如果在一个epoch内,没有一个Candidate获得更多的票数。那么等待超过2倍故障转移的超时时间后,Candidate增加epoch重新投票。
  8. 如果某个Candidate获得超过一半且超过它配置的quorum的票数,那么它就成为了Leader。
  9. 与Raft协议不同,Leader并不会把自己成为Leader的消息发给其他sentinel。其他sentinel等待Leader从slave选出master后,检测到新的master正常工作后,就会去掉客观下线的标识,从而不需要进入故障转移流程。

故障转移过程

  1. 当多个sentinel发现并确认了master有问题
  2. 接着会选举出一个sentinel作为领导
  3. 再选举出一个slave作为master
  4. 通知其余的slave,新的master是谁
  5. 通知客户端一个主从的变化
  6. 最后,sentinel会等待旧的master复活,然后将新master成为slave

那么,如何选择“合适”的slave节点呢?

  1. 选择slave-priority(slave节点优先级,人为配置)最高的slave节点,如果存在则返回,不存在则继续。
  2. 其次会选择复制偏移量最大的slave节点(复制得最完整),如果存在则返回,不存在则继续
  3. 最后会选择run_id最小的slave节点(启动最早的节点)

客户端实现高可用的基本原理

故障转移后客户端无法感知将无法保证正常的使用。所以,实现客户端高可用的步骤如下:

  1. 客户端获取sentinel节点集合

  1. 客户端通过sentinel get-master-addr-by-name master-name这个api来获取对应主节点信息

  1. 客户端验证当前获取的“主节点”是真正的主节点,这样的目的是为了防止故障转移期间主节点的变化

  1. 客户端保持和sentinel节点集合的联系,即订阅sentinel节点相关频道,时刻获取关于主节点的相关信息

从上面的模型可以看出,Redis sentinel客户端只有在初始化和切换主节点时需要和sentinel进行通信来获取主节点信息,所以在设计客户端时需要将sentinel节点集合考虑成配置(相关节点信息和变化)发现服务。

需要说明的问题

  • 尽可能在不同物理机上和同一个网络部署Redis sentinel的所有节点
  • Redis sentinel中的sentinel节点个数应该大于等于3且最好是奇数。(节点数多可以保证高可用)
  • Redis sentinel中的数据节点和普通数据节点没有区别。每个sentinel节点在本质上还是一个Redis实例,只不过和Redis数据节点不同的是,其主要作用是监控Redis数据节点
  • 客户端初始化时连接的是sentinel节点集合,不再是具体的Redis节点,但sentinel只是配置中心不是代理。

更多内容,欢迎关注微信公众号:全菜工程师小辉。公众号回复关键词,领取免费学习资料。

Redis哨兵(Sentinel)模式快速入门的更多相关文章

  1. Redis哨兵(sentinel)模式搭建

    一.Sentinel介绍 之前骚了一波Redis的简介及应用场景,今天试了下他的哨兵模式: Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentine ...

  2. redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用

    目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...

  3. Redis配置sentinel模式

    Redis配置sentinel模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 哨兵(sentinel)主要是完成三个功能:监控,通知,自动故障转移功能.sentinel是安装R ...

  4. redis哨兵(Sentinel)、虚拟槽分区(cluster)和docker入门

    一.Redis-Sentinel(哨兵) 1.介绍 Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,r ...

  5. SpringBoot连接Redis (Sentinel模式&Cluster模式)

    一.引入pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  6. 第一章 使用开发者模式快速入门 Odoo 12

    本文为最好用的免费ERP系统Odoo 12开发手册系列文章第一篇. Odoo提供了一个快速应用开发框架,非常适合创建商业应用.这类应用通常用于保留业务记录,增删改查操作.Odoo 不仅简化了这类应用的 ...

  7. Redis详解(九)------ 哨兵(Sentinel)模式详解

    在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我 ...

  8. CentOS8 下 Redis5.0.7 哨兵Sentinel 模式配置指南

    下载Redis Redis下载链接 解压缩 tar -xzvf redis-5.0.7.tar.gz 编译安装 make和gcc依赖 可通过yum -y install gcc automake au ...

  9. Redis 哨兵 Sentinel

    Redis Sentinel:redis集群应用,分布式系统.   多个Sentinal进程之间通过 gossip 协议来接收主服务器是否下线的信息,通过 Raft 一致性协议来决定故障转移及转移服务 ...

随机推荐

  1. 灰度级分层(一些基本的灰度变换函数)基本原理及Python实现

    1. 基本原理 灰度级分层通常用于突出感兴趣的特定灰度范围内的亮度.灰度级分层有两大基本方法. 将感兴趣的灰度范围内的值显示为一个值(比如0),而其他范围的值为另外一个值(255). 将感兴趣的灰度范 ...

  2. Docker 核心技术

    docker是什么?为什么会出现? 容器虚拟化技术:轻量级的虚拟机(但不是虚拟机) 开发:提交代码 ——> 运维:部署 在这中间,因为环境和配置,出现问题 ——> 把代码/配置/系统/数据 ...

  3. Web前端开发工程师课程大纲

    PHP程序员雷雪松整理出来的一套独一无二的Web前端开发课程.本套Web前端开发课程专门为想励志成为优秀web前端工程师的学习者而总结归纳的,本套Web前端课程舍弃了一些不常用的即将废弃的HTML标签 ...

  4. JavaScript数据结构——图的实现

    在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用Ja ...

  5. 如何调教你的博客Episode1——修改整体样式

    如图所示,这是你刚刚注册的博客园博客,让我们开始一步步修改它. 1.写入自适应代码 html,body{ height:100%; border:; margin:; padding:; } body ...

  6. 【已解决】Https请求—未能创建 SSL/TLS 安全通道

    在做项目的微信推送消息功能时,由于微信并发量大,导致其它第三方接口调用时直接挂掉报错. 问题: 测试工程师做压测,100个线程同时调用微信和XX站的接口,日志报XX站的“请求被中止: 未能创建 SSL ...

  7. windows+appium自动化,Desired Capabilities参数填写,查看界面信息

    前言: 安装JDK并配置环境变量. 安装sdk并配置对应环境变量. 安装appium客户端. 手机打开开发者模式,并启用调试模式. 1.打开Appium客户端,点击Start Server V1.9. ...

  8. Gradle——创建简单的项目

    项目 & 任务 Gradle 的一切都是基于项目和任务的. 构建由一个或多个项目组成.项目的概念很抽象,它取决于你要用Gradle 做什么 .项目可以是 一个 Jar 库或者一个 web 程序 ...

  9. 06 css选择器

    选择器的作用:选中标签 1.基本选择器  标签选择器 id选择器 class选择器 *通配符选择器 权重:行内样式 1000 > id选择器 100 > 类选择器10 > 标签选择器 ...

  10. CSS布局:元素垂直居中

    CSS布局之元素垂直居中 本文将依次介绍在不同条件下实现垂直居中的多种方法及简单原理 Tip:下文中说的适用场景只是举了几个简单的例子方便读者理解.实际应用场景太复杂,生搬硬套容易出错.最重要的是掌握 ...