NoSQL数据库Redis(四):哨兵集群

Redis哨兵集群配置

一、哨兵集群核心原理

Redis哨兵(Sentinel)是实现高可用性的分布式系统,通过监控、通知、自动故障转移三大功能保障服务连续性:

  1. 监控机制

    哨兵节点每秒向主/从节点发送PING命令检测存活状态,响应超时判定为主观下线 (SDOWN)。当多数哨兵(quorum)确认主节点下线,触发客观下线(ODOWN)。

  2. 故障转移流程

    • 领导者选举:使用Raft协议在哨兵间选举领导者
    • 新主节点选择:根据优先级、复制偏移量等规则选择最优从节点
    • 配置更新:将新主节点信息同步至所有节点
    • 客户端重定向:通过PUBLISH通知客户端更新连接
  3. 状态同步

    哨兵通过__sentinel__:hello频道发布自身信息,实现节点间状态共享。

二、OpenEuler环境准备
bash 复制代码
# 所有节点执行
sudo dnf install -y gcc make tcl
wget https://download.redis.io/releases/redis-7.0.12.tar.gz
tar xzf redis-7.0.12.tar.gz
cd redis-7.0.12
make && sudo make install

# 创建专用用户
sudo groupadd redis
sudo useradd -r -g redis -s /sbin/nologin redis
三、节点角色规划
IP地址 角色 端口分配
192.168.64.128 主节点 + 哨兵 6379/26379
192.168.64.129 从节点 + 哨兵 6379/26379
192.168.64.130 从节点 + 哨兵 6379/26379
四、Redis主从配置

主节点配置 (128)

bash 复制代码
# /etc/redis/redis.conf
bind 192.168.64.128
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis.log
dir /var/lib/redis
masterauth "S3cr3tP@ss"  # 主从认证密码
requirepass "S3cr3tP@ss"  # 客户端访问密码

从节点配置 (129/130)

bash 复制代码
slaveof 192.168.64.128 6379
masterauth "S3cr3tP@ss"
replica-read-only yes
五、哨兵集群配置(所有节点)
bash 复制代码
# /etc/redis/sentinel.conf
port 26379
daemonize yes
logfile /var/log/redis/sentinel.log
sentinel monitor mymaster 192.168.64.128 6379 2  # quorum=2
sentinel auth-pass mymaster "S3cr3tP@ss"
sentinel down-after-milliseconds mymaster 5000  # 5秒判定下线
sentinel failover-timeout mymaster 60000        # 故障转移超时
sentinel parallel-syncs mymaster 1              # 并行同步数
六、关键参数解析
  1. quorum值

主要作用是把来自多个哨兵节点的独立判断(主观下线)汇聚成一个集群层面的共同决策(客观下线),从而有效防止因单点网络抖动等原因导致的误判

  1. 故障转移超时

    • failover-timeout:控制故障转移各阶段超时阈值
    • 包含领导者选举、从节点晋升、配置传播三阶段
  2. 网络分区处理

    bash 复制代码
    graph LR
    A[主节点] -->|网络中断| B[分区A]
    C[哨兵集群] -->|网络中断| D[分区B]
    B-->|多数哨兵在线| E[触发故障转移]
    D-->|少数哨兵在线| F[维持原状态]
七、启动与验证
bash 复制代码
# 启动Redis服务
sudo systemctl start redis-server

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

# 验证主从状态(从节点执行)
redis-cli -h 192.168.64.129 -a S3cr3tP@ss
> INFO replication
# 输出示例
role:slave
master_host:192.168.64.128
master_link_status:up

# 检查哨兵拓扑
redis-cli -p 26379
> SENTINEL MASTER mymaster

预期输出包含主节点IP、从节点数量、哨兵节点数等关键信息。

八、故障转移测试
  1. 模拟主节点宕机

    bash 复制代码
    # 在主节点执行
    sudo systemctl stop redis-server
  2. 观察日志

    bash 复制代码
    # sentinel.log
    +sdown master mymaster 192.168.64.128 6379
    +odown master mymaster #quorum 2/2
    +try-failover master mymaster
    +vote-for-leader 5a3b4c6d 1  # 领导者选举
    +elected-leader master mymaster
    +selected-slave 192.168.64.129  # 新主节点
    +failover-state-send-slaveof-noone 192.168.64.129
    +failover-state-wait-promotion 192.168.64.129
    +promoted-slave 192.168.64.129  # 晋升成功
  3. 验证新拓扑

    bash 复制代码
    redis-cli -p 26379
    > SENTINEL GET-MASTER-ADDR-BY-NAME mymaster
    1) "192.168.64.129"
    2) "6379"
九、生产环境优化建议
  1. 内核参数调优

    bash 复制代码
    # /etc/sysctl.conf
    net.core.somaxconn = 2048
    vm.overcommit_memory = 1
  2. 哨兵部署策略

    • 避免与Redis进程同机部署(物理隔离)
    • 跨机房部署时设置sentinel announce-ip声明公网IP
  3. 客户端重连策略

    python 复制代码
    # Python示例
    from redis.sentinel import Sentinel
    sentinel = Sentinel([('192.168.64.128', 26379),
                         ('192.168.64.129', 26379),
                         ('192.168.64.130', 26379)],
                        socket_timeout=0.5)
    master = sentinel.master_for('mymaster', password='S3cr3tP@ss')
    master.set('key', 'value')  # 自动路由到主节点
十、常见故障排查
  1. 脑裂问题

    • 现象:客户端同时向两个"主节点"写入
    • 解决:设置min-slaves-to-write 1确保至少一个从节点同步
  2. 配置不同步

    • 检查哨兵节点间网络连通性
    • 验证sentinel current-epoch值是否一致
  3. 日志分析要点

    bash 复制代码
    grep -E 'sdown|odown|failover' /var/log/redis/sentinel.log
十一、监控告警配置
  1. Prometheus监控指标

    bash 复制代码
    # redis_exporter配置
    - targets: ['192.168.64.128:9121', '192.168.64.129:9121', '192.168.64.130:9121']
      labels:
        group: 'redis-sentinel'
  2. 关键告警规则

    bash 复制代码
    - alert: RedisSentinelQuorumLost
      expr: redis_sentinel_master_quorum_status == 0
      for: 5m
      labels:
        severity: critical
十二、安全加固措施
  1. 防火墙配置

    bash 复制代码
    # OpenEuler防火墙规则
    sudo firewall-cmd --permanent --add-port=6379/tcp
    sudo firewall-cmd --permanent --add-port=26379/tcp
    sudo firewall-cmd --reload
  2. ACL访问控制

    bash 复制代码
    # redis.conf
    aclfile /etc/redis/users.acl
    acl 复制代码
    # users.acl
    user default on >S3cr3tP@ss ~* +@all
    user monitor on >MonitorP@ss resetchannels -@all +info
相关推荐
MageGojo1 小时前
短链还原 API 怎么接入:展开跳转链路、查看状态码和最终落地页
数据库·redis·缓存
我是一颗柠檬1 小时前
【Redis】字符串与哈希Day3(2026年)
数据库·redis·后端·database
我叫张小白。3 小时前
基于Redis的缓存架构与一致性保障体系
数据库·redis·缓存·架构
我是一颗柠檬3 小时前
【Redis】数据类型详解Day2(2026年)
数据库·redis·后端·缓存
Trouvaille ~3 小时前
【Redis篇】List 列表:双端队列与消息队列的完美实现
数据库·redis·list·双端队列·后端开发·quicklist·zoplist
努力发光的程序员3 小时前
面试官与程序员谢飞机的3轮Java大厂面试问答实录:涵盖Spring Boot、微服务与数据库技术
java·jvm·spring boot·redis·面试·hibernate·microservices
我叫张小白。3 小时前
Redis的缓存雪崩、击穿、穿透和解决方案
数据结构·redis·fastapi·缓存穿透·缓存击穿·雪崩·热点key问题
Rick19934 小时前
Redis 高频面试 10 题
数据库·redis·面试
Rick19934 小时前
什么是Redis的 IO 多路复用
redis·缓存
Java 码思客4 小时前
【Redis分布式缓存实战】第2章 Redis核心数据结构与业务实战场景
redis·分布式·缓存