Redis_哨兵模式

9. 哨兵模式

9.1 简介

当主库宕机,在从库中选择一个,切换为主库。

问题:

  1. 主库是否真正宕机?
  2. 哪一个从库可以作为主库使用?
  3. 如何实现将新的主库的信息通过给从库和客户端?

9.2 基本流程

哨兵主要任务:

  • 监控
  • 选择主库
  • 通知

会有主观下线和客观下线,就是奇数个哨兵,少数服从多数,多数以为主服务器宕机了,就判断宕机

9.3 哨兵模式配置

  1. 创建一个sentinel.conf文件,进行配置

    shell 复制代码
    #端口号
    port 26379
    #sentinel monitor <自定义的reids主节点名称> <IP> <port> <数量、几个哨兵说主节点下线>
    sentinel monitor mymaster 127.0.0.1 6379 1
    #指定多少毫秒后,主节点没有应答哨兵,就认为下线了
    sentinel down-after-milliseconds mymaster 30000
  2. 启动三个redis实例,配置成一主二从模式

  3. 启动哨兵:redis-sentinel sentinel.conf

  4. 将主服务器宕机,观察哨兵监控信息变化
    将一个从库6380,切换成主库,将6381,切换成6379的从库。

  5. 将原来主库6379再次启动,6379切换成6380的从库

9.4 新主库的选定

筛选 + 打分,来实现新主库的选定

打分

三轮打分

  • 第一轮 优先级
    • 通过replica-priority配置项,给不同的从库设置优先级。可以将内存大,网络好,配置高的从库优先级设置更高。
  • 第二轮 和原主库同步程度
    • 选择和原主库repl_backlog_buffer(唤醒缓冲区)中的位置最接近的,做为分数最高
  • 第三轮 ID号小的从库得分高
    • 每一个redis实例都有一个id。

9.5 哨兵集群

9.5.1 简介

采用多个哨兵,组成一个集群,以少数服从多数的原则,来判断主库是否客观下线。

  • 假如有s个哨兵,那么如果有s/2+1个哨兵确定主库宕机,则判断主库为客观下线

如果集群中,有哨兵实例掉线,其他的哨兵还可以继续协作,来完成主从库监控和切换的工作。

9.5.2 部署

  1. 创建了一个目录 mysentinel

  2. 分别创建三个哨兵配置文件

    sentinel26379.conf sentinel26380.conf sentinel26381.conf

    配置如下

    shell 复制代码
    port 26379
    sentinel monitor mymaster 127.0.0.1 6379 2
    shell 复制代码
    port 26380
    sentinel monitor mymaster 127.0.0.1 6379 2
    shell 复制代码
    port 26381
    sentinel monitor mymaster 127.0.0.1 6379 2
  3. 再次配置一主二从

  4. 启动三个redis实例,配置成一主二从,6379是主库

  5. 依次启动三个哨兵实例。主库宕机,发现主库下线后,选举新的从库做为主库

    出现的指令 对应意义
    +sdown 进入主观下线状态
    -sdown 退出主观下线状态
    +odown 进入客观下线状态
    -odown 退出客观下线状态
    +switch-master 主库地址发生变化切换
    +slave-reconf-sent 哨兵发送replicaof命令配置从库
    +slave-reconf-inprog 从库配置了新主库,但尚未进行同步
    +slave-reconf-done 从库配置了新主库,并且已经完成同步

9.5.3运行机制

基于pub/sub(发布/订阅)机制实现哨兵集群组成

基于info命令对哨兵监控从库

基于哨兵自身的pub/sub功能,实现了客户和哨兵之间的通知

  • subscribe 频道[频道...]
    • subscribe +odown(订阅+odown的频道)
  • publish 频道 内容
    • publish +odown 下线(发布+odown频道'下线'的信息)

有一个投票机制,倘若一个哨兵发现主库主观下线了,会向其他哨兵发起投票,如果有两个都是主观下线,就判定主库为客观下线

并且此哨兵会向其他两个哨兵发送请求,由我(Leader)来判定从库中的哪一个来替换主库

就如同竞争上岗一样,三个哨兵会相互投票,哪个发起的早,哪个成为Leader几率更大,并且每个哨兵只可以投一个赞成票
注意:

  • 在配置哨兵的时候down-after-milliseconds要让每个哨兵都配置相同的时间,否则可能会出现哨兵不同步的问题
    • sentinel down-after-milliseconds mymaster 30000
相关推荐
一叶飘零_sweeeet32 分钟前
击穿 MySQL 性能天花板:InnoDB Buffer Pool 核心架构、LRU 优化与生产调优全解
数据库·mysql
indexsunny34 分钟前
互联网大厂Java面试实战:从Spring Boot到微服务架构的深度探讨
java·数据库·spring boot·安全·微服务·监控·面试实战
一叶飘零_sweeeet35 分钟前
MySQL InnoDB 锁机制全解:行锁 / 表锁 / 间隙锁 / 临键锁底层逻辑与死锁避坑指南
数据库·mysql
wgzrmlrm7435 分钟前
如何从SQL中提取年份或月份:EXTRACT与日期函数用法
jvm·数据库·python
D4c-lovetrain1 小时前
linux个人心得23 (mysql②)
数据库·mysql
斌味代码1 小时前
MySQL主从延迟根因诊断法
数据库
逆境不可逃1 小时前
高频 SQL 50 题 之 连接篇 1378 1068 1581 197 1661 577 1280 570 1934
数据库·sql
用户5757303346242 小时前
从 SQL 到对象:Prisma 如何成为全栈开发的“降维打击”利器
数据库
三更两点2 小时前
智能代理工具包:MCP vs. Agent Skills vs. AGENTS.md
数据库·人工智能
Chasing Aurora2 小时前
整理常用的开发工具使用问题和小贴士(二)——软件和浏览器
redis·python·mysql·maven