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
相关推荐
我不听你讲话2 小时前
Redis 配置与优化核心内容总结
数据库·redis·缓存
Wy_编程3 小时前
redis 客户端编程
数据库·redis·缓存
熬夜的咕噜猫3 小时前
Nosql Redis配置与优化
数据库·redis·nosql
霸道流氓气质3 小时前
SpringBoot中集成LangChain4j+阿里百炼平台实现AI对话记忆功能、对话隔离、对话持久化到Redis功能
人工智能·spring boot·redis
鬼蛟3 小时前
Spring Cloud Alibaba
ffmpeg·bootstrap
givemeacar3 小时前
spring session、spring security和redis整合的简单使用
redis·spring·bootstrap
kiku18183 小时前
NoSQL之Redis配置与优化
数据库·redis·非关系型数据库
小锋java12344 小时前
Redis可不仅仅是一个简单的KV缓存工具,在Java项目里还有八大场景妙用。。。
redis
FeBaby4 小时前
Java 高并发场景下 Redis 分布式锁(UUID+Lua)最佳实践
java·redis·分布式