【NoSQL数据库】Redis——哨兵模式

Redis——哨兵模式


Redis哨兵

  • Redis——哨兵模式
    • 1.什么是哨兵机制(Redis Sentinel)
      • 1.1 哨兵的作用
    • 2.哨兵的运行机制
    • 3.故障处理
    • redis常见问题汇总
      • 1、redis缓存击穿是什么?如何解决?
      • 2、redis缓存穿透是什么?如何解决?
      • 3、redis缓存雪崩是什么?如何解决?

1.什么是哨兵机制(Redis Sentinel)

Redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入。哨兵的核心功能是主节点的自动故障转移。

哨兵机制(sentinel)是Redis解决高可用的一种解决方案:它是由一个或者多个sentinel 实例组成的一个sentinel 系统。
在这里插入图片描述

1.1 哨兵的作用

master 状态检测;
如果 master 异常,则会进行 master-slave 切换,将其中一个 slave 作为 master,将之前的 master 作为 slave;
master-slave 切换后,master_redis.conf、slave_redis.conf 和 sentinel.conf 的内容都会发生改变,即 master_redis.conf 中会多一行 slaveof 的配置,sentinel.conf 的监控目标会随之调换。

Redis官方文档的描述如下:

监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。
自动故障转移(Automatic failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
配置提供者(Configuration provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。
通知(Notification):哨兵可以将故障转移的结果发送给客户端。

2.哨兵的运行机制

1、哨兵启动
当一个 Sentinel 启动时,会创建连向被监视的主服务器的网络连接。它可以向主服务器发送命令,并从命令回复中获取相关的信息。对于每个被 Sentinel 监视的主服务器,Sentinel 会创建两个连向主服务器的异步网络:

命令连接:用于向主服务器发送命令(包括ping、info),并接受命令回复,用来获取从节点的信息与Sentinel 、Redis节点的状态信息。

订阅连接:用于订阅主服务器的 sentinel:hello 频道,用来和其他Sentinel 实例建立连接。

2、订阅频道
Sentinel实例会向与其连接的节点(包括主从节点)的 sentinel:hello 频道发送消息, 并订阅该频道(SUBSCRIBE sentinel:hello)。这样一来,当后续的请添加图片描述
Sentinel实例与主库建立连接,发送消息时,之前订阅该频道的消息就能够收到新实例加入的消息,然后就可以从这个频道直接获取新实例的信息并建立网络连接。
Sentinel 对 sentinel:hello 频道的订阅会一直持续到 Sentinel 与服务器断开连接为止。在此之前Sentinel 会以每两秒一次的频率,通过命令向所有被监视的主服务器和从服务器发送自己的信息及主节点相关的配置。

3、获取服务器信息
Sentinel 向服务器(主从节点都有)发送 INFO 命令,获取主服务器及它的从服务器信息。
(1)获取主服务器信息
Sentinel 默认会以每十秒一次的频率,通过命令连接向被监视的服务器发送 INFO 命令,并通过分析 INFO 命令的回复来获取主服务器的当前信息。

  • 主服务自身信息:包括 run_id 域记录的服务器运行 ID,以及 role 域记录的服务器角色
  • 主服务的从服务器信息:包括 IP 地址和端口号

(2)获取从服务器信息
当 Sentinel 发现主服务器有新的从服务器出现时,Sentinel 除了会为这个新的从服务器创建相应的实例结构之外,Sentinel 还会创建连接到从服务器的命令连接和订阅连接。

4、检测服务器状态
Sentinel 向 Redis 服务器发送 PING 命令,检查其状态。

每个 Sentinel 节点会以 每秒一次 的频率对 Redis 节点和 其它 的 Sentinel 节点发送 PING 命令,并通过节点的 回复 来判断节点是否在线。哨兵正是通过这个机制得以判断主节点是否下线,这将涉及到2个新的改变,主观下线与客观下线。

注意:一个有效的 PING 回复可以是:+PONG、-LOADING 或者 -MASTERDOWN。如果 服务器 返回除以上三种回复之外的其他回复,又或者在 指定时间 内没有回复 PING 命令, 那么 Sentinel 认为服务器返回的回复 无效(non-valid)。

3.故障处理

在上文中,我们留了2个概念(主观下线与客观下线)没有解释,这一节我们结合哨兵对故障的处理进行讲解。

1、主库下线判定
(1)主观下线
主观下线适用于所有 主节点 和 从节点。 如果最后一次的有效回复 PING 命令的时间超过 down-after-milliseconds 毫秒,则会判定 该节点 为 主观下线(SDOWN)。

注意:主从节点都可能被标记为主观下线,只不过只会对主机节点的客观下线进行下一步判断。在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率,向它已知的所有 主服务器 和 从服务器 发送 INFO 命令。当一个 主服务器 被 Sentinel 标记为 客观下线 时,Sentinel 向 下线主服务器 的所有 从服务器 发送 INFO 命令的频率,会从 10 秒一次改为 每秒一次。

(2)客观下线
客观下线只适用于主节点。当 Sentinel 将一个主服务器判断为主管下线后,为了确认这个主服务器是否真的下线,会向同样监视这一主服务器的其他 Sentinel 询问( 通过sentinel is-master-down-by-addr指令判断),看它们是否也认为主服务器已经下线。

其他哨兵会根据自己和主库的连接情况,做出 Y 或 N 的响应,Y 相当于赞成票,N 相当于反对票。如果赞成票数(这里是2)是大于等于哨兵配置文件中的 quorum 配置项(比如quorum=2), 则可以判定主库客观下线了。当足够数量的 Sentinel 认为主服务器已下线,就判定其为客观下线(ODOWN),并对其执行故障转移操作。

2、哨兵集群的选举
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个 Sentinel 会进行选举,选举出一个领头的 Sentinel,并由领头 Sentinel 对下线主服务器执行故障转移操作。

哨兵的选举机制使用Raft(Raft算法详解)选举算法:

每个发现服务客观下线的sentinel,都会要求其他sentinel将自己设置成领头。所有的sentinel都有且只有一次将某个sentinel选举成领头的机会(在一轮选举中),一旦选举某个sentinel为领头,不能更改。领头sentinel是先到先得,一旦当前sentinel设置了领头sentinel,以后要求设置sentinel为领头请求都会被拒绝。

成为领头sentinel的条件如下:

  • 拿到半数以上的赞成票;
  • 拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。

当有3 个哨兵时,quorum 设置为 2,那么,任何一个想成为 Leader 的哨兵只要拿到 2 张赞成票,就可以了。

3、新主库的选出
主库被判定为客观下线后,就需要从剩余的从库中选择一个新的主库。

  • 过滤列表中所有处于下线或断线状态的从服务器。
  • 过滤列表中所有最近五秒没有回复过 Sentinel Leader 的 INFO 命令的从服务器。
  • 过滤所有与已下线主服务器连接断开超过 down-after-milliseconds * 10 毫秒的从服务器(down-after-milliseconds 指定了判断主服务器下线所需的时间)。

然后, Sentinel Leader 先选出优先级最高的从服务器;如果优先级一样高,再选择复制偏移量最大的从服务器;如果结果还不唯一,则选出运行 ID 最小的从服务器。

4、故障的转移
在上文中,Sentinel Leader 已经挑选出了新的主节点,接下来就要进行故障转移了。

首先向这个从节点发送 SLAVEOF no one 命令,将其转换为主节点(5.0 中应该是replicaof no one)。然后Sentinel Leader 会向所有从节点发送 SLAVEOF 命令,让所有从节点指向新的主节点并复制新的主节点上的数据,然后通知客户端主节点已更换,最后将旧的主服务器标记为从服务器。当旧的主服务器重新上线,Sentinel Leader 会向它发送 SLAVEOF 命令,让其成为从服务器

最后,需要注意的是,主从切换并不一定就能完成,下面举个例子,Redis 1主4从,5个哨兵,哨兵配置quorum为2,如果3个哨兵故障,此时主节点宕机。
由于quorum=2,所以当一个哨兵判断主库“主观下线”后,询问另外一个哨兵后也会得到同样的结果,2个哨兵都判定“主观下线”,达到了quorum的值,因此,哨兵集群可以判定主库为“客观下线”。

但哨兵不能完成主从切换。哨兵标记主库“客观下线后”,在选举“哨兵领导者”时,一个哨兵必须拿到超过多数的选票(5/2+1=3票)。但目前只有2个哨兵活着,无论怎么投票,一个哨兵最多只能拿到2票,永远无法达到N/2+1选票的结果。

当没有足够数量的 Sentinel 同意 主服务器 下线时, 主服务器 的 客观下线状态 就会被移除。当 主服务器 重新向 Sentinel 的 PING 命令返回 有效回复 时,主服务器 的 主观下线状态 就会被移除。同样,从服务器的主观下线状态在PING命令得到有效回复后移除。

redis常见问题汇总

1、redis缓存击穿是什么?如何解决?

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案
1.设置热点数据永远不过期:使用mutex,缓存失效的时候(判断拿出来的值为空),不是立即去loaddb,而是先使用缓存工具的某些带成功的返回值操作(例如reids的SETNX或者memcache的add)去set一个mutexkey,当返回成功时,在进行load db操作并回设缓存,否则就重试整个get缓存方法。

2、redis缓存穿透是什么?如何解决?

缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案
接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。
【推荐】采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。

3、redis缓存雪崩是什么?如何解决?

缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案
1.缓存数据的过期时间进行错开,防止同一时间大量数据过期现象发生。
2.像缓存穿透一样加锁排列。
3.建立备份缓存,设置A的过期时间,不设置B的过期时间,当缓存A失效的时候,读取缓存B,并且更新A的缓存和B的缓存。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/683634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解!Python怎么配置环境变量

详解&#xff01;Python怎么配置环境变量 许多刚开始学习编程的初学者在 python的安装上会抱有一定的疑惑&#xff0c;为什么明明已经安装好了 python 环境&#xff0c;但并不能运行python 代码&#xff0c;这是因为 python 的安装过程中还有一步环境变量的配置&#xff0c;接…

微信“对方正在输入”背后的小心思:保持隐秘感,享受宁静的交流

微信&#xff0c;这个伴随我们起居、工作的超级应用&#xff0c;不仅仅是一款聊天软件&#xff0c;它几乎成为了我们社交生活的一部分。它的便捷&#xff0c;让我们的日常沟通如鱼得水。然而&#xff0c;在这个几乎完美的社交工具中&#xff0c;有一个功能&#xff0c;让不少人…

CSS真题合集(二)

CSS真题合集&#xff08;二&#xff09; 11. css3新增特性12. css3动画12.1 关键帧动画 (keyframes)12.2 animation12.3 transition12.4 transform 13. grid网格布局13.1 使用display: grid或display: inline-grid的HTML元素。13.2 定义网格13.3 13.4 自动填充和自动放置13.4 对…

信号发生器如何将频率调大,步尽值改成10

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

PPT文件损坏且无法读取怎样修复?文档损坏修复方法推荐

PPT文件已经成为工作汇报、商务演示、学术交流以及教学培训中最常用到的文件&#xff0c;随着文件数量的增多和存储设备的频繁使用&#xff0c;我们有时会遇到PPT文件损坏无法打开的情况&#xff0c;这无疑给工作和学习带来了极大的困扰。 PPT文件损坏的原因可能多种多样&#…

FreeRTOS手表项目多级菜单的实现

一、首先介绍一下智能手表项目的背景&#xff1a; 如图&#xff0c;关注焦点是任务&#xff1a; 1、在一个确定时刻&#xff0c;在那一圈任务中&#xff08;写有只有一个任务解挂&#xff09;只有一个任务处在运行&#xff0c;界面显示的是该任务应该显示的内容&#xff1b; …

韩国Neowine推出第三代强加密芯片ALPU-CV

推出第三代加密芯片&#xff1b;是ALPU系列中的高端IC&#xff1b;是一款高性能车规级加密芯片&#xff1b;其加密性更强、低耗电、体积小&#xff1b;使得防复制、防抄袭板子的加密性能大大提升&#xff0c;该芯片通过《AEC-Q100》认证&#xff0c;目前已经在国产前装车辆配件…

代理记账公司哪家好,深度剖析与选择指南

代理记账&#xff0c;作为企业会计管理和运营的重要环节&#xff0c;已经逐渐被越来越多的企业所重视&#xff0c;在众多的代理记账公司中&#xff0c;如何选择一家专业、高效且值得信赖的代理记账机构呢&#xff1f;以下是一些深度解析和推荐。 公司的规模 规模较大的代理记账…

docker实战命令大全

文章目录 1 环境准备1.1 移除旧版本Docker1.2安装工具包1.3配置docker yum源 2 安装最新docker2.1 设置开机自启docker2.2配置加速器 3 实操-镜像3.1搜索镜像3.2下载镜像3.3查看镜像3.4 删除镜像 4 实操-容器4.1运行nginx容器4.2 查看容器4.3启动容器4.5关闭容器4.6查看容器日志…

Linux中Apache网站基于Http服务的访问限制(基于地址/用户)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月3日11点44分 &#x1f004;️文章质量&#xff1a;95分 为了更好地控制对网站资源的访问&#xff0c;可…

基于SSM+Jsp的高校二手交易平台

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

前端怎么预览pdf

1.背景 后台返回了一个在线的pdf地址&#xff0c;需要我这边去做一个pdf的预览&#xff08;需求1&#xff09;&#xff0c;并且支持配置是否可以下载&#xff08;需求2&#xff09;&#xff0c;需要在当前页就能预览&#xff08;需求3&#xff09;。之前我写过一篇预览pdf的文…

ant design的upload组件踩坑记录

antd版本 v4.17.0 1.自定义了onpreview和onchange事件&#xff0c;上传文件后&#xff0c;文件显示有preview的icon但是被禁用&#xff0c;无法调用onpreview事件。 问题展现&#xff1a; 苦苦查找原因&#xff0c;问题出在了这里&#xff0c;当文件没有url的时候&#xff0c…

基于FPGA的图像一维FFT变换IFFT逆变换verilog实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 fpga仿真结果 matlab调用FPGA的仿真结果进行图像显示 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 ......................…

mac系统内存占用过高怎么办 优化电脑内存的方法系统加速

不少Mac用户都对mac系统内存占用过高非常头痛&#xff0c;不过这是mac在使用过程中一个很常见的问题&#xff0c;它会影响用户的操作体验&#xff0c;导致系统运行速度缓慢&#xff0c;甚至出现明显的卡顿现象。面对mac系统内存占用过高怎么办这个问题&#xff0c;其实很好解决…

C#操作MySQL从入门到精通(11)——对查询数据使用正则表达式过滤

前言 对于之前提到的使用匹配、比较、通配符等过滤方式能解决大部分的项目问题,但是有时候也会遇到一些比较复杂的过滤需求,这时候就需要正则表达式来实现了,正则表达式使用regexp这个关键字来实现。 本次测试的数据库表的内容如下: 1、基本字符匹配(包含某些字符) 匹…

git一次提交多个项目之windows

方案1:【快速】单个/多个项目提交到一个已有地址 步骤: 1,在git仓库,创建新的地址 2,在代码所在文件夹,编辑脚本 2.1,获得所有文件名:编写bat脚本,获得所有文件名称【非必须】; dir *.* /b/s>test.txt 获取所有文件之后,复制对应的文件名; 2.2,编写bat脚…

如何做好电子内窥镜的网络安全管理?

电子内窥镜作为一种常用的医疗器械&#xff0c;其网络安全管理对于保护患者隐私和医疗数据的安全至关重要。以下是一些基本原则和步骤&#xff0c;用于确保电子内窥镜的网络安全&#xff1a; 1. 数据加密 为了防止数据泄露&#xff0c;电子内窥镜在传输患者图像数据时应采取有…

嵌入式软件跳槽求指导?

嵌入式软件行业的跳槽确实需要一些特定的策略和技巧。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 因为这个…

Sleep | 纺锤波-慢波耦合与解决问题的能力:年龄的影响

摘要 本研究考察了衰老如何影响睡眠在巩固新学习的认知策略中的作用。共纳入40名健康年轻人(20-35岁)和30名健康老年人(60-85岁)。参与者接受了河内塔(ToH)任务的训练&#xff0c;然后&#xff0c;每个年龄组的一半参与者被分配到90分钟的午睡条件下&#xff0c;另一半则保持清…