Redis设计与实现---Sentinel

2023-10-28

Sentinel

Redis的高可用性解决方案:由一个或多个Sentinel实例组成的系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

                                        

对于每个被Sentinel监视的主服务器来说,Sentinel会创建两个连向主服务器的异步网络连接:

  • 命令连接:用于向主服务器发送命令,并接收命令回复
  • 订阅连接:用于订阅主服务器的_sentinel_:hello频道

获取主服务器信息

Sentinel默认会以每十秒一次的频率,通过命令连接向被监视的主服务器发送Info命令,获取到主服务器的当前信息。

  • 主服务器本身的信息,包括run_id以及服务器角色
  • 主服务器属下所有从服务器的信息,IP地址和端口号。根据这些Sentinel可以自动发现从服务器。

获取从服务器信息

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

创建命令连接之后,会以每十秒一次的频率通过命令连接向从服务器发送INFO命令。获取到以下信息,更新实例结构

  • 从服务器运行ID run_id
  • 从服务器角色role
  • 主服务器IP地址以及端口号
  • 主服务器连接状态master_link_status
  • 从服务器优先级slave_priority
  • 从服务器的复制偏移量slave_repl_offset

向主从服务器发送信息

默认情况下,Sentinel会以每两秒一次的频率,通过命令连接向所有被监视的主服务器和从服务器发送命令。

PUBLISH _sentinel_:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"

接收来自主从服务器的频道消息

当sentinel与主从服务器建立起订阅连接之后,就会通过订阅连接,向服务器发送命令。Sentinel对_sentinel_:hello频道的订阅会一直持续到与服务器的断开为止。

                                            

通过这种机制,Sentinel为主服务器创建的实例结构中的sentinels字典保存了所有同样监视这个主服务器的其他Sentinel资料

创建连向其他Sentinel的命令连接

当Sentinel通过频道信息发现一个新的Sentinel时,不仅会为新Sentinel在sentinels字典中创建相应的实例接哦股,还会创建一个连向新Sentinel的命令连接,而新Sentinel也同样会创建连向这个Sentinel的命令连接。(只会创建命令连接,不创建订阅连接。订阅连接是为了通过频道信息发现未知的新Sentinel)

                                                    

检测主观下线

默认情况下,Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他Sentinel在内)发送PING命令。并通过实例返回的PING命令回复判断实例是否在线。

  • 有效回复:实例返回+PONG、-LOADING、-MASTERDOWN三种回复的其中一种
  • 无效回复:除上面三个回复之外的其他回复,或者指定时限内没有返回任何回复。

Sentinel配置文件中down-after-milliseconds指定了判断实例进入主观下线所需的时间长度。如果一个实例在down-after-milliseconds毫秒内,连续返回无效回复。Sentinel会修改这个实例所对应的实例结构,flags属性中打开SRI_S_DOWN表示,以此表示该实例进入主观下线状态。

                                                 

注意:

  • 设置down-after-milliseconds的标准,是针对所有实例的,包括主服务器、从服务器、Sentinel
  • 监视同一个主服务器的各个Sentinel来说,设置的down-after-milliseconds值不同,判断主观下线的标准也就不一样。

检查客观下线状态

当Sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线了,它会向同样监视这一主服务器的其他Sentinel进行询问。当接收到足够数量的已下线(可以是主观下线或者客观下线,为啥还有客观下线?因为每个Sentinel的配置可能不同)判断之后,会将从服务器判定为客观下线,并对主服务器执行故障转移操作

发送命令

SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>

回复命令

接收回复命令

根据其他Sentinel的命令回复,统计其他Sentinel同意主服务器已下线的数量,当达到配置(quorum参数配置)指定的判断客观下线所需的数量时,将主服务器实例结构flags属性的SRI_O_DOWN标识打开,表示主服务器已经进入客观下线状态。

选举领头Sentinel

  • 监视同一个主服务器的多个在线Sentinel中任意一个都有可能成为领头Sentinel
  • 每次进行选举之后,所有Sentinel配置纪元都会自增一次
  • 在一个配置纪元里,所有Sentinel都有一次设置局部领头Sentinel的机会,一旦设置成功,在这个配置纪元里面就不能更改
  • 每个发现主服务器进入客观下线的Sentinel都会要求其他Sentinel将自己设为局部领头Sentinel
  • 当一个Sentinel(源)向另一个Sentinel(目标)发送SENTINEL命令,命令中runid参数不是*符号,而是源Sentinel运行ID时,表示源Sentinel要求目标Sentinel将源Sentinel设置为局部领头Sentinel
  • Sentinel设置局部领头Sentinel的规则是先到先得,后接收的请求都会被拒绝
  • 目标Sentinel的接收到SENTINEL命令的回复,leader_runid和leader_epoch记录了目标Sentinel的局部领头Sentinel的运行ID和配置纪元
  • 某个Sentinel被半数以上的Sentinel设置为局部领头Sentinel,那么这个Sentinel成为领头Sentinel
  • 如果给定时限内,没有选举成功。那么将在一段时间之后再次进行选举,直到选出为止。

故障转移

选出新的主服务器

  1. 删除所有处于下线或者断线状态的从服务器
  2. 删除列表中所有最近五秒内没有回复过领头Sentinel的INFO命令的从服务器
  3. 删除所有与已下线主服务连接断开超过down-after-milliseconds*10毫秒的从服务器。保留保存数据比较新的服务器
  4. 根据从服务器的优先级
  5. 根据从服务器的复制偏移量
  6. 根据RunId,选择runid最小的从服务器
  7. 领头Sentinel向选中服务器发送SLAVOF no one 命令
  8. 通过Info命令确认从服务器已经升级为主服务器

            

修改从服务器的复制目标

领头Sentinel向已下线主服务器的从服务器发送SLAVEOF命令

将旧主服务器变为从服务器

当下线主服务器重新上线,发送SLAVEOF命令,让它成为从服务器。

                                   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis设计与实现---Sentinel 的相关文章

  • 有没有办法在 Redis 和关系数据库中使用带有 @RedisHash 的实体?

    我正在使用Spring引导 为了将我的实体保存在关系数据库上 我配置了一个数据源和我的域类 例如 Entity Table schema schema name name tb name public class table name ex
  • StackExchange.Redis 和 StackExchange.Redis.StrongName 之间有什么区别?

    当我关注Azure时文档 http azure microsoft com en us documentation articles cache dotnet how to use azure redis cache 关于如何在Azure
  • 如何在redis中创建自己的数据库?

    There are 0 to 15 databases in redis 我想使用 redis cli 创建自己的数据库 有什么命令可以实现吗 Redis 数据库并不等同于 MySQL 等 DBMS 中的数据库名称 这是一种为键创建隔离和命
  • socket.io redis 和内存泄漏

    我的socket io版本是 电子邮件受保护 cdn cgi l email protection and 电子邮件受保护 cdn cgi l email protection 我在 Windows 上 在某些地方 我看到问题已得到解决 我
  • connect-redis - 如何保护会话对象免受竞争条件影响

    我使用 nodejs 和 connect redis 来存储会话数据 我将用户数据保存在会话中 并在会话生命周期中使用它 我注意到两个更改会话数据的请求之间可能存在竞争条件 我尝试过使用 redis lock 来锁定会话 但这对我来说有点问
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • 为什么Redis中不建议使用KEYS?

    在Redis中 建议不要使用按键命令 https redis io commands KEYS 为什么会这样呢 是因为它的时间复杂度是 O N 吗 或者是别的什么原因 我做了下面的实验来证明KEYS命令有多么危险 当带有 KEYS 的一个命
  • 如果另一个键中的计数器低于零,则从集合中原子删除一个项目?

    雷迪斯2 0 3 在我的 Redis DB 中 我有一组项目 每个项目都有一个与其关联的计数器 MULTI SADD items set foo INCRBY items foo 10000 EXEC 新项目会以随机间隔添加到集合中 当用户
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • Spring Data Redis JedisConnectionException:流意外结束

    雷迪斯3 0 5Spring数据Redis 1 3 6绝地武士2 6 3 我们的 Web 应用程序通过 pub sub 从 Redis 接收数据 还以键 值对的形式在 Redis 上执行数据读 写 读 写发生在监听线程 独立监控线程和htt
  • 如何批量删除Redis中数十万个带有特殊字符的key

    我们有一个包含数十万个 Redis 键的列表 其中包含各种特殊字符 我们希望批量删除它们 对于这个问题上的类似问题 有一些很好的答案 如何使用 Redis 自动删除与模式匹配的键 https stackoverflow com questi
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客

随机推荐

  • elasticsearch的入门使用01

    目录 一 索引库操作 1 mapping映射属性 2 索引库的CRUD 2 1 创建索引库和映射 2 2 查询索引库 2 3 修改索引库 2 4 删除索引库 二 文档操作 1 新增文档 2 查询文档 3 删除文档 4 修改文档 4 1 全量
  • 微信小程序组建监听observers

    一 作用 用于监听和响应任何属性和数据字段的变化 二 限制 1 小程序基础库2 6 1开始支持 2 只能在自定义组建中使用 再页面中无法使用 三 使用 1 自定义组件的properties中的数据属性 Component 组件的属性列表 d
  • vue中使用element-ui表格table组件错行出现场景和解决方案

    在项目开发中表格错行的问题经常出现 现在整理如下 希望共同学习进步 1 element ui表格table表格内容错行 1 情况一 表格中有el tooltip时候 数据过长的时候hover 往上滑动会出现错行 解决方案 固定高度或者给出
  • 二叉树实验报告

    实验报告 实验题目 二叉树 实验目的 1 熟悉二叉树的结点类型和二叉树的基本操作 2 掌握二叉树的前序 中序和后序遍历的算法 3 加深对二叉树的理解 逐步培养解决实际问题的编程能力 基本要求 1 编写程序bitree cpp实现ADTBiT
  • java 基础重学(三)-源码阅读

    1 String 1 String定义为 final 这说明String不可继承 再看下面 String类的主力成员字段value是个char 数组 而且是用final修饰的 final修饰的字段创建以后就不可改变 是线程安全的 publi
  • python爬取软件内数据_各种数据爬取工具爬虫合集整理

    却道天凉好个秋 不用编程敲代码的爬取数据的工具合集 简单上手易用的爬虫脚本工具软件汇总 1 工具软件类 Microsoft Excel excel也可以爬一些规整的表格数据等 没想到吧 八爪鱼 一款可视化免编程的网页采集软件 可以从不同网站
  • osgexp安装与使用

    osg系列文章目录 文章目录 osg系列文章目录 前言 一 下载osgexp和3d max 二 osgexp安装 三 编译OSGExp 参考 前言 3ds max文件导出osg或者ive格式 一 下载osgexp和3d max 1 首先下载
  • 列举ADO.NET在操作数据库时,常用的对象及作用。

    connection 连接对象 用于对数据库的连接操作 参数是连接字符串 command 命令对象 用于执行对数据库的操作 参数是连接字符串或存储过程 也必须传入连接对象实例 SqlDataReader 数据读取对象 用于读取操作 Read
  • 【BP时序预测】基于BP神经网络的时间序列预测附matlab完整代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 基于BP神经网络的时间序列预测是一种常用的预测方法 它可以通过训练神经网络模型来学习
  • Ubuntu 18.04安装RTX2080Ti显卡驱动

    Ubuntu 18 04 2080Ti安装显卡驱动 PPA仓库安装 网上的方法太多了 尝试了几种各种失败 这里记录一种本人电脑有效的方法 有的电脑需要先卸载Ubuntu 自带的驱动 sudo add apt repository ppa g
  • unity 获取鼠标停留处UI

    修改新华社项目 需要为鼠标停留加个标示 暂定为旋转UI 的fillAmount 期间需要获得UI名字 因为名字太多了 个别环影响 所以找到了这个工具方法
  • 如何在你的windows系统电脑里面设置个人私密空间

    1 前几天我在网上搜了一下windows系统的垃圾清理软件看看哪个好用 2 诶 还别说 还真的找到了一个好用的 他就是 完美卸载 最麻烦就是这些杀毒 清理类的软件 所以我下载了个不需要安装的绿色版 3 我要介绍的就是里面的 数据保险箱 界面
  • 利用SCCM进行横向移动

    01SCCM介绍 SCCM全名为System Center Configuration Manager 从版本1910开始 微软官方将其从Microsoft System Center产品移除 重新命名为Microsoft Endpoint
  • 9种基本数据类型

    9种基本数据类型以及封装类 基本类型 大小 默认值 封装类 byte 1 byte 0 Byte short 2 short 0 Short int 4 0 Int Long 8 0L Long float 4 0 0f Float dou
  • 跳过交货单ATP CHECK的方法

    物料启用ATP CHECK会影响到交货 对于那些启用了ATP CHECK而又没有做合理规划的系统 想要搞清楚ATP是如何计算的 我只能说呵呵 你会发现批次拆分 过账的BAPI会有莫名其妙的 报错 搞不清楚库存里明明有东西为什么还不让交货 这
  • 【深度学习】数据集打标签:生成train.txt和val.txt

    当我们在Github上下载一篇论文的代码后 我们如何在自己的数据集上进行复现呢 准备自己的数据集 这是在百度爬的十分类的服装数据集 其中train文件夹下每类大概300张 val文件夹下每类大概100张 总共在4000张左右 设置目录 我们
  • mysql二进制文件下载教程_mysql 二进制文件增量备份

    1 首先在my cnf下添加二进制文件路径 windows下文件名称为my ini 在 mysqld 下添加 log bin mysql bin 2 centos下默认安装mysql 5 6 数据默认文件夹下为 var lib mysql
  • (新手向)在matlab中运用SMOTE和前馈神经网络对wilt(枯萎)数据集进行机器学习

    目录 一 概述 二 数据集描述 三 方法 数据预处理 SMOTE算法 Feed forward网络 四 结果 后记 2021年5月 一 概述 近日 有位同学因为搞不懂matlab中的神经网络来问我怎么做 我说你把数据集发来给我看看 我稍微一
  • apt安装包报错解决办法:下列软件包有未满足的依赖关系,依赖。。。但是。。。正要被安装

    apt安装包报错解决办法 下列软件包有未满足的依赖关系 依赖 但是 正要被安装 文章目录 apt安装包报错解决办法 下列软件包有未满足的依赖关系 依赖 但是 正要被安装 几种可能的情况 1 镜像源版本代码的问题 1 查看版本代码 2 修改镜
  • Redis设计与实现---Sentinel

    Sentinel Redis的高可用性解决方案 由一个或多个Sentinel实例组成的系统可以监视任意多个主服务器 以及这些主服务器属下的所有从服务器 并在被监视的主服务器进入下线状态时 自动将下线主服务器属下的某个从服务器升级为新的主服务