Redis快速实战-哨兵机制(Redis Sentinel)详解
mhr18 2024-10-26 10:54 34 浏览 0 评论
哨兵机制
Redis Sentinel ,Redis哨兵机制,是从Redis2.8版本开始引入的机制,其主要的作用就是用来完成主节点的自动故障转移。如下图所示,是一个典型的利用哨兵机制来监控的逻辑网络图。图片来源网络。
关于哨兵机制,官方的描述是这样的,首先哨兵会不断地监视主节点和从节点是否工作正常,当主节点发生异常的时候,哨兵就开始进行自动故障的转移,其操作就是从对应主节点的从节点中挑选出一个来将其升级为主节点,并且让其他的剩余的从节点改成从新的主节点复制数据。当有新的客户端接入的时候,通过哨兵机制可以很容易的获取到当前集群的Redis的主节点信息,并且哨兵也可以将发生故障的情况发送到客户端。
其中,对于故障的监控和故障的转移功能,都可以使得哨兵可以及时的发现主节点的故障,并且完成转移,从而保证集群的高可用;而对于提到的配置的更新,或者是服务通知的功能,则需要与客户端的交互才能够更好的体现。
哨兵集群的组建
从上面图中我们看出,在Redis哨兵集群中是通过发布订阅机制来实现哨兵之间的相互发现。下面我们就来详细介绍一下该机制。
在一个主从的Redis集群中,主库中存在设置了一个sentinel的订阅频道,而哨兵就是通过这个订阅频道来完成相互之间的通信的。如下图所示,图片来源网络。
通过如上图所示的机制来完成哨兵之间的信息传递。哨兵节点1将节点信息发布到了主频道上,在哨兵2和哨兵3上订阅了该频道,所以哨兵1发出的消息哨兵2和哨兵3都能接收到。同样的哨兵2和哨兵3也采用了同样的机制来完成通信连接。这样一来三个哨兵节点之间就形成了一个消息互通的集群,并且在发生故障的时候可以相互之间通知彼此来商量如何选择新的主节点。
哨兵监控Redis库
什么是哨兵的监控?如何来监控哨兵?这个过程是通过哨兵向主库发送INFO命令来实现。如图所示,图片来源网络。
如图所示,哨兵2给主库发送了一个INFO的命令请求,主库接收到这个命令之后,就会把所有的从库列表返回给哨兵,接下来哨兵就可以根据从库列表中的数据信息,和每个从库建立连接,并且在这个连接的基础上完成对从库信息的监控。同样的哨兵1和哨兵3也可以完成这样的操作。
主库故障的判断
哨兵是如何完成主库故障的判断呢?首先主库故障下线有两个关键概念,主观下线和客观下线。
主观下线是指任何一个哨兵都可以通过监控机制来做出对Redis节点下线的判断。
客观下线是指整个的哨兵集群共同来决定的Redis节点下线。
当某个哨兵认为主节点主观下线之后,就会给其他的哨兵发送一个命令,接下来哨兵就会根据自己与主节点的连接情况,对其进行回应,如图所示,如果当回应中赞成下线的响应大于等于哨兵配置文件中的quorum的大小的时候,就可以判定主节点客观下线了,也就是说主节点出现了故障。
哨兵集群的选举
判断主节点故障之后,就需要进行新的主节点的选取以及完成主节点的切换,这个操作就需要Redis哨兵选举机制。
为了避免出现哨兵单节点的情况,就需要建立一个哨兵的分布式集群,这样就可以避免单节点问题;与此同时,对于故障的转移和通知都只需要一个主的哨兵节点来完成即可。保证了这两个条件,哨兵的选举机制就很容易理解了,就是遵循着简单的少数服从多数的原则,当选票达到了一半以上就表示该节点成为了主节点,反之则继续进行选举。其采用的算法叫做Raft算法。
也就是说任何一个节点想要成为主节点就必须满足如下的两个条件。
第一、获取到半数以上的投票
第二、获得的票数要大于等于在哨兵配置文件中的quorum的配置值
这里就会有一个新问题,关于是否客观下线与是否能够进行主从切换都有一个关键性的配置quorum配置值参与其中。那么如何进行判断呢?
例如有一主四从,五个节点的集群,并且哨兵配置quorum为2,如果这个时候有三个哨兵节点出现了故障。这个时候主节点也出现了故障,哨兵还能否判断出主库的客观下线故障呢?
前面我们提到哨兵节点判断主节点客观下线的条件是quorum=2,所以当一个哨兵判断到主观下线之后,就会通知另一个哨兵询问情况,这个时候两个哨兵都判断了主观下线,那么就可以判断主节点为客观下线。
而这个时候就要进行选举了,当哨兵标记主节点下线之后,就会进行一个选择,这个时候需要满足一个一半以上的原则,也就是说有5个节点除以2加一之后的结果是3。但是目前只有两个节点存活,所以无法完成主节点的切换。
选主条件
完成主库的客观下线之后,如何从从库中选择出一个新的主库呢?就需要满足如下的一些条件。首先,需要过滤掉一些不健康的节点,也就是与哨兵之间没有响应的节点。其次,选择配置优先级较高的从节点。第三,选择数据量较为完整的从节点。如下图所示。
故障转移
主库确定之后,就要开始故障转移操作了,如下图所示。
建设主库客观下线嘞,并且选择了哨兵3是leader。
- 将slave-1脱离原从节点升级主节点,
- 将从节点slave-2指向新的主节点
- 通知客户端主节点已更换
- 将原主节点(oldMaster)变成从节点,指向新的主节点
转移之后的效果如下
相关推荐
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
-
在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...
- 第四节 Windows 系统 Docker 安装全指南
-
一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...
- C++ std:shared_ptr自定义allocator引入内存池
-
当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...
- Activiti 8.0.0 发布,业务流程管理与工作流系统
-
Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
-
MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...
- Springboot数据访问(整合Mybatis Plus)
-
Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
-
见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...
- Mybatis入门看这一篇就够了(mybatis快速入门)
-
什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...
- Springboot数据访问(整合druid数据源)
-
Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
-
什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...
- 企业数据库安全管理规范(企业数据库安全管理规范最新版)
-
1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...
- Oracle 伪列!这些隐藏用法你都知道吗?
-
在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...
- Oracle 高效处理数据的隐藏神器:临时表妙用
-
各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...
- Oracle 数据库查询:多表查询(oracle多表关联查询)
-
一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...
- 一文掌握怎么利用Shell+Python实现多数据源的异地备份程序
-
简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
- 第四节 Windows 系统 Docker 安装全指南
- C++ std:shared_ptr自定义allocator引入内存池
- Activiti 8.0.0 发布,业务流程管理与工作流系统
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
- Springboot数据访问(整合Mybatis Plus)
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
- Mybatis入门看这一篇就够了(mybatis快速入门)
- Springboot数据访问(整合druid数据源)
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)