当前位置: 首页 > news >正文

Redis基础系列-哨兵模式

Redis基础系列-哨兵模式

文章目录

  • Redis基础系列-哨兵模式
    • 1. 引言
    • 2. 什么是哨兵模式?
    • 3. 哨兵模式的配置
    • 4. 哨兵模式的启动和验证
      • 4.1 主master宕机,看会出现什么问题
      • 4.2 重启6379主机
    • 5. 哨兵模式的工作原理和选举原理
      • 5.1. SDown主观下线(Subjectively Down)
      • 5.2. ODown客观下线(Objectively Down)
      • 5.3. 选举出领导者哨兵(哨兵中选出兵王)
      • 5.4. 由兵王开始推动故障切换流程并选出一个新的master
        • 5.4.1 步骤1:新主登基(某个Slave被选中成为新的Master)
        • 5.4.2 步骤2:群臣俯首(一朝天子一朝臣,换个码头重新拜)
        • 5.4.3 步骤3:旧主拜服(老master回来也认怂)
        • 5.4.4 总结
    • 6. 总结
    • 7. 参考和感谢

1. 引言

Redis是一种流行的内存数据库,具有快速、灵活和可扩展的特性。然而,在应用程序对数据可用性和可靠性要求更高时,Redis主从复制会遇到一些限制和弊端,主机宕机之后,整个redis服务只能读不能写。为了解决这些问题,Redis引入了哨兵模式。

2. 什么是哨兵模式?

Redis 哨兵模式是一种用于构建高可用性 Redis 集群的解决方案。它通过监控 Redis 实例的状态并自动进行故障转移,提供了客户端重定向机制以确保应用程序可以正常访问 Redis。

其中:

  • 三个哨兵:自动监控和维护集群,不存放数据,只做吹哨人
  • 1主2从:用于读取和存放数据

哨兵模式能干嘛:

  1. 主从监控:监控reids主从是否正常运行
  2. 消息通知:哨兵可以将故障转移的结果发送给客户端
  3. 故障转移:如果Master异常,则会进行主从切换,将其中一个Slave作为新的Master
  4. 配置中心:客户端通过连接哨兵来获得当前Redis服务的主节点地址

3. 哨兵模式的配置

  1. /myredis目录下创建sentinel26379.conf(也可以从redis的解压路径中复制sentinel.conf配置文件来重命名),内容如下:
#服务监听地址,用于客户端连接,默认本机地址
bind 0.0.0.0
#是否已后台daemon方式启动
daemonize yes
#安全保护模式
protected-mode no
#哨兵端口
port 26379
#日志文件路径
logfile "/myredis/sentinel26379.log"
#pid文件路径
pidfile /var/run/redis-sentinel26379.pid
#工作目录
dir /myredis
#设置要监控的master服务器,quorum表示最少有几个哨兵认可客观下线,同意故障迁移的法定票数
sentinel monitor mymaster 192.168.10.110 6379 2
#master设置了密码,连接master服务的密码
sentinel auth-pass mymaster 123456

其他配置(一般不需要配置,默认就可以)

#指定多少毫秒之后,主节点没有应答哨兵,此时哨兵主观上认为主节点下线
sentinel down-after-milliseconds <master-name> <milliseconds>:#表示允许并行同步的slave个数,当Master挂了后,哨兵会选出新的Master,此时,剩余的slave会向新的master发起同步数据
sentinel parallel-syncs <master-name> <nums>:#故障转移的超时时间,进行故障转移时,如果超过设置的毫秒,表示故障转移失败
sentinel failover-timeout <master-name> <milliseconds>:#配置当某一事件发生时所需要执行的脚本
sentinel notification-script <master-name> <script-path> :#客户端重新配置主节点参数脚本
sentinel client-reconfig-script <master-name> <script-path>:
  1. 同样的在/myredis目录下创建sentinel26380.conf内容如下:
#服务监听地址,用于客户端连接,默认本机地址
bind 0.0.0.0
#是否已后台daemon方式启动
daemonize yes
#安全保护模式
protected-mode no
#哨兵端口
port 26380
#日志文件路径
logfile "/myredis/sentinel26380.log"
#pid文件路径
pidfile /var/run/redis-sentinel26380.pid
#工作目录
dir /myredis
#设置要监控的master服务器,quorum表示最少有几个哨兵认可客观下线,同意故障迁移的法定票数
sentinel monitor mymaster 192.168.10.110 6379 2
#master设置了密码,连接master服务的密码
sentinel auth-pass mymaster 123456
  1. 同样的在/myredis目录下创建sentinel26381.conf内容如下:
#服务监听地址,用于客户端连接,默认本机地址
bind 0.0.0.0
#是否已后台daemon方式启动
daemonize yes
#安全保护模式
protected-mode no
#哨兵端口
port 26381
#日志文件路径
logfile "/myredis/sentinel26381.log"
#pid文件路径
pidfile /var/run/redis-sentinel26381.pid
#工作目录
dir /myredis
#设置要监控的master服务器,quorum表示最少有几个哨兵认可客观下线,同意故障迁移的法定票数
sentinel monitor mymaster 192.168.10.110 6379 2
#master设置了密码,连接master服务的密码
sentinel auth-pass mymaster 123456
  1. 一主二从的配置前面已介绍过,就不过多赘述:
    Redis基础系列-主从复制

4. 哨兵模式的启动和验证

  1. 先启动一主二从,并验证主从是否正常
  2. 然后启动三个哨兵
redis-sentinel sentinel26379.conf --sentinel
redis-sentinel sentinel26380.conf --sentinel
redis-sentinel sentinel26381.conf --sentinel

看看启动成功了

我们在瞅瞅日志


4.1 主master宕机,看会出现什么问题

6380从机会出现一段时间不能连接,自动连接之后还是从机

6381从机会出现一段时间不能连接,自动连接之后晋升为主机

我们在看看哨兵配置文件会发生什么变化

上述图片是哨兵26379的配置文件变化,其它两个哨兵的配置文件也是类似变化,这里就不在赘述。

我们再查看一下哨兵26379日志的变化

我们能明显的看到6379的主观下线,选举leader以及主master切换的日志

我们再看一下6380和6381两个从机的配置文件

6380从机明显修改了主master的配置

再看一下6381的配置文件

6381从机明显删除了主master的配置,摇身一变成为主机

其实6379宕机变化

  • 三个哨兵配置文件的变化
  • 2个从机配置文件发生了变化(6379启动之后也能看到发生了变化)

那我们还有一个疑问,就是6379主机master恢复之后,目前这种主从结构会不会发生变化了,我们重新启动6379redis

4.2 重启6379主机

[root@Docker110 myredis]# redis-server redis6379.conf 
[root@Docker110 myredis]# 

然后看看运行情况

居然不能写,再看看它的配置文件

看来重启之后不能恢复原有的主从结构

5. 哨兵模式的工作原理和选举原理

当一个主存配置中的master失效之后,sentinel可以选举出一个新的master,用于自动接替master的工作,主从配置中的其他redis服务器自动指向新的master同步数据。一般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换

5.1. SDown主观下线(Subjectively Down)

SDown(主观不可用)是单个sentinel自己主观上检测到的关于master的状态,从sentinel的角度来看,如果发送了PING心跳,在一定时间内没有收到合法的回复,就达到了SDown的条件

sentinel配置文件中的down-after-milliseconds设置了判断主观下线的时间长度

所谓主观下线(Subjectively Down, 简称 SDOWN)指的是单个Sentinel实例对服务器做出的下线判断,即单个sentinel认为某个服务下线(有可能是接收不到订阅,之间的网络不通等等原因)。
主观下线就是说如果服务器在[sentinel down-after-milliseconds]给定的毫秒数之内没有回应PING命令或者返回一个错误消息, 那么这个Sentinel会主观的(单方面的)认为这个master不可以用了,sentinel down-after-milliseconds <masterName> <timeout>表示master被当前sentinel实例认定为失效的间隔时间,这个配置其实就是进行主观下线的一个依据master在多长时间内一直没有给Sentine返回有效信息,则认定该master主观下线。也就是说如果多久没联系上redis-servevr,认为这个redis-server进入到失效(SDOWN)状态

5.2. ODown客观下线(Objectively Down)

ODown需要一定数量的sentinel,多个哨兵达成一致意见才能认为一个master客观上已经宕机

四个参数含义:masterName是对某个master+slave组合的一个区分标识(一套sentinel可以监听多组master+slave这样的组合)quorum这个参数是进行客观下线的一个依据,法定人数/法定票数意思是至少有quorum个sentinel认为这个master有故障才会对这个master进行下线以及故障转移。因为有的时候,某个sentinel节点可能因为自身网络原因导致无法连接master,而此时master并没有出现故障,所以这就需要多个sentinel都一致认为该master有问题,才可以进行下一步操作,这就保证了公平性和高可用

5.3. 选举出领导者哨兵(哨兵中选出兵王)

当主节点被判断客观下线以后,各个哨兵节点会进行协商,先选举出一个领导者哨兵节点(兵王)并由该领导者节点,也即被选举出的兵王进行failover(故障迁移)

哨兵领导者,也就是兵王是如何选择出来的?Raft算法

监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得:

即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者

上图理解:横向是时间轴,sentinel1向sentinel2、sentinel3发起成为领导者申请,sentinel2和sentinel3之前没有同意过别的sentinel,所以直接同意,故而sentinel得到两票;同理sentinel2向sentinel1和sentinel3发起成为领导者的申请,之前sentinel3同意过sentinel1的申请,所以sentinel只能获得1票;sentinel3向sentinel1和sentinel2发起成为领导者的申请,由于sentinel1和sentinel2都同意过别的sentinel,故而sentinel3只能获得0票

sentinel26379.log

sentinel26380.log

sentinel26381.log

// TODO -odown 和 +odown有啥区别

5.4. 由兵王开始推动故障切换流程并选出一个新的master

5.4.1 步骤1:新主登基(某个Slave被选中成为新的Master)

选出新master的规则,剩余slave节点健康的情况下:

  • redis.conf文件中,优先级slave-priority或者replica-priority最高的从节点(数字越小优先级越高)
  • 复制偏移位置offset最大的从节点// TODO
  • 最小Run ID的从节点(字典顺序,ASCII码) // TODO
5.4.2 步骤2:群臣俯首(一朝天子一朝臣,换个码头重新拜)
  • 执行slaveof no noe命令让选出来的从节点成为新的master,并通过slaveof命令让其他节点成为从节点
  • Sentinel leader会对选举出的master执行slaveof no one操作,将其提升为master节点
  • Sentinel leader向其他slave发送命令,让剩余的slave成为新的master节点的slave
5.4.3 步骤3:旧主拜服(老master回来也认怂)
  • 将之前已下线的老master设置为新选出master的从节点,当老master重新上线后,它会成为新master的从节点
  • Sentinel leader会让原来的master降级为slave并恢复正常工作
5.4.4 总结

上述的 failover操作均由sentinel自己独自完成,完全无需人工干预

6. 总结

Redis哨兵模式使用建议:

  • 哨兵节点的数量应为多个,哨兵本身应该集群,保证高可用
  • 哨兵节点的数量应该为奇数
  • 各个哨兵节点的配置应为一致
  • 如果哨兵节点部署在Docker等容器里面,尤其要注意端口的正确映射
  • 哨兵集群+主从覅u之,并不能保证数据零丢失,故障迁移需要一定的时间

7. 参考和感谢

尚硅谷Redis零基础到进阶,最强redis7教程,阳哥亲自带练

相关文章:

Redis基础系列-哨兵模式

Redis基础系列-哨兵模式 文章目录 Redis基础系列-哨兵模式1. 引言2. 什么是哨兵模式&#xff1f;3. 哨兵模式的配置4. 哨兵模式的启动和验证4.1 主master宕机&#xff0c;看会出现什么问题4.2 重启6379主机 5. 哨兵模式的工作原理和选举原理5.1. SDown主观下线&#xff08;Subj…...

【angular教程240112】09(完) Angular中的数据请求 与 路由

【angular教程240112】09(完) Angular中的数据请求 与 路由 目录标题 一、 Angular 请求数据简介0 使用Angular内置模块HttpClientModule和HttpClientJsonpModule:1 Angular中的GET请求:2 Angular中的POST请求:3 Angular中的JSONP请求:4使用Axios进行数据请求: 二、 详解 Angul…...

go中拷贝文件操作

一. 拷贝文件内容到另一个文件位置 // 拷贝文件内容到另一个文件里面 func copyContent() {filepath1 : "d:/abc.txt"filepath2 : "e:/eee.txt"// 读取内容data, err : os.ReadFile(filepath1) // 使用os.ReadFile函数读取指定路径的文件内容if err ! nil…...

未来气膜体育馆的发展趋势是什么?

未来气膜体育馆的发展趋势是多方面的&#xff0c;以下是其中几个方面的趋势。 起初&#xff0c;随着人们对体育运动的需求不断增加&#xff0c;气膜体育馆的建设和使用将成为一种趋势。气膜体育馆具有灵活性和可移动性的特点&#xff0c;可以快速搭建和拆除&#xff0c;能够适…...

通信扫盲(五)

系列文章目录 1 通信扫盲&#xff08;一&#xff09;&#xff1a; 通信的本质、通信发展史-各代移动通信的多祉技术、5G、6G应用场景/愿景、LTE是什么&#xff1f;3GPP是什么&#xff1f; 链接&#xff1a;通信扫盲&#xff08;一&#xff09; 2 通信扫盲&#xff08;二&…...

nbcio-boot项目的文件上传与回显处理方法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…...

《动手学深度学习》学习笔记 第9章 现代循环神经网络

本系列为《动手学深度学习》学习笔记 书籍链接&#xff1a;动手学深度学习 笔记是从第四章开始&#xff0c;前面三章为基础知识&#xff0c;有需要的可以自己去看看 关于本系列笔记&#xff1a; 书里为了让读者更好的理解&#xff0c;有大篇幅的描述性的文字&#xff0c;内容很…...

「HDLBits题解」Vector100r

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;Vector100r - HDLBits module top_module( input [99:0] in,output [99:0] out );integer i ; always (*) beginfor (i 0 ; i <…...

如何制作专业商业画册,提升品牌形象

​随着市场竞争的日益激烈&#xff0c;商业画册作为展示企业形象和产品特点的重要载体&#xff0c;越来越受到企业的重视。然而&#xff0c;如何制作一份专业、有吸引力的商业画册&#xff0c;提升品牌形象呢&#xff1f; 在制作商业画册之前&#xff0c;首先要明确目标受众。根…...

vim升级和配置

vim升级和配置 1、背景2、环境说明3、操作3.1 升级VIM3.2 配置VIM3.2.1、编辑vimrc文件3.2.2、安装插件 1、背景 日常工作跟linux系统打交道比较多&#xff0c;目前主要用到的是Cenots7和Ubuntu18这两个版本的linux系统&#xff0c;其中Centos7主要是服务器端&#xff0c;Ubun…...

java通过okhttp方式实现https请求的工具类(绕过证书验证)

目录 一、引入依赖包二、okhttp方式实现的https请求工具类2.1、跳过证书配置类2.2、okhttp方式的 https工具类 三、测试类 一、引入依赖包 引入相关依赖包 <!--okhttp依赖包--> <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>…...

mysql定时备份shell脚本和还原

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言数据库备份分类mysqldump命令备份计划1.每日备份&#xff0c;保留30天备份文件2.每月1号备份&#xff0c;保留12个月备份文件 定时调度还原总结 前言 数据库备…...

DevOps搭建(十六)-Jenkins+K8s部署详细步骤

​ 1、整体部署架构图 2、编写脚本 vi pipeline.yml apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metadata:labels:app: pipelinespec:containers:- nam…...

WaitForSingleObject 函数的诸多用途与使用场景总结

目录 1、WaitForSingleObject函数详细说明 2、在线程函数中调用WaitForSingleObject实现Sleep&#xff0c;可立即退出Sleep状态 3、调用WaitForSingleObject函数监测线程或进程是否已经退出 3.1、子进程实时监测主进程是否已经退出&#xff0c;主进程退出了&#xff0c;则子…...

4、Redis高并发分布式锁实战

引言 在分布式系统中&#xff0c;保证数据的一致性和避免竞争条件是至关重要的。分布式锁是一种常用的机制&#xff0c;而Redis作为一款高性能的内存数据库&#xff0c;提供了简单而强大的分布式锁方案。本文将深入探讨如何利用Redis高并发分布式锁来解决分布式系统中的并发控…...

matlab subs 函数计算太慢

来源 计算机器人 transformation matrix 相关内容时&#xff0c;对于关节角度进行离散&#xff0c;循环计算很慢&#xff0c;随着角度划分越来越细&#xff0c;怎么提高速度是一个问题。 最优解决方法 fun_handle matlabFunction(T_t2b_RPY_tmp);T_t2b_RPY_tmp是 transform…...

如何确保网络传输的安全性和稳定性?

随着互联网的普及和数字化时代的到来&#xff0c;网络传输已经成为我们日常生活中不可或缺的一部分。无论是发送邮件、浏览网页、在线支付还是进行视频通话&#xff0c;都需要通过网络进行数据传输。然而&#xff0c;网络传输的安全性和稳定性问题也日益突出&#xff0c;如何确…...

鸿蒙应用开发学习:改进小鱼动画实现按键一直按下时控制小鱼移动和限制小鱼移出屏幕

一、前言 近期我在学习鸿蒙应用开发&#xff0c;跟着B站UP主黑马程序员的视频教程做了一个小鱼动画应用&#xff0c;UP主提供的小鱼动画源代码仅仅实现了移动组件的功能&#xff0c;还存在一些问题&#xff0c;如默认进入页面是竖屏而页面适合横屏显示&#xff1b;真机测试发现…...

紫光展锐5G扬帆出海 | Blade系列勇当拉美5G先锋

5G对拉丁美洲&#xff08;简称“拉美”&#xff09;绝大多数消费者来说还是一个新鲜技术。GSMA报告显示&#xff0c;过去五年&#xff0c;拉美运营商在移动网络方面的资本开支大部分用于部署4G网络。但在5G网络方面拉美也在积极大力投入中&#xff0c;紧跟全球5G发展大潮&#…...

如何设计一个高并发系统?

所谓高并发系统&#xff0c;是指能同时处理大量并发请求&#xff0c;并及时响应&#xff0c;从而保证系统的高性能和高可用 那么我们在设计一个高并发系统时&#xff0c;应该考虑哪些方面呢&#xff1f; 1. 搭建集群 如果你只部署一个应用&#xff0c;只部署一台服务器&…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...