Redis Sentinel概述
mhr18 2024-12-01 09:22 22 浏览 0 评论
Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。
它的主要功能有以下几点:
- 不时地监控redis是否按照预期良好地运行;
- 如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);
- 能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。
Slave选举与优先级
当一个Sentinel准备好了要进行failover,并且收到了其他Sentinel的授权,那么就需要选举出一个合适的slave来作为新的master。 slave的选举主要会评估slave的以下几个方面:
- 与master断开连接的次数
- slave的优先级
- 数据复制的下标(用来评估slave当前拥有多少master的数据)
- 进程ID
如果一个slave与master失去联系超过10次,并且每次都超过了配置的最大失联时间(down-after-milliseconds option),并且,如果Sentinel在进行failover时发现slave失联,那么这个slave就会被Sentinel认为不适合用来做新master的。
更严格的定义是,如果一个slave持续断开连接的时间超过 (down-after-milliseconds *10) + milliseconds_since_master_is_in_SDOWN_state 就会被认为失去选举资格。 符合上述条件的slave才会被列入master候选人列表,并根据以下顺序来进行排序:
- Sentinel首先会根据slave的优先级来进行排序,优先级越小排名越靠前
- 如果优先级相同,则查看复制的下标,哪个从master接收的复制数据多,哪个就靠前
- 如果优先级和下标都相同,就选择进程ID较小的那个。
一个redis无论是master还是slave,都必须在配置中指定一个slave优先级,master也是可能通过failover变成slave。 如果一个Redis的slave优先级配置为0,那么它将永远不会被选举为master,但是它仍然会从master那里复制数据。
Sentinel和Redis身份认证
当master配置为需要密码才能连接时,客户端和slave在连接时都需要提供密码。 master通过requirepass设置自身的密码,不提供密码无法连接到这个master。 slave通过masterauth来设置访问master时的密码。 当使用了Sentinel时,由于一个master可能会变成一个slave,一个slave也可能会变成master,所以需要同时设置上述两个配置项。
Sentinel “仲裁会”
当一个master被Sentinel集群监控时,需要为其指定一个参数,这个参数指定了当需要判决master为不可用,并且进行failover时所需要的Sentinel数量——票数。 当failover主备切换真正被触发后,failover并不会马上进行,还需要Sentinel中的大多数Sentinel授权后才可进行failover。 当ODOWN时,failover被触发,failover一旦被触发,尝试去进行failover的Sentinel会去获得“大多数” Sentinel的授权。比如:集群中有5个Sentinel,票数被设置为2,当2个Sentinel认为一个master已经不可用了,将会触发failover,但是,进行failover的那个Sentinel必须先获得至少3个Sentinel的授权才可以实行failover。 如果票数被设置成5,要达到ODOWN状态,必须所有5个Sentinel都主观认为不可用,要进行failover,那么得获得所有5个Sentinel的授权。
配置版本号
当一个Sentinel被授权后,它将会获得当掉的master的一份最新配置版本号,当failover执行结束以后,这个版本号将会被用于最新的配置。因为大多数Sentinel都已经知道改版本号已经被要执行failover的Sentinel拿走了,所以其他的Sentinel都不能再去使用这个版本号。意味着,每次failover都会附带有一个独一无二的版本号。 而Sentinel集群都遵守一个规则:如果SentinelA推荐SentinelB去执行failover,A会等待一段时间后自行再去对同一个master执行failover,这个等待的时间通过failover-timeout配置项去配置的。Sentinel集群中的Sentinel不会在同一时刻并发去failover同一个master,第一个进行failover的Sentinel如果失败了,另外一个将会在一定时间内重新进行failover。
- Redis Sentinel保证了活跃性:如果大多数Sentinel能够互相通信,最终将会有一个被授权去进行failover。
- Redis Sentinel保证了安全性:每个试图去failover同一个master的Sentinel都会得到一个独一无二的版本号。
- 一个能够互相通信的Sentinel集群最终会采用版本号最高且相同的配置。
SDOWN和ODOWN细节
SDOWN:主观不可用;ODOWN:客观不可用。 SDOWN是Sentinel自己主观上监测到的关于master的状态,ODOWN需要一定数量的Sentinel达成一致意见才能认为一个master客观上已经当掉。各个Sentinel之间通过命令:sentinel is_master_down_by_addr来获得其他Sentinel对master的监测结果。 从SDOWN切换到ODOWN不需要任何一致性算法,只需要一个gossip协议:如果一个Sentinel收到了足够多的Sentinel发来消息告诉它某个master已经down掉了,SDOWN状态就会变成ODOWN。如果之后master可用了,这个状态就会相应的被清理掉。 真正进行failover需要一个授权的过程,但是所有的failover都开始于一个ODOWN状态。 ODOWN状态只适用于master,对于不是master的Redis节点Sentinel之间不需要任何协商,slaves和Sentinel不会有ODOWN状态。
Sentinel命令
- PING sentinel回复 PONG。
- sentinel masters 显示被监控的所有master以及它们的状态。
- Sentinel master <master name> 显示指定master的信息和状态。
- Sentinel slaves <master name> 显示指定master的所有slaves以及它们的状态。
- Sentinel get-master-addr-by-name <master name> 返回指定master的IP和端口,如果正在进行failover或者已经failover完成,将会显示被提升为master的slave的IP和端口。
- Sentinel reset <parttern> 重置名字匹配该正则表达式的所有的master的状态信息,清除其之前的状态信息,以及slaves信息。
- Sentinel failover <master name> 强制Sentinel执行failover,并且不需要得到其他Sentinel的同意。但是,failover后会将最新的配置发送给其他Sentinel。
增加或删除Sentinel
添加Sentinel简单,只需要监控到某个Master上,然后新增加的Sentinel就能获得其他Sentinel信息以及Master的所有slaves。 删除一个Sentinel比较复杂,因为Sentinel永远不会删除一个已经存在过的Sentinel,即使已经与集群失去联系很久了。 删除Sentinel应遵循以下步骤:
- 停止所要删除的Sentinel;
- 发送一个Sentinel reset * 命令给所有其他的Sentinel实例,如果想要重置指定master上的Sentinel,只需要把*号改为特定的名字。注意,需要一个接一个发,每次发送间隔不低于30秒。
- 检查所有Sentinel是否都由一致的当前Sentinel数——Sentinel Master mastername
Redis sentinel集群中实例的增加、删除操作,可参见我之前发布的文章:Redis主从高可用及哨兵集群的实例增删实践
相关推荐
- Spring Boot 分布式事务实现简单得超乎想象
-
环境:SpringBoot2.7.18+Atomikos4.x+MySQL5.71.简介关于什么是分布式事务,本文不做介绍。有需要了解的自行查找相关的资料。本篇文章将基于SpringBoot...
- Qt编写可视化大屏电子看板系统15-曲线面积图
-
##一、前言曲线面积图其实就是在曲线图上增加了颜色填充,单纯的曲线可能就只有线条以及数据点,面积图则需要从坐标轴的左下角和右下角联合曲线形成完整的封闭区域路径,然后对这个路径进行颜色填充,为了更美观...
- Doris大数据AI可视化管理工具SelectDB Studio重磅发布!
-
一、初识SelectDBStudioSelectDBStudio是专为ApacheDoris湖仓一体典型场景实战及其兼容数据库量身打造的GUI工具,简化数据开发与管理。二、Select...
- RAD Studio 、Delphi或C++Builder设计代码编译上线缩短开发时间
-
#春日生活打卡季#本月,Embarcadero宣布RADStudio12.3Athens以及Delphi12.3和C++Builder12.3,提供下载。RADStudio12.3A...
- Mybatis Plus框架学习指南-第三节内容
-
自动填充字段基本概念MyBatis-Plus提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。原理自动填充功能通过实现com.baomidou.myba...
- 「数据库」Sysbench 数据库压力测试工具
-
sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以...
- 如何选择适合公司的ERP(选erp系统的经验之谈)
-
很多中小公司想搞ERP,但不得要领。上ERP的目的都是歪的,如提高效率,减少人员,堵住财务漏洞等等。真正用ERP的目的是借机提升企业管理能力,找出管理上的问题并解决,使企业管理更规范以及标准化。上ER...
- Manus放开注册,但Flowith才是Agent领域真正的yyds
-
大家好,我是运营黑客。前天,AIAgent领域的当红炸子鸡—Manus宣布全面放开注册,终于,不需要邀请码就能体验了。于是,赶紧找了个小号去确认一下。然后,额……就被墙在了外面。官方解释:中文版...
- 歌浓酒庄总酿酒师:我们有最好的葡萄园和最棒的酿酒师
-
中新网1月23日电1月18日,张裕董事长周洪江及总经理孙健一行在澳大利亚阿德莱德,完成了歌浓酒庄股权交割签约仪式,这也意味着张裕全球布局基本成型。歌浓:澳大利亚年度最佳酒庄据悉,此次张裕收购的...
- 软件测试进阶之自动化测试——python+appium实例
-
扼要:1、了解python+appium进行APP的自动化测试实例;2、能根据实例进行实训操作;本课程主要讲述用python+appium对APP进行UI自动化测试的例子。appium支持Androi...
- 为什么说Python是最伟大的语言?看图就知道了
-
来源:麦叔编程作者:麦叔测试一下你的分析能力,直接上图,自己判断一下为什么Python是最好的语言?1.有图有真相Java之父-JamesGoshlingC++之父-BjarneStrou...
- 如何在Eclipse中配置Python开发环境?
-
Eclipse是著名的跨平台集成开发环境(IDE),最初主要用来Java语言开发。但是我们通过安装不同的插件Eclipse可以支持不同的计算机语言。比如说,我们可以通过安装PyDev插件,使Eclip...
- 联合国岗位上新啦(联合国的岗位)
-
联合国人权事务高级专员办事处PostingTitleIntern-HumanRightsDutyStationBANGKOKDeadlineOct7,2025CategoryandL...
- 一周安全漫谈丨工信部:拟定超1亿条一般数据泄露属后果严重情节
-
工信部:拟定超1亿条一般数据泄露属后果严重情节11月23日,工信部官网公布《工业和信息化领域数据安全行政处罚裁量指引(试行)(征求意见稿)》。《裁量指引》征求意见稿明确了行政处罚由违法行为发生地管辖、...
- oracle列转行以及C#执行语句时报错问题
-
oracle列转行的关键字:UNPIVOT,经常查到的怎么样转一列,多列怎么转呢,直接上代码(sshwomeyourcode):SELECTsee_no,diag_no,diag_code,...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- 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)