百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis Sentinel主从高可用方案简析

mhr18 2024-11-22 17:42 16 浏览 0 评论

一、Sentinel介绍

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

二、Sentinel的主从原理

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

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



假设这时s1下线,s2、 s3、 s4停止对s1的复制,sentinel系统会察觉到s1下线;s1下线时长超过用户设定的下线时长限制,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新的主服务器,故障转移成功;


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


三、主观下线和客观下线

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

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: