Redis

关注公众号 jb51net

关闭
首页 > 数据库 > Redis > Redis搭建哨兵集群

Redis搭建哨兵集群实践

作者:難釋懷

本文介绍了从零搭建一个1主+2从+3哨兵的高可用Redis架构,并验证故障转移效果,文中详细描述了环境准备、搭建Redis主从复制、配置哨兵集群、验证哨兵集群状态以及模拟故障转移的步骤,最后,还提供了在生产环境中的最佳实践和常见问题排查建议

一、前言:为什么需要哨兵集群?

在生产环境中,单点 Redis 主节点一旦宕机,整个写服务将中断

手动切换不仅慢(几分钟),还容易出错。

Redis Sentinel(哨兵)集群 可以实现:

本文将带你从零搭建一个 1 主 + 2 从 + 3 哨兵 的高可用 Redis 架构,并验证故障转移效果。

二、环境准备

2.1 服务器规划(可单机模拟)

角色IP 地址端口说明
Master192.168.1.106379主节点
Slave1192.168.1.116379从节点1
Slave2192.168.1.126379从节点2
Sentinel1192.168.1.1026379哨兵1(可与 Master 同机)
Sentinel2192.168.1.1126379哨兵2(可与 Slave1 同机)
Sentinel3192.168.1.1226379哨兵3(可与 Slave2 同机)

单机测试:可在同一台机器用不同端口模拟(如 6380、6381)

2.2 软件要求

三、第一步:搭建 Redis 主从复制

3.1 配置主节点(master.conf)

# /etc/redis/master.conf
port 6379
bind 0.0.0.0
daemonize yes
logfile "/var/log/redis/master.log"
dir /var/lib/redis
requirepass "your_strong_password"  # 建议设置密码

启动主节点:

redis-server /etc/redis/master.conf

3.2 配置从节点(slave1.conf & slave2.conf)

# /etc/redis/slave1.conf
port 6379
bind 0.0.0.0
daemonize yes
logfile "/var/log/redis/slave1.log"
dir /var/lib/redis
# 关键:指向主节点
replicaof 192.168.1.10 6379
masterauth "your_strong_password"  # 主节点密码

注意:Redis 5.0+ 使用 replicaof 替代 slaveof

启动两个从节点:

redis-server /etc/redis/slave1.conf
redis-server /etc/redis/slave2.conf

3.3 验证主从同步

# 在主节点写入
redis-cli -h 192.168.1.10 -a your_strong_password SET hello world

# 在从节点读取
redis-cli -h 192.168.1.11 GET hello  # 应返回 "world"

四、第二步:配置哨兵集群

4.1 创建哨兵配置文件(sentinel.conf)

所有哨兵节点使用相同配置(除日志路径外)

# /etc/redis/sentinel.conf
port 26379
bind 0.0.0.0
daemonize yes
logfile "/var/log/redis/sentinel.log"
dir /var/lib/redis
# 监控名为 mymaster 的主节点
# quorum=2:至少 2 个哨兵同意才判定主节点宕机
sentinel monitor mymaster 192.168.1.10 6379 2
# 主节点密码(必须配置!)
sentinel auth-pass mymaster your_strong_password
# 判定主观下线时间(毫秒)
sentinel down-after-milliseconds mymaster 30000
# 故障转移超时(毫秒)
sentinel failover-timeout mymaster 180000
# 故障转移后,并行同步从节点数
sentinel parallel-syncs mymaster 1

关键参数说明

4.2 启动三个哨兵节点

# 在三台机器分别执行
redis-sentinel /etc/redis/sentinel.conf

单机测试:复制三份配置,修改 port 为 26379/26380/26381,分别启动

五、第三步:验证哨兵集群状态

5.1 查看哨兵监控信息

redis-cli -p 26379 SENTINEL MASTER mymaster

关键字段:

5.2 查看所有哨兵共识

redis-cli -p 26379 SENTINEL SENTINELS mymaster

→ 应显示另外两个哨兵的信息

5.3 客户端获取主节点地址

redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
# 返回:1) "192.168.1.10" 2) "6379"

六、第四步:模拟故障转移(实战验证)

6.1 手动停止主节点

# 在主节点机器执行
redis-cli -a your_strong_password shutdown

6.2 观察哨兵日志

# /var/log/redis/sentinel.log
+sdown master mymaster 192.168.1.10 6379  # 主观下线
+odown master mymaster ...                # 客观下线
+new-epoch 1
+try-failover master mymaster ...
+vote-for-leader abc123 1                 # 投票
+elected-leader master mymaster ...
+failover-state-select-slave master mymaster ...
+selected-slave slave 192.168.1.11:6379  # 选出新主
+failover-state-send-slaveof-noone ...
+switch-master mymaster 192.168.1.10 6379 192.168.1.11 6379  # 切换完成!

6.3 验证新主节点

# 查询当前主节点
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
# 返回:1) "192.168.1.11" 2) "6379"

# 写入新主
redis-cli -h 192.168.1.11 -a your_strong_password SET test_key new_value

# 从节点(原主恢复后)应能同步
redis-cli -h 192.168.1.10 GET test_key  # 若原主已重启

6.4 原主恢复后自动变为从节点

重启原主:

redis-server /etc/redis/master.conf

查看其角色:

redis-cli -h 192.168.1.10 ROLE
# 返回:1) "slave" 2) "192.168.1.11" ...

✅ 成功!整个过程全自动,无需人工干预。

七、客户端连接示例(Spring Boot)

# application.yml
spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 192.168.1.10:26379
        - 192.168.1.11:26379
        - 192.168.1.12:26379
    password: your_strong_password

应用会自动连接当前主节点,切换时可能短暂报错,重试即可。

八、生产环境最佳实践

必须遵守

  1. 至少 3 个哨兵节点(部署在不同物理机/可用区)
  2. 哨兵与 Redis 实例尽量分离部署(避免资源竞争)
  3. 主从节点必须设置密码,并在哨兵中配置 auth-pass
  4. 监控哨兵日志与 +switch-master 事件

推荐配置

九、常见问题排查

问题:哨兵无法发现从节点

问题:故障转移后客户端连不上

问题:哨兵日志报NOAUTH

十、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文