14 10 月 2026

单实例 Redis 有两个死穴:挂了数据不可用、内存上限扛不住大数据量。Redis 官方给了两套方案:哨兵(Sentinel)管高可用,Cluster 管横向扩展。

这篇讲清两种模式的原理、部署方法、怎么选。以 Redis 7 为例,命令可直接用。

需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,主流游戏快速部署。

一、先选型:哨兵还是集群

对比哨兵模式Cluster 模式
解决什么高可用(自动故障转移)高可用 + 数据分片
数据量单机内存上限多机分摊,理论上无限
架构复杂度低(1 主 2 从 + 3 哨兵)高(至少 3 主 3 从)
客户端要求普通客户端支持集群协议的客户端
适用数据 < 10G,要 HA大数据量、高并发
写性能单主写入多主并行写

决策树:

数据量 < 10G 且要 HA → 哨兵
数据量大 / 写并发高   → Cluster
只是缓存,挂了重建     → 单实例 + 持久化就够了

二、哨兵模式部署

架构

        ┌─ Sentinel ─┐
应用 ──→ │  Sentinel1 │ ──监控──→ 主库(Master)
        │  Sentinel2 │            ├─ 从库(Slave1)
        └─ Sentinel3 ─┘            └─ 从库(Slave2)
        主库挂了 → 哨兵投票 → 从库提升为主 → 应用切换

1. 部署主从(复用上篇)

先按MySQL 主从的思路……不对,Redis 的从库配置很简单:

# 三台机器(或同机不同端口测试)
# 主库 192.168.1.11:6379
# 从库 192.168.1.12:6379
# 从库 192.168.1.13:6379

# 主库配置(redis.conf 同前,确保 bind + requirepass + 持久化)

# 从库配置 /etc/redis/redis.conf
replicaof 192.168.1.11 6379
masterauth 主库密码        # 主库有密码,从库同步要用
requirepass 从库自己的密码
replica-read-only yes
systemctl restart redis
# 从库验证
redis-cli -a 从库密码 info replication | grep role
# role:slave, master_link_status:up

2. 配置哨兵

三台哨兵(可以和应用同机,也可以独立):

# /etc/redis-sentinel.conf(三台的 sentinel.conf 内容一样)
port 26379

# 监控主库:mymaster 是名字(随便起),2 是客观下线的票数
sentinel monitor mymaster 192.168.1.11 6379 2
sentinel auth-pass mymaster 主库密码

# 判定下线时间(30 秒无响应认为主观下线)
sentinel down-after-milliseconds mymaster 30000

# 故障转移超时
sentinel failover-timeout mymaster 180000

# 并行同步数
sentinel parallel-syncs mymaster 1
redis-sentinel /etc/redis-sentinel.conf &
# 或 systemd 管理(推荐)

哨兵数量为什么是 3:2 这个票数意味着「过半哨兵同意才故障转移」。3 台允许挂 1 台,5 台允许挂 2 台。奇数,别配 2 或 4。

3. 应用连接哨兵(不是连主库 IP)

# Python 示例
from redis.sentinel import Sentinel

sentinel = Sentinel([
    ('192.168.1.11', 26379),
    ('192.168.1.12', 26379),
    ('192.168.1.13', 26379),
], socket_timeout=0.5, password='Redis密码')

# 获取主库(自动发现当前主)
master = sentinel.master_for('mymaster')
master.set('key', 'value')      # 写走主

# 获取从库(读分流)
slave = sentinel.slave_for('mymaster')
slave.get('key')                # 读走从

关键:应用连哨兵问「现在谁是主」,故障转移后自动找到新主,不用改配置。

4. 测试故障转移

# 1. 看当前主
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
# 192.168.1.11 6379

# 2. 把主库弄挂(停 redis)
systemctl stop redis    # 在主库机器上

# 3. 30 秒后,从库应该被提升
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
# 192.168.1.12 6379   ← 换了!

# 4. 应用无感知(通过哨兵找主)

三、Cluster 模式部署

架构

6 节点 = 3 主 + 3 从,数据分 16384 个 slot,每个主负责一段
key → CRC16(key) % 16384 → 落到对应主

1. 准备 6 个实例

# 每台机器一个实例(或同机不同端口测试)
# 7001-7006,目录各自独立
mkdir -p /etc/redis-cluster/{7001,7002,7003,7004,7005,7006}

每实例配置(以 7001 为例):

# /etc/redis-cluster/7001/redis.conf
port 7001
bind 0.0.0.0
daemonize yes
pidfile /var/run/redis_7001.pid
dir /etc/redis-cluster/7001
appendonly yes
requirepass 节点密码
masterauth 节点密码

# 集群模式必开
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.1.11      # 多网卡时声明对外 IP
for p in 7001 7002 7003 7004 7005 7006; do
  redis-server /etc/redis-cluster/$p/redis.conf
done

# 验证都起来了
redis-cli -p 7001 -a 节点密码 ping

2. 组建集群

# 用 redis-cli 的集群工具(--cluster-replicas 1 = 一主一从)
redis-cli -a 节点密码 --cluster create \
  192.168.1.11:7001 192.168.1.11:7002 192.168.1.11:7003 \
  192.168.1.12:7001 192.168.1.12:7002 192.168.1.12:7003 \
  --cluster-replicas 1

# 会打印分片方案,输入 yes 确认
# 3 主 3 从自动分配,slot 均分 16384

3. 验证集群

# 集群状态
redis-cli -a 密码 --cluster check 192.168.1.11:7001

# 看节点信息
redis-cli -p 7001 -a 密码 cluster nodes

# 连集群操作(任意节点都行,会自动路由)
redis-cli -c -p 7001 -a 密码
127.0.0.1:7001> set foo bar
-> Redirected to slot [12182] located at 192.168.1.12:7002
OK

-c 参数让客户端自动跟随重定向,应用 SDK 同理(Java JedisCluster、Python redis-py-cluster)。

4. 扩缩容

# 加一个主节点(7 个节点起,slot 重新分)
redis-cli -a 密码 --cluster add-node 192.168.1.13:7001 192.168.1.11:7001
redis-cli -a 密码 --cluster reshard 192.168.1.11:7001
# 交互式: 迁移多少 slot、从哪到哪

# 加从节点
redis-cli -a 密码 --cluster add-node 新节点 已有主IP:端口 --cluster-slave --cluster-master-id 主节点ID

四、运维要点

哨兵模式监控

# 看哨兵状态
redis-cli -p 26379 sentinel masters
redis-cli -p 26379 sentinel slaves mymaster
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster

# 故障转移记录(哨兵日志)
tail -50 /var/log/redis/sentinel.log

Cluster 监控

# 集群健康
redis-cli -a 密码 --cluster check 节点IP:端口

# 关注: cluster_state:ok、每个 slot 都有主、从库同步正常
redis-cli -p 7001 -a 密码 cluster info | grep cluster_state

密码统一

集群所有节点(主从哨兵)用同一个 requirepass,masterauth 也要设。密码不一致,同步或故障转移会失败。

五、常见问题

Q:哨兵模式下应用要改代码吗?
要改成「连哨兵拿主地址」的模式。主流语言的 Redis 客户端都支持 Sentinel 模式(配置哨兵地址列表即可)。

Q:Cluster 模式下 Lua 脚本和多 key 操作?
多 key 必须落在同一 slot(用 hash tag:{user1000}.name 和 {user1000}.email 保证同 slot)。这是集群的主要限制,设计 key 时就要考虑。

Q:3 主 3 从,挂 3 台会怎样?
取决于挂的是哪些:挂 3 主 = 集群不可用;挂 1 主 2 从 = 对应的从挂了没事、主挂了那组不可用。集群要求每组至少主活着,所以 6 节点容忍「每组挂 1 个」,共 3 个。

Q:集群模式能用 SELECT 换库吗?
不能。集群只有 db0。多业务用不同 key 前缀隔离,或者拆不同集群实例。

Q:数据量不大,需要上集群吗?
不需要。数据 < 10G、要 HA → 哨兵就够了。集群的管理复杂度(reshard、跨 slot 事务限制)不值得。

Q:NAT 型服务器能搭 Redis 集群吗?
节点间通信要互通。NAT 机型之间没有内网,节点发现走 cluster-announce-ip 会暴露公网 IP——能通但不安全也不稳定。生产建议内网互通的产品,或者干脆单实例 + 快照备份(NAT 场景性能够用就别上集群)。

六、选型建议

场景方案
缓存,丢了能重建单实例 + RDB
会话/配置,不能丢单实例 + AOF everysec + 定期备份
要 HA,数据 < 10G哨兵(1 主 2 从 3 哨兵)
大数据量 / 高并发写Cluster(3 主 3 从起步)
小团队 / 预算有限单实例 + 完善的备份恢复流程,挂了几分钟重建

多数个人和小团队场景,单实例 + 备份的性价比最高——多花钱上高可用之前,先确认业务真的等不起那几分钟的重建时间。

更多数据库内容见财富云计算知识库:Redis 缓存实战、持久化 RDB/AOF、安全加固、MySQL 主从全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:MySQL 主从复制配置实战:读写分离与故障切换
  2. 下一篇:Dockerfile 编写与镜像优化实战:镜像缩小 90%
发表评论 2

取消回复