当前位置: 首页 > news >正文

Redis集群方案——哨兵机制

Redis Sentinel(哨兵)是Redis官方提供的高可用性(HA)解决方案,用于管理Redis主从架构并实现自动故障转移

一、集群结构和作用

哨兵是一个分布式系统,由多个哨兵节点组成:

哨兵的作用如下:

  • 监控:Sentinel 会不断检查您的master和slave是否按预期工作

  • 自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主

  • 通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端

二、哨兵工作原理

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

  • 主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线
  • 客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。

三、集群故障恢复原理

1.哨兵选主规则

一旦发现master故障,sentinel需要在salve中选择一个作为新的master,选择依据是这样的:

  • 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds * 10)则会排除该slave节点

  • 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举

  • 如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高

  • 最后是判断slave节点的运行id大小,越小优先级越高。

2.故障转移流程

当选出一个新的master后,该如何实现切换呢?

流程如下:

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

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

  • 最后,sentinel将故障节点标记为slave,当故障节点恢复后会自动成为新的master的slave节点

四、Docker搭建Redis哨兵集群

五、相关面试问题

1.怎么保证redis的高并发高可用?

        redis提供了主从同步+哨兵模式保证了redis的高并发和高可用性。

        首先,主从同步保证了redis的高并发性:单节点redis的并发能力是有上线的,我们可以搭建主从同步集群实现redis的读写分离:master负责写数据,slave只负责读数据。

        然后,哨兵机制保证了redis的高可用性:哨兵机制可以实现主从集群的自动故障恢复,里面就包含了对主从服务的检测、自动故障恢复和通知;如果master故障,sentinel会重新选取一个slave作为新的master,当master恢复会自动下降为slave。同时当redis实现故障转移,sentinel会向redis客户端通知信息变化。

2.如何解决redis的集群脑裂问题

        redis的哨兵模式一般会因为网络等原因出现脑裂问题。也就是,master、slave和sentinel处于不同的网络分区,sentinel心跳机制检测不到master,会重新选举一个slave作为新的master,但是旧的master并未下线,仍在写入数据,新的master无法同步,当网络恢复,旧的master下降为slave,就会导致丢失大量数据。

        我知道的有以下几种方法可以避免和减轻脑裂问题:

        第一,设置合适的哨兵quonum,一般为N/2+1(其中N为哨兵节点数)。

        第二,启用主节点写入保护,在redis.conf中添加:至少要有1个从节点连接(min-slaves-to-write 1)和从节点复制延迟不超过10秒(min-slaves-max-lag 10)才能同步数据。

http://www.dtcms.com/a/277291.html

相关文章:

  • 无需付费即可利用AI消除音频噪声和生成字幕
  • 《Linux篇》自动化构建-make/Makefile
  • GraphRAG Docker化部署,接入本地Ollama完整技术指南:从零基础到生产部署的系统性知识体系
  • AI抠图软件,本地运行超快速
  • 水往低处流,人也往低处走
  • 三种网络类型
  • 跨域中间件通俗理解
  • 教程:如何查看浏览器扩展程序的源码
  • Linux驱动11 --- buildroot杂项驱动开发方法
  • 网络资源模板--基于Android Studio 实现的音乐播放器App
  • 【Go语言-Day 19】深入理解Go自定义类型:Type、Struct、嵌套与构造函数实战
  • 系规备考论文:论IT服务知识管理
  • 20250711_Sudo 靶机复盘
  • vue的优缺点
  • React强大且灵活hooks库——ahooks入门实践之状态管理类hook(state)详解
  • 在NDK开发中如何正确创建JNI方法
  • Perl小骆驼学习笔记 - 9. 用正则表达式处理文本
  • 香港服务器Python自动化巡检脚本开发与邮件告警集成
  • 《雨下小暑》诗赏——小暑时节暴雨之晨的清凉视听(智普清言)
  • iOS UI视图面试相关
  • 从儿童涂鸦到想象力视频:AI如何重塑“亲子创作”市场?
  • [特殊字符]使用 Nginx 将 HTTP 重定向到 HTTPS
  • Anaconda3安装教程(Windows)
  • 低代码引擎核心技术:OneCode常用动作事件速查手册及注解驱动开发详解
  • Web应用性能优化之数据库查询实战指南
  • 楼宇自动化:Modbus 在暖通空调(HVAC)中的节能控制(二)
  • 【Linux系统与网络编程】06:进程间通信
  • Day 19: 标准库巡礼:Python的“百宝箱”
  • c++学习之---红黑树的实现
  • CentOS 7 升级系统内核级库 glibc 2.40 完整教程