Redis 之武林大会 - 哨兵(Sentinel)
前言
Redis在出从复制的模式下,一旦主节点由于故障不能提供服务,需要人工降从节点晋升为主节点,同时还要通知应用方更新主节点的地址,在很多应用场景下,这样的故障处理方式是无法被接受的。不过幸运的是Redis自从2.8之后,便正式提供了Redis Sentinel(哨兵)架构来解决这个问题,因此本文将开始说一下Redis Sentinel的一些基本概念特性。
一. 基本概念
Redis Sentinel 是 Redis的高可用的实现方案,再睡生产环境中,对提高整个系统的高可用是非常有帮助的,这里需要先回顾下主从复制模式下故障处理可能产生问题,而后再引出高可用的概念,最后再分析下 Redis Sentinel 的基本架构和优势,以及如何实现高可用。
二. 主从复制的问题
在Redis主从复制模式下,可以将主节点的数据改变同步给从节点,这样从节点就有两个作用:(1)作为主节点的一个备份,一旦主节点不可达了,那么从节点就能作为后备使用起来,且尽量保障主从复制的一致性。(2)从节点可以扩展从节点的读能力,一旦主节点不能支撑大并发的读操作,从节点在一定程度上是可以分担主节点的压力的。
但主从复制也会带来一下问题:
- 一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时还要修改应用方的主节点地址,还需要命令其他从节点来复制新的主节点,整个过程都需要人工干预,运维成本高。
- 主节点的写能力受到单机的限制。
- 主节点的存储能力受到单机的限制。
三. 高可用
Redis在主从复制的模式下,当主节点出现不可达时,需要人工来干预做故障转移,这样不管是对Redis应用方来说,还是对运维来说,都是极其麻烦的。在应用方来看是无法及时感知到主节点的变化的,这样便必然造成数据丢失或读数据错误的情况,甚至造成应用方不可用。在运维方来看,整个故障都是需要人工介入,故障转移的实时性和准确性是无法保障的,如下图是展示1主2从的Redis主从复制模式下的主节点出现故障后是如何进行故障转移的。

流程说明:
- 主节点发生故障后,客户端(client)连接主节点失败,两个从节点与主节点连接失败,这样便导致复制中断了,如果主节点无法正常启动,需要选出一个从节点(slave-1),对其执行slaveof no one 命令,使其成为新的主节点。
- 当原来的从节点(slave-1)成为新的主节点后,更新应用方的主节点地址,重启应用方使其连接新的主节点。
- 客户端命令另一个从节点(slave-2)去复制新的主节点(new master)。
- 带原来的主节点恢复后,让它去复制新的主节点。
以上的整个流程,其设计不是高可用的,因为其整个故障转移都需要人工去干涉,考虑到这点,于是便促使 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节点集合会定期对所有的的节点进行监控,特别是对主节点做的故障自动转移。
整个故障转移流程图如下:

流程说明:
- 主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败。
- 每个Sentinel节点通过定期监控发现主节点出现了故障。
- 多个Sentinel节点对主节点的故障达成一致,选举出了sentinel-3节点作为领导者负责故障转移。
- Sentinel领导者节点执行了故障转移,整个过程和Redis主从复制的流程一致,不过是自动化完成的。
- 故障转移后的整个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)的更多相关文章
- Redis(十五):哨兵Sentinel
Redis哨兵 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你 ...
- redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用
目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...
- redis集群之哨兵模式【原】
redis集群之哨兵(sentinel)模式 哨兵模式理想状态 需要>=3个redis服务,>=3个redis哨兵,每个redis服务搭配一个哨兵. 本例以3个redis服务为例: 一开始 ...
- Redis容灾部署(哨兵Sentinel)
Redis容灾部署(哨兵Sentinel) 哨兵的作用 1. 监控:监控主从是否正常2. 通知:出现问题时,可以通知相关人员3. 故障迁移:自动主从切换4. 统一的配置管理:连接者询问sentinel ...
- redis 系列23 哨兵Sentinel (上)
一.概述 Sentinel(哨岗或哨兵)是Redis的高可用解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主 ...
- redis哨兵(Sentinel)、虚拟槽分区(cluster)和docker入门
一.Redis-Sentinel(哨兵) 1.介绍 Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,r ...
- Redis高可用之哨兵模式Sentinel配置与启动(五)
0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...
- redis主从集群搭建及容灾部署(哨兵sentinel)
Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 Redis安装 整体架构 Redis主从结构搭建 Redis容灾部署(哨兵sentinel) Redis常见问题 ...
- Redis 哨兵 Sentinel
Redis Sentinel:redis集群应用,分布式系统. 多个Sentinal进程之间通过 gossip 协议来接收主服务器是否下线的信息,通过 Raft 一致性协议来决定故障转移及转移服务 ...
随机推荐
- C#-MDI-多窗口通信方法总结
总结C#中窗体间传递数据的几种方法 (由别人的方法整理) 转自:http://blog.csdn.net/daisy423xu/article/details/1579854 在编写C#windows ...
- Python json与pickle
这是用于序列化的两个模块: • json: 用于字符串和python数据类型间进行转换 • pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:d ...
- CAMediaTimingFunction的使用
CAMediaTimingFunction的使用 CAMediaTimingFunction可以用在POP动画的自定义动画当中,算是非常实用的工具,当然,系统的动画也是可以使用的. 效果: 需要用到的 ...
- phpstrom设置php环境
phpstorm设置自动同步服务器 Tools->Deployment->Confinguration 点+号,添加服务器,类型SFTP,输入name 点击ok,项目与服务器连接成功! 设 ...
- update from select
CREATE TABLE dualx( x_id ) NOT NULL , x_con ) ) CREATE TABLE dualy( y_id ) NOT NULL , y_con ) ) ','x ...
- 实用的 CSS 小片段
看了 30 Seconds CSS,有了许多收获,所以写下了这篇文章,算是收藏一些代码小片段,留作后用. 一.手写 Loading 动画 (1)弹性加载动画 CSS 代码如下: .bounce-loa ...
- hdu-3397 Sequence operation 线段树多种标记
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3397 题目大意: 0 a b表示a-b区间置为0 1 a b表示a-b区间置为1 2 a b表示a- ...
- Java基础知识强化之多线程笔记07:同步、异步、阻塞式、非阻塞式 的联系与区别
1. 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就必须先得到返回值了. 换句话话说,调用者主动等待这个"调用"的结果. 对于 ...
- canvas二三事之签名板与视频绘制
今天,不知道怎么的就点开了语雀,然后就看到了<HTML5 Canvas 教程>,开始了canvas的研究(学习)之旅. 首先,想到的第一个东西就是签名板,上代码: <canvas i ...
- 2019.3.26 为什么说HTTP是无状态协议/无连接
无状态 1.协议对于事务处理没有记忆能力 2.对同一个url请求没有上下文关系 3.每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求时无直接关系的,它不会受前面的请求应答情况直接影响, ...