前言

  Redis在出从复制的模式下,一旦主节点由于故障不能提供服务,需要人工降从节点晋升为主节点,同时还要通知应用方更新主节点的地址,在很多应用场景下,这样的故障处理方式是无法被接受的。不过幸运的是Redis自从2.8之后,便正式提供了Redis Sentinel(哨兵)架构来解决这个问题,因此本文将开始说一下Redis Sentinel的一些基本概念特性。


一. 基本概念

  Redis Sentinel 是 Redis的高可用的实现方案,再睡生产环境中,对提高整个系统的高可用是非常有帮助的,这里需要先回顾下主从复制模式下故障处理可能产生问题,而后再引出高可用的概念,最后再分析下 Redis Sentinel 的基本架构和优势,以及如何实现高可用。


二. 主从复制的问题

  在Redis主从复制模式下,可以将主节点的数据改变同步给从节点,这样从节点就有两个作用:(1)作为主节点的一个备份,一旦主节点不可达了,那么从节点就能作为后备使用起来,且尽量保障主从复制的一致性。(2)从节点可以扩展从节点的读能力,一旦主节点不能支撑大并发的读操作,从节点在一定程度上是可以分担主节点的压力的。

  但主从复制也会带来一下问题:

  • 一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时还要修改应用方的主节点地址,还需要命令其他从节点来复制新的主节点,整个过程都需要人工干预,运维成本高。
  • 主节点的写能力受到单机的限制。
  • 主节点的存储能力受到单机的限制。

三. 高可用

  Redis在主从复制的模式下,当主节点出现不可达时,需要人工来干预做故障转移,这样不管是对Redis应用方来说,还是对运维来说,都是极其麻烦的。在应用方来看是无法及时感知到主节点的变化的,这样便必然造成数据丢失或读数据错误的情况,甚至造成应用方不可用。在运维方来看,整个故障都是需要人工介入,故障转移的实时性和准确性是无法保障的,如下图是展示1主2从的Redis主从复制模式下的主节点出现故障后是如何进行故障转移的。

流程说明:

  1. 主节点发生故障后,客户端(client)连接主节点失败,两个从节点与主节点连接失败,这样便导致复制中断了,如果主节点无法正常启动,需要选出一个从节点(slave-1),对其执行slaveof no one 命令,使其成为新的主节点。
  2. 当原来的从节点(slave-1)成为新的主节点后,更新应用方的主节点地址,重启应用方使其连接新的主节点。
  3. 客户端命令另一个从节点(slave-2)去复制新的主节点(new master)。
  4. 带原来的主节点恢复后,让它去复制新的主节点。

  以上的整个流程,其设计不是高可用的,因为其整个故障转移都需要人工去干涉,考虑到这点,于是便促使 Redis Sentinel 的出现,其作用正是用于解决这些问题的。


四. Redis Sentinel 的高可用性

  当主节点出现故障时,Redis Sentinel 能自动完成故障发现和故障转移,并通知应用方,从而实现真正的高可用。

  Redis Sentinel 是一个分布式架构,其中包含若干个Sentinel界定和Redis数据节点,每个Sentinel节点会对数据节点和其余的Sentinel节点进行监控,当发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它还会和其他Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可达时,它们会选举出一个Sentinel节点来完成故障转移的工作,同时会将这个变化实时通知给Redis应用方。整个过程完全是自动的,不需要人工干涉,所以这套方案很有效地解决了Redis的高可用问题。

  Redis Sentinel 与 Redis 主从复制模式之间只是多了若干个 Sentinel 节点,所以 Redis Sentinel 并没有针对 Redis 节点做了特殊处理,这里容易让人混淆。如下图:

  从逻辑架构上看,Sentinel节点集合会定期对所有的的节点进行监控,特别是对主节点做的故障自动转移。

  整个故障转移流程图如下:

流程说明:

  1. 主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败。
  2. 每个Sentinel节点通过定期监控发现主节点出现了故障。
  3. 多个Sentinel节点对主节点的故障达成一致,选举出了sentinel-3节点作为领导者负责故障转移。
  4. Sentinel领导者节点执行了故障转移,整个过程和Redis主从复制的流程一致,不过是自动化完成的。
  5. 故障转移后的整个Redis Sentinel 的拓扑图如下:

  通过上面的Redis Sentinel逻辑架构以及故障转移处理的说明,可以看出Redis Sentinel具有如下功能:

  • 监控:Sentinel节点会定期监测Redis数据节点,其余Sentinel节点是否可达。
  • 通知:Sentinel节点会将故障转移的结果通知给应用方。
  • 主节点故障转移:实现从节点晋升为主节点,并在维护后继续正确的主从关系。
  • 配置提供者:在Redis Sentinel结构中,客户端初始化的时候连接的是Sentinel节点集合,并从中获取信息。
  • 对于节点的故障判断是由多个Sentinel节点共同完成的,这样可以有效的防止错误的判断。
  • Sentinel节点集合是由若干个Sentinel节点组成的,这样即使个别的Sentinel节点不可用,整个Sentinel节点集合依然是健壮的。

  Redis Sentinel节点本身就是独立于Redis节点的,只不过是有一些特殊,因为它们并不用去存储数据,并且只支持部分的命令,后面我们将继续说关于Redis Sentinel的安装与部署。


五. 回顾

  本篇主要说了一下关于Redis主从复制和Redis Sentinel架构之前的一些区别,以及Redis Sentinel的一些作用,以及其完成故障转移的流程。

参考:《Redis开发与运维》

版权声明:尊重博主原创文章,转载请注明出处 https://www.cnblogs.com/hsdy

Redis 之武林大会 - 哨兵(Sentinel)的更多相关文章

  1. Redis(十五):哨兵Sentinel

    Redis哨兵 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你 ...

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

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

  3. redis集群之哨兵模式【原】

    redis集群之哨兵(sentinel)模式 哨兵模式理想状态 需要>=3个redis服务,>=3个redis哨兵,每个redis服务搭配一个哨兵. 本例以3个redis服务为例: 一开始 ...

  4. Redis容灾部署(哨兵Sentinel)

    Redis容灾部署(哨兵Sentinel) 哨兵的作用 1. 监控:监控主从是否正常2. 通知:出现问题时,可以通知相关人员3. 故障迁移:自动主从切换4. 统一的配置管理:连接者询问sentinel ...

  5. redis 系列23 哨兵Sentinel (上)

    一.概述 Sentinel(哨岗或哨兵)是Redis的高可用解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主 ...

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

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

  7. Redis高可用之哨兵模式Sentinel配置与启动(五)

    0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...

  8. redis主从集群搭建及容灾部署(哨兵sentinel)

    Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 Redis安装 整体架构 Redis主从结构搭建 Redis容灾部署(哨兵sentinel) Redis常见问题 ...

  9. Redis 哨兵 Sentinel

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

随机推荐

  1. python django 环境搭建

    一. 版本选择 Django 1.5.x 支持 Python 2.6.5 Python 2.7, Python 3.2 和 3.3. Django 1.6.x 支持 Python 2.6.X, 2.7 ...

  2. 【Oracle】数据库中sql%notfound的用法

    SQL%NOTFOUND 是一个布尔值.与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true.否则返回fal ...

  3. Python3.x urlib包

    在Python3.x中,我们可以使用urlib这个组件抓取网页,urllib是一个URL处理包,这个包中集合了一些处理URL的模块,如下: 1.urllib.request模块是用来打开和读取URLs ...

  4. [tools]excel转lua的python实现

    time:2015/04/13 描述:需要将excel表格内容转成lua,并且作为工具使用,能够批量转换 步骤: (1)文章[1]已经做了大部分的内容,而且也已经能够使用了 (2)根据自己新的需求: ...

  5. Shell使用手册

    1.循环数组 list=(20180531 20180430 20180331 20180228 20180131 20171231 20171130 20171031 20170930 201708 ...

  6. 沉淀,再出发:XPath的理解和使用

    沉淀,再出发:XPath的理解和使用 一.前言   在很多查找的场合之下,我们需要使用正则表达式和其他的查找工具来进行内容的匹配和查找,特别是对于xml文件,我们可以使用xpath等工具来进行查找,通 ...

  7. 重装win7系统的过程

    U盘重装系统准备工作: 1.下载一个制作U盘系统的软件,随便哪个都行,把U盘变成系统盘 2.下载镜像,将镜像copy到系统盘内即可(无需解压) 3.进入BIOS系统,将boot进行设置,将U盘设置为第 ...

  8. August 18th 2017 Week 33rd Friday

    If you shed tears when you miss the sun, you also miss the stars. 如果你因为错过太阳而哭泣,你也将会错过繁星. If you have ...

  9. ZT pthread_detach

    pthread_detach 创 建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出 ...

  10. SpringBoot 中解决跨域请求

    CORS 理解 同源策略是web浏览器实现的一个重要的安全概念,它防止JavaScript代码对不同的来源(例如,不同的域)发出请求,而不是它所服务的来源.虽然同源策略有效地防止来自不同来源的资源,但 ...