当前位置:首页 > 随笔 > 正文内容

Redis Sentinel 高可用架构详解与实践

访客 随笔 2026年7月7日 1

一、Sentinel 核心概念

1. Sentinel 的定位

Redis Sentinel 是官方提供的高可用解决方案,用于解决主从复制架构中主节点故障时的自动切换问题。它是一个独立的守护进程,能够监控多个主从集群,在主节点不可用时自动完成故障转移。

2. 核心功能架构

Sentinel 作为监控中心,持续检测主从节点的健康状态,并在异常时触发自动化的故障恢复流程。

3. 三大核心职责

  • 健康监控:周期性检查主从节点运行状态
  • 事件通知:通过 API 向管理员或应用发送告警
  • 自动故障转移:主节点失效时自动选举新主节点,并重新配置复制关系

二、节点发现机制

1. 主节点发现

Sentinel 通过配置文件中的 sentinel monitor 指令定位主节点,随后建立两类连接:

  • 命令连接:用于发送监控指令
  • 订阅连接:订阅 __sentinel__:hello 频道,发现其他 Sentinel

配置示例

# 启动 Sentinel 服务
redis-sentinel /etc/redis/sentinel.conf

# 多集群监控配置
sentinel monitor cluster-alpha 192.168.1.10 6379 2
sentinel down-after-milliseconds cluster-alpha 30000
sentinel parallel-syncs cluster-alpha 1
sentinel failover-timeout cluster-alpha 180000

sentinel monitor cluster-beta 192.168.1.20 6379 3
sentinel down-after-milliseconds cluster-beta 50000
sentinel parallel-syncs cluster-beta 2
sentinel failover-timeout cluster-beta 300000

2. 从节点自动发现

Sentinel 通过向主节点发送 INFO 命令获取从节点列表,无需手动配置。发现从节点后,同样建立命令连接和订阅连接。

3. Sentinel 节点发现

各 Sentinel 节点通过发布/订阅机制相互感知:

  1. 每 2 秒向 __sentinel__:hello 频道广播自身信息(IP、端口、运行 ID)
  2. 同时订阅该频道接收其他 Sentinel 的广播
  3. 新节点加入时,对比配置版本,自动更新为最新配置
  4. 通过运行 ID 或地址去重,维护已知节点列表

4. 节点间通信

Sentinel 之间仅建立命令连接进行直接通信,订阅连接通过主从节点中转,避免网状订阅连接。

三、故障检测机制

1. 主观下线(SDOWN)

单个 Sentinel 通过 PING 命令判定节点状态。若节点在 down-after-milliseconds 时间内未返回有效响应,则被标记为主观下线。

有效响应包括

  • +PONG
  • -LOADING(加载中)
  • -MASTERDOWN(主节点宕机)

2. 客观下线(ODOWN)

当足够数量的 Sentinel(达到配置中的法定票数)都将主节点标记为 SDOWN 时,触发客观下线。此判定仅针对主节点,从节点和 Sentinel 节点不存在客观下线概念。

Sentinel 通过 SENTINEL is-master-down-by-addr 命令交换各自的判定结果,采用流言协议(Gossip Protocol)达成共识。

四、故障转移流程

1. 选举 Leader Sentinel

基于 Raft 算法选举领头 Sentinel,确保同一时期内只有一个执行者:

  • 每个 Sentinel 在一个 epoch 内只投一票
  • 获得多数票的 Sentinel 成为 Leader
  • 选举失败则在超时后重试

2. 新主节点选择策略

筛选条件:
1. 排除已主观下线、断线或响应延迟超过 5 秒的从节点
2. 排除与主节点断开时间超过 down-after 时长 10 倍的从节点

优选规则:
1. 选择复制偏移量(replication offset)最大的从节点
2. 若偏移量相同,选择运行 ID 最小的从节点

3. 故障转移执行步骤

  1. 向选中的从节点发送 SLAVEOF NO ONE 升级为主节点
  2. 通过发布/订阅广播新配置,其他 Sentinel 同步更新
  3. 向其他从节点发送 SLAVEOF 指向新主节点
  4. 旧主节点恢复后,自动配置为新主节点的从节点
  5. 向重写配置的节点发送 CONFIG REWRITE 持久化配置

4. 配置一致性保证

  • 配置附带版本号(epoch),采用 last-write-wins 策略传播
  • 网络分区时,min-slaves-to-write 可防止数据不一致
  • 配置自动持久化到 Sentinel 配置文件,重启安全

五、实战部署

1. 环境规划

角色主机IP:端口
主节点redis-node-0110.0.0.51:6379
从节点 Aredis-node-0110.0.0.51:6380
从节点 Bredis-node-0110.0.0.51:6381

2. Sentinel 配置与启动

# 创建配置目录
mkdir -p /etc/redis/sentinel-26379 && cd /etc/redis/sentinel-26379

# 编写配置文件
cat > sentinel.conf << 'EOF'
port 26379
dir "/etc/redis/sentinel-26379"
sentinel monitor redis-main 10.0.0.51 6379 1
sentinel down-after-milliseconds redis-main 5000
sentinel failover-timeout redis-main 60000
sentinel parallel-syncs redis-main 1
EOF

# 后台启动
redis-sentinel /etc/redis/sentinel-26379/sentinel.conf &

3. 故障切换验证

# 连接主节点并关闭
redis-cli -h 10.0.0.51 -p 6379
> SHUTDOWN

# 观察原从节点 6380 状态
redis-cli -h 10.0.0.51 -p 6380
> INFO replication
# 输出显示 role:master,完成切换

# 重启原主节点 6379,自动变为从节点
redis-server /etc/redis/6379/redis.conf
redis-cli -h 10.0.0.51 -p 6379
> INFO replication
# 输出显示 role:slave,master_host:10.0.0.51:6380

4. 关键配置参数说明

参数说明
sentinel monitor <name> <ip> <port> <quorum>监控主节点,quorum 为判定客观下线所需 Sentinel 票数
sentinel down-after-milliseconds主观下线判定时间阈值
sentinel failover-timeout故障转移超时时间,含重试间隔
sentinel parallel-syncs同时向新主节点同步的从节点数,避免全量同步冲击

六、管理命令

# 连接 Sentinel
redis-cli -p 26379

# 基础检测
> PING
PONG

# 查看监控的主节点
> SENTINEL masters

# 查看指定主节点的从节点
> SENTINEL slaves redis-main

# 获取主节点地址
> SENTINEL get-master-addr-by-name redis-main

# 强制触发故障转移(慎用)
> SENTINEL failover redis-main

# 重置状态
> SENTINEL reset redis-main
标签: Redis

相关文章

可以按小时收费的VPS

很多 VPS 提供商都支持 按小时计费(hourly billing),想短期试用 / 临时搭建节点、测试网络、短期项目等场景非常合适。下面是当前最主流且靠谱的按小时 VPS 选项,分别按不同需求场景整理: 1. Vultr(全球节点,包括日本) 按小时计费 可选机房:东京 / 大阪 / 洛杉矶 / 法兰克福 / 伦敦 … 支持 PayPal(部分情况),但更常用信用卡/PayPal+卡价格参考$...

在 iPhone 上下载国外App

地区/国家限制App Store 会根据 Apple ID 的国家或地区限制应用下载。如果你的 Apple ID 绑定的是中国大陆,就可能无法下载 OpenAI 官方的 ChatGPT 应用,因为它在大陆 App Store 不上架。解决办法:换成美国、加拿大、香港等地区的 Apple ID。或者在现有 Apple ID 上更改地区。注册一个国外 Apple ID(推荐)比如注册 美国区 Appl...

Node.js 中的异步编程:回调与 Promise

Node.js 是一个基于 JavaScript 构建的单线程、非阻塞运行环境,它通过异步编程机制来高效处理多个操作。在执行如文件读取、API 请求或数据库查询等任务时,Node.js 不会等待这些操作完成,而是使用回调函数和 Promise 来避免阻塞主线程。 回调方式实现异步 那么当异步操作完成后,Node.js 如何知道接下来要做什么呢?这就要用到 回调函数(callback)。 回调本质上...

Selenium自动化测试入门指南

Selenium自动化测试入门指南

什么是自动化测试? 自动化测试是指利用软件工具自动执行测试用例,模拟用户操作,如打开网页、点击链接、输入文本等,并验证结果是否符合预期。 其主要优点包括: 大幅减少人工成本 测试速度快 可以在非工作时间运行 支持持续集成和交付 然而,它也存在一些局限性,例如开发成本较高、不适合快速变化的项目、依赖稳定的UI界面等。 自动化测试的应用条件 适合引入自动化测试的情况包括: 手动测试耗时且需要大量...

MariaDB Galera集群故障快速恢复指南

OpenStack控制节点采用三节点MariaDB Galera集群架构。当数据库集群因故障重启时,有时会出现Galera集群无法正常启动的问题。虽然有多种方法可以恢复数据库服务,但如何实现快速启动同时确保数据完整性呢? 通过分析日志发现,MariaDB Galera集群节点宕机时会在日志中输出以下信息: [Note] WSREP: 新集群视图:全局状态: 874d8e7e-5980-11e8-8...

Android 中 EventBus 的通信机制与实现原理深度解析

EventBus 核心设计思想 EventBus 是一个基于观察者模式的事件总线框架,广泛应用于 Android 平台以实现组件解耦。它通过中心化的消息分发机制,使不同层级、不同线程的对象能够以"发布-订阅"方式通信,避免了传统接口回调或广播带来的强依赖问题。 核心角色说明 事件(Event):任意 Java 对象,作为数据载体,如网络状态变更通知、用户登录信息等。 发布者(Publi...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。