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

Redis: Sentinel工作原理和故障迁移流程

Sentinel 哨兵几个核心概念


1 ) 定时任务

  • Sentinel 它是如何工作的,是如何感知到其他的 Sentinel 节点以及 Master/Slave节点的
  • 就是通过它的一系列定时任务来做到的,它内部有三个定时任务
    • 第一个就是每一秒每个 Sentinel 对其他 Sentinel 和 Redis 节点执行 PING 操作(监控)
      • 这是一个心跳检测是失败判定的一个依据
      • 我给你一个 PING, 你必须在有效时间内给我一个 PONG, 否则我认为你出问题了
    • 第二个就是每2秒每个 Sentinel 通过 Master 节点的 channel 交换信息 (Publish/Subscribe)
      • Redis 它实际上也有发布订阅的这种模式
      • Master主节点会开启这个功能, 通过信道拿到我们节点的交换信息
    • 第三个定时任务就是每 10 秒每个 Sentinel 会对 Master 和 Slave 执行 INFO 命令
      • info命令,下边有CPU的使用率,内存使用情况
      • 包括它服务节点的信息,主从信息集群信息等等
      • info replication 只是 info 下面的一个子集
      • 所以说 info 命令是可以拿到一个完整的REDIS当前环境及节点的一个状态信息的
      • 主要的目的就是要确认主从关系,然后就是及时的发现可用的 Slave 节点
      • 比如现在并发很高,一主两从已经支撑不了了,再添加一个从节点又可以分散一部分流量
      • 并发上来了,我们只需要不停的添加从节点就可以了
      • 我添加了从节点 Sentinel 也要感知到这个从节点
      • 相当于把它添加的这个监控环境里边,它通过 info 命令来完成

2 )主观下线 (Subjectively Down, 简称 SDOWN)

  • Sentinel 的作用就是监控主从环境,发生故障的时候,能及时的做故障转移
  • 重新选取主节点顶上来继续提供服务,这个时候就会有一个问题,怎么识别你就故障了
  • 现在有3个 Sentinel,难道说其中一个认为它故障了就要发起故障转移重新选举吗?
  • 当然不是,它是有一个过程的,先经过主观下线,再到客观下线,客观下线是依据仲裁的参数,满足之后才会标记为客观下线
  • 主观下线,指的是单个 Sentinel 实例对服务器做出的下线判断,即单个 Sentinel 认为某个服务下线,有可能是接收不到订阅,之间的网络不通等等原因
  • 就是说我现在认为你连不上了,我把你标记为主观下线,这个连不上是怎么认定的?
    • 其实就是刚才我们说的那个定时任务,我现在给你 PING, 你给我返回 PONG
    • 之前,我们配置了一个 down-after-milliseconds
    • 如果在这个时间内,你都没有做有效的返回, 我就认为你故障了
    • 我就会把你标记为主观下线
  • 当我把你标记为主观下限之后,我会去找其他的 Sentinel 来确认你是是不是主观下线
  • 也就是说一个 Sentinel 把一个主节点标记为主观下限了
  • 它就会让环境里边其他的 Sentinel 去对它做出判断,确认它是不是真下线
  • 其他的 Sentinel 就开始去跟这个 Master 主节点进行通行,仍然基于 PING, PONG 的机制来检测
  • 当超过其一半数量都认定下线,则满足仲裁的条件,这样就会被标记为客观下线

3 ) 客观下线 (Objectively Down, 简称 ODOWN)

  • 客观下线,是指多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断,互相交流之后,得出的服务器下线判断,然后开启 failover,就是故障迁移

4 ) 仲裁

  • 这个仲裁其实非常简单,就是少数服从多数,只要有一半以上都认为Master下线了,则就认定其下线
  • 当配置文件中的 quorum 选项的值一般设定为 q = s / 2 + 1,s 是服务器总数的意思
  • 只要有一半以上认定主观下线,则就是客观下线,仲裁成功,开启 failover 进行故障迁移

Sentinel 哨兵工作原理

1 )每秒 PING

  • 每个 Sentinel 以每秒一次的频率会向它所知的 Master / Slave 以及其他的 Sentinel 节点
  • 发送一个 PING 命令来判断它是不是可通性的, 还有没有存活

2 ) 有效回复 PING 命令的时间超过配置文件 down-after-milliseconds 选项所指定的值会被定为主观下线

  • 当我 PING 过去,你回复 PONG 的时间是超过的这个时间
  • 或者说在这个有效时间内没有返回,或者说你给我返回的错误
  • 我都认为你是主观下线了

3 )确认主观下线状态

  • 主观下线之后,正在监视这个 Master 的其他 Sentinel
  • 就会每秒一次的去确认这个 Master 是不是真的进入主观下线了

4 ) 满足条件,客观下线

  • 如果足够数量的 Sentinel,在指定的时间范围内确认了 Master确实是进入了主观下线
  • 它会标记为客观下线,被标记为客观下线之后,就会进入投票环节

5 )投票选举主节点,从节点复制数据

  • 这个时候 Master 处于 ODOWN 客观下限状态,就会投票自动选取新的主节点
  • 这个地方选举的时候,它还会去做一些过滤,有一个相关的配置是决定
  • 从节点晋升为主节点的优先级,那个配置项,如果你把它改为零,这个从节点永远不会变为主节点
  • 如果你把它调的很大,它被选为主节点的几率就很大,优先级就很高
  • 它就先去看那个配置项,谁的优先级高,先选谁,优先级相同
  • 继续看下一个判定,下一个判定是 偏移量,哪个偏移量最大则选举哪一个为主节点
  • 如果偏移量相同,再去看 run_id 小的会被晋升为主节点
  • 这里边还会有一系列的操作,把它选定主节点之后
  • 其他的从节点会指向这个新的主节点继续进行数据的复制同步

6 )主节点被标为客观下线时, INFO 的命令触发由10s一次改为1s一次

  • 原来我们的环境复稳定的,我十秒执行一次 info 目的很简单
  • 就是看看有没有新加进来的从节点或者 Sentinel,要把新成员添加到我的监控环境里边
  • 而现在都已经故障了, 发起了故障转移,重新选举了
  • 我需要在最短的时间内把环境稳定下来最好,所以有这个时间的调整
  • 我要快速的把可用的从节点全部都给它收集过来,把这个主从的关系确认下来稳定下来

7 )冲裁失败后的状态恢复

  • 若没有足够数量的 Sentinel 同意 Master进行下线,客观下线的状态会被移除
  • 如果 Master 重新向 Sentinel 的PING命令返回有效回复,Master的主观下限也会被移除

故障转移演示

  • 首先,启动好3台Redis 和 3个 Sentinel
  • 在主节点Master机器上执行 $ SHUTDOWN 命令关机
  • 这时候就会触发Sentinel的仲裁和投票,可以通过查看各个服务器 sentinel.log 日志来看到整个过程
  • 同时,因为主从被修改了,相关机器上的配置文件也会被同步修改为服务当前主从关系的配置
  • 要注意,被修改过的配置文件中,会有ACL安全策略,这个是Redis@6之后的新特性
  • 这个是权限管理相关功能,为了安全来设置的,为不同用户授予不同的数据和操作权限
  • 这个可以自行进行操作来对日志,配置文件的分析

图解自动故障迁移流程

  • 现在的环境是主从的环境,一主两从,然后配了3个 Sentinel 哨兵
  • 经过一次故障迁移之后,102 变成主节点,101 和 103 变成从节点
  • Sentinel哨兵,它内部会有一些定时任务,这个定时任务分为三种
    • 第一种就是每一秒对我们的主从和其他的 Sentinel,发送 PING 命令
      • 这个心跳检测是失败判定的依据
      • 如果对方没有办法在有效的时间内给我返回,我就认为对方出问题了
    • 第二种就是每两秒,每个 Sentinel 会通过 Master Channel 来交换信息
      • 就发布订阅的那个channel信道交换信息
    • 第三种就是每十秒会对 Master/Slave 执行 info 命令
      • 来确认主从关系和及时发现可用的slave节点
  • 一开始,Sentinel 现在监控主节点是由之前在 Sentinel 的配置文件里边的配置
    • 如:sentinel monitor mymaster 192.168.10.102 6379 2
    • 这些什么意思,大家都应该知道
  • 接着往下看,PING 的时候超时,或者返回错误,是哪个配置来决定的呢?
    • 是下面这个 down-after-milliseconds
      # Sentinel认为服务器已经断线所需的毫秒数 默认值是30秒 这里改成10秒 PING PONG 中 返回 PONG 的时间
      sentinel down-after-milliseconds mymaster 10000
      
    • 就是我这个命令令出去之后,你在这个有效时间内返回才是OK的
    • 超出这个时间,我认为你出问题了,要么故障了,要么宕机异常错误了
    • 反正总而言之,我认为你现在不可用了
    • 这里配的是十秒,它是一万毫秒
    • 如果大于十秒,我都没有接收到这个PONG, 没有拿到一个有效的反馈,我认为你出问题了
  • 这个时候只是单个的 Sentinel 认为它出问题了,会把它标记为主观下线
    • 一个Sentinel把它标为主观下线之后,其他的 Sentinel 就要去确定目标是否真的下线
    • 满足 quorum 仲裁值之后,它会被标记为客观下线,之后,目标节点就要开始执行故障迁移
    • 在日志中可以明确看出这个流程,它会发起一个新的选举主节点的流程
  • 但是故障迁移选举主节点这一系列的工作,不是说这三个 Sentinel 都去做
  • 只需要有其中一个来做成这个事情就行了,它是通过 raft 算法来选取一个leader领导者
    • 就是选一个领导者去做故障迁移这件事儿
    • 于是,他们就开始投票,raft算法可以保证在同一时间只会生成一个领导者
    • 也就是说故障迁移,只会在当前环境下存在一个节点去做这件事情
    • 就保证了我们的一致性,不会出乱子
  • 选举出来之后,有一个人他就会去执行故障迁移,执行的过程中
    • 它会先从环境里边找到满足条件的slave
    • 首先看优先级配置,优先级高的会选为主节点
    • 如果出现了多个优先级相同的,再看偏移量
    • 偏移量大的被选为主节点,偏移量相同的,再往下比 run_id 比较小的
    • 最终找到一个合适的slave,然后就要等其他的slave确认完
    • 我们会给他执行一系列的操作
      • 如说 slaveof no one,就是关闭它的复制
      • 修改环境下其他节点的配置,建立新的主存关系
      • 之后,其它的从节点点会把自己的数据都丢掉,然后重新复制它
      • 这个时候,就SYNC发起全量复制新的主节点里边的数据
      • 然后 Sentinel节点 集合在这里做一个更新,又恢复到正常工作,开始监控新的master
  • 后续如果再出现了故障迁移,又是这样的一个流程
    • 就是主观,客观,然后再选举leader
    • 然后再找到合适的 slave 把它改成master
    • 然后确认,然后再去全量复制等等
  • 这就是自动故障迁移的一个流程,关键几点如下
    • 配置文件里 Sentinel monitor 监控的是谁
    • down-after-milliseconds 决定定这个PING和PONG超时的一个时间间隔
    • quorum 就是 仲裁的那个值
    • 还有 fallover-timeout,整个的迁移流程会有个有效时间
      sentinel failover-timeout mymaster 180000
      
    • 在这个有效时间内,迁移还没有完成,直接就把这个工作/进程就终止了
    • 就会重新发起一次迁移,防止卡住和阻塞
    • 这个配置默认是18万毫秒,180秒, 三分钟

相关文章:

Redis: Sentinel工作原理和故障迁移流程

Sentinel 哨兵几个核心概念 1 ) 定时任务 Sentinel 它是如何工作的,是如何感知到其他的 Sentinel 节点以及 Master/Slave节点的就是通过它的一系列定时任务来做到的,它内部有三个定时任务 第一个就是每一秒每个 Sentinel 对其他 Sentinel 和 Redis 节点…...

通信工程学习:什么是IGMP因特网组管理协议

IGMP:因特网组管理协议 IGMP(Internet Group Management Protocol,因特网组管理协议)是TCP/IP协议簇中负责组播成员管理的协议。它主要用于在用户主机和与其直接相连的组播路由器之间建立和维护组播组成员关系。以下是关于IGMP协议…...

高效批量导入多个SQL文件至SQL Server数据库的实用方法

当需要批量导入多个SQL文件到SQL Server数据库时,可以通过以下几种方法来实现: 方法一:使用SQLCMD命令行工具(亲测可用) 准备SQL文件:确保所有的SQL文件都位于同一个文件夹内,并且文件扩展名为…...

【树莓派系列】树莓派wiringPi库详解,官方外设开发

树莓派wiringPi库详解,官方外设开发 文章目录 树莓派wiringPi库详解,官方外设开发一、安装wiringPi库二、wiringPi库API大全1.硬件初始化函数2.通用GPIO控制函数3.时间控制函数4.串口通信串口API串口通信配置多串口通信配置串口自发自收测试串口间通信测…...

前端模块化CommonJs、ESM、AMD总结

前端开发模式进化史 前端工程化正是为了应对这些演化中出现的挑战和需求而发展起来的: 前后端混合:服务端渲染,javascript仅实现交互前后端分离:借助 ajax 实现前后端分离、单页应用(SPA)等新模式模块化开发:npm 管理…...

JavaWeb - 8 - 请求响应 分层解耦

请求响应 请求(HttpServletRequest):获取请求数据 响应(HttpServletResponse):设置响应数据 BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程…...

1G,2G,3G,4G,5G各代通信技术的关键技术,联系和区别

目录 1G2G3G4G5G各代通信技术的联系和区别联系区别 1G 1G的主要特点是无线移动化。关键技术为蜂窝组网,支持频率复用和移动切换,可以实现个人和个人移动状态下不间断的语音通信。 1G通信系统现已关闭,其主要缺点是串好和盗号。 2G 数字化…...

【宽搜】2. leetcode 102 二叉树的层序遍历

题目描述 题目链接&#xff1a;二叉树的层序遍历 根据上一篇文章的模板可以直接写代码&#xff0c;需要改变的就是将N叉树的child改为二叉树的left和right。 代码 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector&…...

Go语言实现长连接并发框架 - 请求分发器

文章目录 前言接口结构体接口实现项目地址最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我们上篇博客实现了任务管理器的功能&#xff0c;接下来这篇博客我们将要实现请求分发模块的开发 接口 trait/dispatcher.go type Dispatcher interface {Start()Dispatch(conn…...

Redis: 集群测试和集群原理

集群测试 1 ) SET/GET 命令 测试 set 和 get 因为其他命令也基本相似&#xff0c;我们在 101 节点上尝试连接 103 $ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.103 -p 6376我们在插入或读取一个 key的时候&#xff0c;会对这个key做一个hash运算&#xff0c…...

问题解决实录 | bash 中 tmux 颜色显示不全

点我进入博客 如下图&#xff0c;tmux 中颜色显示不全: echo $TERM输出的是 screen 但在 bash 里面输出的是 xterm-256 color 在 bash 里面输入&#xff1a; touch ~/.tmux.conf vim ~/.tmux.conf set -g default-terminal "xterm-256color"使之生效 source …...

古典舞在线交流平台:SpringBoot设计与实现详解

摘 要 随着互联网技术的发展&#xff0c;各类网站应运而生&#xff0c;网站具有新颖、展现全面的特点。因此&#xff0c;为了满足用户古典舞在线交流的需求&#xff0c;特开发了本古典舞在线交流平台。 本古典舞在线交流平台应用Java技术&#xff0c;MYSQL数据库存储数据&#…...

五子棋双人对战项目(6)——对战模块(解读代码)

目录 一、约定前后端交互接口的参数 1、房间准备就绪 &#xff08;1&#xff09;配置 websocket 连接路径 &#xff08;2&#xff09;构造 游戏就绪 的 响应对象 2、“落子” 的请求和响应 &#xff08;1&#xff09;“落子” 请求对象 &#xff08;2&#xff09;“落子…...

查缺补漏----I/O中断处理过程

中断优先级包括响应优先级和处理优先级&#xff0c;响应优先级由硬件线路或查询程序的查询顺序决定&#xff0c;不可动态改变。处理优先级可利用中断屏蔽技术动态调整&#xff0c;以实现多重中断。下面来看他们如何运用在中断处理过程中&#xff1a; 中断控制器位于CPU和外设之…...

Java API接口开发规范

文章目录 一、命名规范1.1 接口命名1.2 变量命名 二、接收参数规范2.1 请求体&#xff08;Body&#xff09;2.2 查询参数&#xff08;Query Parameters&#xff09; 三、参数检验四、接收方式规范五、异常类处理六、统一返回格式的定义七、API接口的幂等性&#xff08;Idempote…...

Go语言实现长连接并发框架 - 任务管理器

文章目录 前言接口结构体接口实现项目地址最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我们上篇博客实现了路由分组的功能&#xff0c;接下来这篇博客我们将要实现任务管理模块 接口 trait/task_mgr.go type TaskMgr interface {RouterGroupStart()StartWorker(tas…...

【大数据】深入解析分布式数据库:架构、技术与未来

目录 1. 分布式数据库的定义2. 架构类型2.1 主从架构2.2 同步与异步复制2.3 分片架构 3. 技术实现3.1 一致性模型3.2 CAP理论3.3 数据存储引擎 4. 应用场景5. 选择分布式数据库的因素5.1 数据一致性需求5.2 读写负载5.3 成本5.4 技术栈兼容性 6. 未来发展趋势总结 分布式数据库…...

uniapp框架中实现文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间

前言 uni-file-picker是uniapp中的一个文件选择器组件,用于选择本地文件并返回选择的文件路径或文件信息。该组件支持选择单个文件或多个文件,可以设置文件的类型、大小限制,并且可以进行文件预览。 提示:以下是本篇文章正文内容,下面案例可供参考 uni-file-picker组件具…...

GEE教程:NASA/GRACE/MASS_GRIDS/LAND数据的查看不同时期液态水数据的变化情况

目录 简介 NASA/GRACE/MASS_GRIDS/LAND 函数 first() Arguments: Returns: Image 代码 结果 简介 利用NASA/GRACE/MASS_GRIDS/LAND数据的查看不同时期液态水数据的变化情况。 NASA/GRACE/MASS_GRIDS/LAND NASA/GRACE/MASS_GRIDS/LAND数据是由NASA的重力恒星MASS数据…...

世邦通信股份有限公司IP网络对讲广播系统RCE

漏洞描述 SPON世邦IP网络广播系统采用的IPAudio™技术, 将音频信号以数据包形式在局域网和广域网上进行传送&#xff0c;是一套纯数字传输的双向音频扩声系统。传统广播系统存在的音质不佳&#xff0c;传输距离有限&#xff0c;缺乏互动等问题。该系统设备使用简便&#xff0c…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...