您当前的位置:首页 > 电脑百科 > 数据库 > Redis

Redis Sentinel主从高可用方案简析

时间:2019-12-06 10:07:08  来源:  作者:

一、Sentinel介绍

Sentinel是redis的高可用性(HA)解决方案: 由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

二、Sentinel的主从原理

Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

 

Redis Sentinel主从高可用方案简析

 

 

假设这时s1下线,s2、 s3、 s4停止对s1的复制,sentinel系统会察觉到s1下线;s1下线时长超过用户设定的下线时长限制,sentinel就会开始故障转移操作;

 

Redis Sentinel主从高可用方案简析

 

 

1、sentinel系统会挑选s1下的从服务器,并将它设置为新的主服务器(master);

  • 如何选出新的master?

一、使用如下条件筛选备选node:

1)、删除列表中处于下线或者断线状态的服务器【S_DOWN,O_DOWN,DISCONNECTED】,这样可以保证列表中剩余的服务器都是正常在线的。

2)、删除列表中最近5秒内没有回复领头sentinel的INFO命令的服务器,保证列表中剩余的服务器都是最近成功进行通信的。

3)、删除列表中与原master服务器断开超过down-after-milliseconds*10毫秒的从服务器,保证剩余的服务器没有过早跟主服务器断开连接的。或者说是剩下的从服务器保存的数据是最新的。

4)、Slave priority不等于0(这个是在配置文件中指定,默认配置为100)。

二、从备选node中,按照如下顺序选择新的master

1)、选出优先级比较高的服务器;

2)、较大的replication offset(每个slave在与master同步后offset自动增加);

3)、较小的runid(每个redis实例,都会有一个runid,通常是一个40位的随机字符串,在redis启动时设置,重复概率非常小)

4)、如果以上条件都不足以区别出唯一的节点,则会看哪个slave节点处理之前master发送的command多,就选谁。


2、sentinel会给s1下的其他服务器,发送新的复制指令,让他们follow新的主服务器;当所有服务器都开始follow新的主服务器,故障转移成功;

 

Redis Sentinel主从高可用方案简析

 

3、sentinel也会配置s1也follow新的主服务器,当s1重新上线时,s1直接follow新主服务器;

 

Redis Sentinel主从高可用方案简析

 

三、主观下线和客观下线

redis sentinel关于被监控的redis实例出现不响应的判断,内部有两种不同的概念:主观下线和客观下线

主观下线(SDOWN):

当只有单个sentinel实例对redis实例做出无响应的判断,此时进入主观判断,不会触发自动故障转移等操作。

一个服务器必须在 master-down-after-milliseconds 毫秒内, 一直返回无效回复才会被 Sentinel 标记为主观下线。并在主服务器实例的flags属性中打开【SRI_S_DOWN】标识.

不同的sentinel节点,对主观下线的判断时长可以不一样,主要看自己的节点配置。

客观下线(ODOWN) :

多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。 (一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线)如果达到配置要求的数量(sentinel的启动配置参数)反馈,则可以标识为客观下线。flags标识为【SRI_O_DOWN】

从主观下线状态切换到客观下线状态并没有使用严格的法定人数算法(strong quorum algorithm), 而是使用了流言协议: 如果 Sentinel 在给定的时间范围内, 从其他 Sentinel 那里接收到了足够数量的主服务器下线报告, 那么 Sentinel 就会将主服务器的状态从主观下线改变为客观下线。 如果之后其他 Sentinel 不再报告主服务器已下线, 那么客观下线状态就会被移除。

客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器Slave或者其他 Sentinel 永远不会达到客观下线条件。

客观下线状态的判断条件

sentinel monitor master 127.0.0.1 6379 2 那么有两个sentinel认为主服务器已经下线状态,当前的sentinel就可以认为主服务器客观下线了。

不同的sentinel判断客观下线的条件可能不同

1、sentinel monitor master 127.0.0.1 6379 2 两个sentinel认为主服务器已经下线状态,当前的sentinel就可以认为主服务器客观下线了。

2、sentinel monitor master 127.0.0.1 6379 5 两个sentinel认为主服务器已经下线状态,并不会将主服务器客观下线,只有5个sentinel认为主服务器已经下线了,当前的sentinel才可以认为主服务器客观下线了。

四、选取领头的sentinel

当sentinel发现主库客观下线时候会进行【领头sentinel】选举进行故障恢复,其选举算法采用Raft算法,其设计思想类似与zookpeer的选举机制的zab比较类似,所有在线的sentinel都可以参与选举,都有机会被选为领头的sentinel。选举过程大体如下:

1、 发现主库客观下线的哨兵节点(这里称为A)向每个哨兵节点发送命令【SENTINEL is-master-down-by-addr】,并且命令中包含自己的运行ID(runid),要求对方选举自己为领头哨兵(leader);

2、 如果目标哨兵没有选举过其他人,则同意将A选举为领头哨兵;回复一条命令,回复中的leader_runid参数和leader_epoch参数,分别记录了领头sentinel的运行ID和配置纪元;

3、 如果A发现有超过半数且超过quorum参数值的哨兵节点同意选自己成为领头哨兵,则A哨兵成功选举为领头哨兵。

4、 Sentinel设置局部领头Sentinel的规则是先到先得,最先向目标sentinel发送设置的源sentinel将成为领头sentinel,而之后接受到的所有设置请求会被拒绝;

5、当有多个哨兵节点同时参与领头哨兵选举时,出现没有任何节点当选可能,此时每个参选节点等待一个随机时间进行下一轮选举,直到选出领头哨兵。



Tags:Sentinel   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制单位时间内接口访问次数;或者按照某种规...【详细内容】
2021-04-30  Tags: Sentinel  点击:(251)  评论:(0)  加入收藏
众所周知,硬盘是计算机中最重要的硬件之一,所有重要数据都存储在硬盘中。如果你的硬盘突然崩溃导致所有重要数据都消失了,你是否不想要它?现在,通过将Hard Sentinel Pro安装到计...【详细内容】
2021-01-18  Tags: Sentinel  点击:(556)  评论:(0)  加入收藏
Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。这篇文章主要介绍 Sentinel 引入和规则配置等使用...【详细内容】
2020-11-11  Tags: Sentinel  点击:(70)  评论:(0)  加入收藏
一、Sentinel介绍Sentinel是Redis的高可用性(HA)解决方案: 由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被...【详细内容】
2019-12-06  Tags: Sentinel  点击:(92)  评论:(0)  加入收藏
本文基于Redis单实例安装安装。开启哨兵模式,至少需要3个Sentinel实例(奇数个,否则无法选举Leader)。本例通过3个Sentinel实例监控3个Redis服务(1主2从)。IP地址 节点角色&端口1...【详细内容】
2019-10-22  Tags: Sentinel  点击:(130)  评论:(0)  加入收藏
Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较基本介绍1 名词解释 服务...【详细内容】
2019-10-15  Tags: Sentinel  点击:(296)  评论:(0)  加入收藏
在上一篇推文中,我们使用时序数据库 InfluxDb 做了流控数据存储,但是数据存储不是目的,分析监控预警才是最终目标,那么问题来了,如何更好的实现呢?用过阿里巴巴 Sentinel 控制台的...【详细内容】
2019-09-29  Tags: Sentinel  点击:(107)  评论:(0)  加入收藏
一.出现的背景:Redis 主从复制模式下一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用这种场景的这种故障处理方...【详细内容】
2019-08-05  Tags: Sentinel  点击:(251)  评论:(0)  加入收藏
▌简易百科推荐
来源: my.oschina.net/xiaomu0082/blog/2990388首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应...【详细内容】
2021-12-08  Java识堂    Tags:Redis   点击:(18)  评论:(0)  加入收藏
我不知道为什么你会选择对特定数量的“错误”(或警告)如此具体。听起来您正在寻找将要发布到 Yahoo! 的某些文章的内容。 Insider (N Foos to Blah for the BlahBlah)。那说:...【详细内容】
2021-12-07  富集云科技有限公司    Tags:Redis   点击:(14)  评论:(0)  加入收藏
目录 一、背景 二、步骤 0.理论支持 1、获取数据 2、结果 3、分析数据并评估大小 三、关于repl-backlog-size 一、背景 repl-backlog-size控制这个环形缓冲区. ​ 主从断...【详细内容】
2021-11-05  弈秋的美好生活    Tags:redis   点击:(41)  评论:(0)  加入收藏
Redis 性能测试是通过同时执行多个命令实现的。1,Redis-benchmarkRedis性能命令:redis性能命令格式: redis-benchmark [option] [option value] redis 性能测试工具可选参数如...【详细内容】
2021-11-02  川石信息    Tags:Redis   点击:(41)  评论:(0)  加入收藏
1 概述数据结构和内部编码 无传统关系型数据库的 Table 模型schema 所对应的db仅以编号区分。同一 db 内,key 作为顶层模型,它的值是扁平化的。即 db 就是key的命名空间。 key...【详细内容】
2021-11-01  JavaEdge    Tags:Redis   点击:(28)  评论:(0)  加入收藏
普通java中使用引用Java redis 驱动,即可连接:import redis.clients.jedis.Jedis; public class RedisTestJava { public static void main(String[] args) { //连...【详细内容】
2021-10-13  faesuite    Tags:Redis   点击:(34)  评论:(0)  加入收藏
Redis常用的数据结构有 string list set zset hashstringstring 是 Redis 的基本的数据类型,一个 key 对应一个 value。string 类型是二进制安全的,Redis的string可以包含任...【详细内容】
2021-10-12  语霖    Tags:Redis   点击:(36)  评论:(0)  加入收藏
列表类型可以存储一组按插入顺序排序的字符串,它非常灵活,支持在两端插入、弹出数据,可以充当栈和队列的角色。> LPUSH fruit apple(integer) 1> RPUSH fruit banana(integer)...【详细内容】
2021-09-17  深夜敲代码    Tags:Redis   点击:(54)  评论:(0)  加入收藏
Redis持久化意义 是做灾难恢复,数据恢复,也可以归类到高可用的一个环节里面去,比如你的redis整个挂了,然后redis就不可用了,你要做的事情是让redis变得可用,尽快变得可用 大量的请...【详细内容】
2021-08-12  小李说IT    Tags:Redis   点击:(77)  评论:(0)  加入收藏
当查询Redis中没有的数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当这种情况大量出现或被恶意攻击时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据...【详细内容】
2021-07-30  随便t    Tags:缓存穿透   点击:(91)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条