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 一致性协议来决定故障转移及转移服务 ...
随机推荐
- 从零开始——JSON ARRAY&JSON OBJECT
在学习“基于角色的权限”的例子中,遇到了json object和json array,因此在一番学习之后对此要点进行粗略整理. 参考: https://my.oschina.net/u/2601842 ...
- linux 无法安装gcc, 可以试试换用 阿里的yum
1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...
- Azure Internet 负载均衡器建立
摘自微软官方文档 Azure load balancer 是位于第 4 层 (TCP, UDP) 的负载均衡器. 该负载均衡器可以在云服务或负载均衡器集的虚拟机中运行状况良好的服务实例之间分配传入流量 ...
- Iptables教程
iptables防火墙简介 Iptables也叫netfilter是Linux下自带的一款免费且优秀的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入.流出.流经服务器的数据包进行精 ...
- Angular Reactive Forms -- Model-Driven Forms响应式表单
Angular 4.x 中有两种表单: Template-Driven Forms - 模板驱动式表单 (类似于 AngularJS 1.x 中的表单 ) 官方文档:https://v2.angul ...
- UIView 中 hidden、alpha、clear color 与 opaque 的区别
透明度与图层混合相关,影响到图片绘制的效率. hidden 此属性为 BOOL 值,用来表示 UIView 是否隐藏.关于隐藏大家都知道就是让 UIView 不显示而已,但是需要注意的是: 当前 UI ...
- 关于Mysql查询varchar类型错误问题
因为后台所有表ID都是按照雪花算法生成的18位数字,需要对接到Android,Ios和H5,此时H5会出现字符超长溢出,所以直接把ID改为varchar类型. 如我的一张表ID为varchar(18) ...
- 让CI框架支持service层
大家知道CodeIgniter框架式MVC分层的,通常大家把业务逻辑写到Controller中,而Model只负责和数据库打交道. 但是随着业务越来越复杂,controller越来越臃肿,举一个简单的 ...
- 2241. [SDOI2011]打地鼠【暴力+剪枝】
Description 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. 游戏中的锤 ...
- Python中的类(一)
Python中的类(一) 一. 应用场景 如果多个函数中有一些相同的参数时,转换成面向对象. 二. 如何创建类 类是用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法 ...