Redis集群部署,多节点缓存高可用方案
Redis 集群部署的核心目标是把缓存数据分散到多个主节点,并在主节点故障时由从节点自动接管,从而避免单点缓存故障导致业务雪崩。
下面按零基础也能照做的顺序,讲清三主三从集群的准备、配置、启动和验证过程。
集群部署前先确认这些条件
Redis 集群至少需要 3 个主节点,推荐 3 主 3 从,共 6 个实例,分别部署在 3 台或更多服务器上。
生产环境建议每台服务器至少 2 核 4G,并且关闭透明大页、设置合理的 vm.overcommit_memory。
需要准备的内容包括:
- 6 个 Redis 实例端口,例如
7001到7006 - 每个实例独立的数据目录和配置文件
- 服务器之间内网互通,集群总线端口为业务端口加
10000,例如7001对应17001 - Redis 版本建议使用 5.0 以上,具体以官方文档和实际软件源为准
如果使用宝塔面板,可以在软件商店安装 Redis,但多实例集群更建议用命令行编译或包管理器安装,方便控制配置文件。
创建实例目录和配置文件
假设 6 个实例都放在 /data/redis-cluster 下,先创建目录:
mkdir -p /data/redis-cluster/{7001,7002,7003,7004,7005,7006}
以 7001 为例,创建 /data/redis-cluster/7001/redis.conf,关键配置如下:
port 7001
bind 0.0.0.0
protected-mode no
daemonize yes
pidfile /data/redis-cluster/7001/redis.pid
logfile /data/redis-cluster/7001/redis.log
dir /data/redis-cluster/7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000
appendonly yes
其余 5 个实例只需把端口、pidfile、logfile、dir、cluster-config-file 中的 7001 替换为对应端口。
注意 cluster-config-file 不能重复,每个实例必须独立。
启动实例并组建集群
逐个启动 6 个 Redis 实例:
for port in 7001 7002 7003 7004 7005 7006; do
redis-server /data/redis-cluster/$port/redis.conf
done
确认进程存在:
ps -ef | grep redis-server
然后使用 redis-cli --cluster create 组建集群。
如果是三台服务器,每台两个实例,命令类似:
redis-cli --cluster create \
192.168.1.10:7001 192.168.1.10:7002 \
192.168.1.11:7003 192.168.1.11:7004 \
192.168.1.12:7005 192.168.1.12:7006 \
--cluster-replicas 1
执行后会提示分配主从关系,输入 yes 确认。
看到 All 16384 slots covered 说明槽位分配完成,集群创建成功。
常见报错和避坑说明
部署过程中最容易卡在几个地方。
- 节点无法通信:检查防火墙是否放行业务端口和对应总线端口,云服务器还要检查安全组。
cluster-config-file重复:每个实例必须使用不同文件名,否则启动后节点信息会互相覆盖。- 槽位未完全覆盖:执行
redis-cli --cluster check 192.168.1.10:7001查看哪些槽位未分配,必要时用--cluster fix修复。 - 从节点无法自动切换:确认
cluster-node-timeout不要设置过小,网络抖动频繁时容易误判。 - 密码问题:如果设置了
requirepass和masterauth,所有节点必须一致,否则主从同步会失败。
另外,Redis 集群模式下 mget、mset 等多键命令要求所有 key 落在同一槽位,业务代码需要做 key 哈希标签处理,例如 user:{1001}:name。
验证高可用是否真正生效
集群创建完成后,先用集群模式连接:
redis-cli -c -h 192.168.1.10 -p 7001
执行 cluster info 查看状态,cluster_state:ok 表示集群正常。
再执行 cluster nodes 可以看到主从角色和槽位分布。
写入一个测试 key:
set testkey hello
如果返回 OK,说明读写正常。
接着可以手动停掉一个主节点,观察对应从节点是否在 cluster-node-timeout 后接管。
切换完成后再次执行 get testkey,如果仍能读到值,说明缓存高可用方案基本生效。
生产环境建议配合监控工具持续观察节点状态和延迟。
几个常见疑问
集群最少几个节点?
Redis 集群至少需要 3 个主节点,推荐 3 主 3 从共 6 个实例,才能在主节点故障时自动完成故障转移。
能不能只用 3 个主节点不加从节点?
可以创建,但主节点故障后没有从节点接管,缓存高可用无法保证,生产环境不建议这样部署。
集群模式下客户端需要改代码吗?
需要。
客户端要支持集群模式,并且多键操作要注意 key 落在同一槽位,很多语言的标准客户端已经内置支持。
部署完成后建议把配置文件、启动命令和节点列表整理成文档,后续扩容或迁移时可以直接复用。
遇到异常先看日志和 cluster info 输出,再按报错方向逐项排查,通常比盲目重启更有效。