Redis原理篇——哨兵机制

2024-06-09 19:28
文章标签 redis 哨兵 机制 原理篇

本文主要是介绍Redis原理篇——哨兵机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Redis原理篇——哨兵机制

    • 1.Redis哨兵
    • 2.哨兵工作原理
      • 2.1.哨兵作用
      • 2.2.状态监控
      • 2.3.选举leader
      • 2.4.failover

1.Redis哨兵

主从结构中master节点的作用非常重要,一旦故障就会导致集群不可用。那么有什么办法能保证主从集群的高可用性呢?

2.哨兵工作原理

Redis提供了哨兵(Sentinel)机制来监控主从集群监控状态,确保集群的高可用性。

2.1.哨兵作用

哨兵集群作用原理图:

在这里插入图片描述

哨兵的作用如下:

  • 状态监控Sentinel 会不断检查你的 masterslave 是否按预期工作
  • 故障恢复(failover):如果 master 故障,Sentinel 会将一个 slave 提升为 master 。当故障实例恢复后会成为 slave
  • 状态通知Sentinel 充当 Redis 客户端的服务发现来源,当集群发生 failover 时,会将最新集群信息推送给 Redis 的客户端

那么问题来了, Sentinel 怎么知道一个 Redis 节点是否宕机呢?

2.2.状态监控

官方文档:

High availability with Redis Sentinel

Sentinel 基于心跳机制监测服务状态,每隔1秒向集群的每个节点发送ping命令,并通过实例的响应结果来做出判断:

  • 主观下线(sdown):如果某sentinel节点发现某Redis节点未在规定时间响应,则认为该节点主观下线。
  • 客观下线(odown):若超过指定数量(通过 quorum 设置)的sentinel都认为该节点主观下线,则该节点客观下线。quorum值最好超过Sentinel节点数量的一半,Sentinel节点数量至少3台。

如图:

在这里插入图片描述
一旦发现master故障,sentinel需要在salve中选择一个作为新的master,选择依据是这样的:

  • 首先会判断 slave 节点与 master 节点断开时间长短,如果超过 down-after-milliseconds * 10 则会排除该slave节点
  • 然后判断 slave 节点的 slave-priority值,越小优先级越高,如果是 0 则永不参与选举(默认都是1)。
  • 如果 slave-prority 一样,则判断 slave 节点的 offset 值,越大说明数据越新,优先级越高
  • 最后是判断 slave 节点的 run_id 大小,越小优先级越高(通过 info server 可以查看 run_id )。

问题来了,当选出一个新的master后,该如何实现身份切换呢?
大概分为两步:

  • 在多个 sentinel 中选举一个 leader
  • leader 执行 failover

2.3.选举leader

首先,Sentinel 集群要选出一个执行 failoverSentinel 节点,可以成为 leader 。要成为 leader 要满足两个条件:

  • 最先获得超过半数的投票
  • 获得的投票数不小于 quorum
    sentinel 投票的原则有两条:
  • 优先投票给目前得票最多的
  • 如果目前没有任何节点的票,就投给自己
    比如有3个 sentinel 节点,s1s2s3 ,假如 s2 先投票:
  • 此时发现没有任何人在投票,那就投给自己。s2 得 1 票
  • 接着 s1s3 开始投票,发现目前 s2 票最多,于是也投给 s2s2 得 3 票
  • s2 称为 leader ,开始故障转移
    不难看出,谁先投票,谁就会称为 leader ,那什么时候会触发投票呢?
    答案是 第一个确认 master 客观下线的人会立刻发起投票,一定会成为 leader

OK,sentinel找到 leader 以后,该如何完成 failover 呢?

2.4.failover

我们举个例子,有一个集群,初始状态下 7001 为 master ,7002 和 7003 为 slave

在这里插入图片描述

假如 master 发生故障,slave1 当选。则故障转移的流程如下:

  1. sentinel 给备选的 slave1 节点发送 slaveof no one 命令,让该节点成为 master

在这里插入图片描述

  1. sentinel 给所有其它 slave 发送 slaveof 192.168.150.101 7002 命令,让这些节点成为新 master ,也就是 7002slave 节点,开始从新的 master 上同步数据。

在这里插入图片描述

  1. 最后,当故障节点恢复后会接收到哨兵信号,执行 slaveof 192.168.150.101 7002 命令,成为 slave

在这里插入图片描述

参考:

https://www.bilibili.com/video/BV1S142197x7?p=145&vd_source=f586bbf89de5904ba5a05a8c1d18f1c4

这篇关于Redis原理篇——哨兵机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046078

相关文章

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca