前言

  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. 一张图看懂 JS 原型链

    JS 原型链,画了张图,终于理清楚各种关系有木有 写在最后: __proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!! function Person() { } 是函 ...

  2. prince2的市场使用规模有多大?

    PRINCE2的使用和应用非常广泛.在过去的12个月里,超过60,000人参加了PRINCE2基础资格(Foundation)或从业资格(Practitioner)考试.现在每周参加考试的人数超过了2 ...

  3. [翻译] KGModal

    KGModal KGModal is an easy drop in control that allows you to display any view in a modal popup. The ...

  4. Java学习---IO操作

    基础知识 1.文件操作 Java语言统一将每个文件都视为一个顺序字节流.每个文件或者结束于一个文件结束标志,或者根据系统维护管理数据中所纪录的具体字节数来终止.当一个文件打开时,一个对象就被创建,同时 ...

  5. Java实例---简单的超市管理系统

    代码分析 Customer.java package test; public class Customer { private String name; private int customerTy ...

  6. 乘风破浪:LeetCode真题_016_3Sum Closest

    乘风破浪:LeetCode真题_016_3Sum Closest 一.前言      这一次,问题又升级了,寻找的是三个数之和最靠近的某个数,这是非常让人难以思考的,需要把三个数相加之后和最后给的目标 ...

  7. SQL server reporting service - rsReportServerNotActivated error solution

    描述: 今天在原有的数据库版本上增加了Reporting Service 功能,数据库完成安装后,没有发现ReportServer和 ReportServerTemp 两个数据库 于是从其他服务器上, ...

  8. [COGS 2064]爬山

    2064. 爬山 ★☆   输入文件:mountain.in   输出文件:mountain.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 球有一天走在街上. 一个健 ...

  9. 怎么知道是哪个div被点击了

    怎么知道是哪个div被点击了 不在div中加onclick等事件调用函数 ,用事件监听函数,但是如果div中的div被点击了,addEventListener得到了两个监听事件,我想点击div里的di ...

  10. 创建工程支持scala代码开发

    第一步:idea当中创建创建普通maven工程 File ==> New ==> Project 第二步:修改pom.xml添加scala的版本以及打包插件 <dependencie ...