哨兵架构组件

哨兵架构组件

一句话回答

Redis 哨兵架构由三个核心组件组成:主节点(提供读写服务)、从节点(提供读服务+热备)、哨兵节点(监控+选主+通知),三者协作构成高可用系统。


架构全景图

                    ┌──────────────────┐
                    │    Sentinel 1    │ ← 哨兵节点(监控+决策)
                    └──────────────────┘
                             │
    ┌────────────────────────┼────────────────────────┐
    │                        │                        │
    ▼                        ▼                        ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│    Sentinel 2    │ │    Sentinel 3    │ │  Client SDK      │
│  (监控+选举)      │ │  (监控+投票)      │ │  (连接发现)       │
└──────────────────┘ └──────────────────┘ └──────────────────┘
    │                        │                    │
    └────────────────────────┼────────────────────┘
                             │
                             ▼
                    ┌──────────────────┐
                    │   Master Node    │ ← 主节点(读写)
                    └────────┬─────────┘
                             │
              ┌──────────────┼──────────────┐
              │              │              │
              ▼              ▼              ▼
        ┌──────────┐  ┌──────────┐  ┌──────────┐
        │ Slave 1  │  │ Slave 2  │  │ Slave 3  │ ← 从节点(只读+备份)
        └──────────┘  └──────────┘  └──────────┘

组件详解

1. 主节点(Master)

核心职责

  • 处理所有写操作(Client 写入)
  • 处理所有读操作(也可以)
  • 向从节点异步传播写命令
  • 故障时由哨兵完成故障转移

高可用要求

  • 必须开启持久化(RDB 或 AOF),否则重启可能导致 replid 变化→全量复制
  • 建议关闭 protected-mode 或配置密码
# master 关键配置
requirepass yourpassword        # 密码认证
masterauth yourpassword         # 从节点连主节点认证(哨兵模式下必须)
appendonly yes                  # 持久化

2. 从节点(Slave / Replica)

核心职责

  • 接收主节点的复制数据(RDB + 增量命令)
  • 提供只读服务(replica-read-only yes
  • 故障转移时被选为新主节点

在哨兵中的作用

# 从节点配置
port 6380
replicaof 192.168.1.1 6379
replica-read-only yes
replica-priority 100        # 越小越优先升级为主(可选范围 0-100)
masterauth yourpassword     # 认证主节点

replica-priority 的作用

优先级值 说明
0 永远不升级为主
1-100 越小优先级越高,哨兵优先选为新的主节点

3. 哨兵节点(Sentinel)

核心职责(三合一):

职责 说明
监控 每 1 秒向主/从节点 PING
决策 通过 Raft 协议选举 leader,执行故障转移
通知 对外提供 API 让客户端获取当前主节点地址

配置示例

# sentinel.conf 三个节点通用配置
port 26379

sentinel monitor mymaster 192.168.1.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster yourpassword

# 客户端发现脚本(可选)
sentinel notification-script mymaster /path/to/notify.sh
sentinel client-reconfig-script mymaster /path/to/reconfig.sh

哨兵的三个子组件

Sentinel 进程
├── 监控模块Monitor
   └──  1  PING 所有已知节点

├── 决策模块Raft + 选主算法
   └── 选举 leader  执行故障转移

├── API 模块
   └── 提供 SENTINEL get-master-addr-by-name 等命令

组件间通信

哨兵 ↔ Redis 节点

Sentinel ──每 1 秒 PING → Master/Slave
Sentinel ← PONG ──────── Master/Slave

Sentinel ──INFO ─────────→ Master(每 10 秒)
           ← 主节点信息、从节点信息 ──

Sentinel ──INFO ─────────→ Slave(每 10 秒)

哨兵 ↔ 哨兵

Sentinel A ──── pub/sub (__sentinel__:hello) ────→ Sentinel B

交换信息:
- 主节点当前状态
- 各哨兵对主节点的判断
- leader 选举投票

客户端 ↔ 哨兵

# 客户端获取当前主节点地址
redis> SENTINEL get-master-addr-by-name mymaster
1) "192.168.1.1"
2) "6379"

# 获取从节点列表
redis> SENTINEL slaves mymaster
1) 1) "name"
   2) "192.168.1.2:6380"
   ...

# 哨兵通知客户端故障转移事件
# 客户端订阅 +switch-master 频道
redis> SUBSCRIBE +switch-master

典型部署方案

最小高可用部署(3 哨兵 + 1 主 + 2 从)

机器 A: Master :6379 + Sentinel :26379
机器 B: Slave  :6379 + Sentinel :26379
机器 C: Slave  :6379 + Sentinel :26379

quorum = 2(可容忍 1 台机器挂)

跨机房部署

机房 1: Master + Sentinel + Slave
机房 2: Slave  + Sentinel
机房 3: Slave  + Sentinel

quorum = 2
# 故障转移时优先在同机房的从节点中选主

面试考点

Q1:哨兵节点本身挂了怎么办?

哨兵集群至少 3 个节点,单节点挂掉不影响整体功能,只要剩余哨兵数 ≥ quorum。如果挂了超过半数,哨兵进入只读模式,停止故障转移能力(但现有主从正常服务)。

Q2:哨兵 + 主从和 Redis Cluster 有什么区别?

维度 哨兵 + 主从 Redis Cluster
数据分片 ❌ 单点写 ✅ 自动分片
写能力 单机写瓶颈 多节点写
自动故障转移
客户端复杂度
使用场景 中小规模 大规模(> 单机容量)

Q3:哨兵为什么要用 Raft 而不是 gossip?

故障转移需要强一致性的 leader 选举,不能有分歧。Raft 保证了在至多半数节点挂掉时仍能选举唯一 leader,而 gossip 是最终一致性协议,不适合这种场景。


总结:哨兵架构由主节点、从节点、哨兵节点三部分构成,哨兵又是分布式应用的最小原型——监控+选举+通知。理解这三者的分工协作是理解 Redis 高可用的基础。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容