Redis Cluster集群搭建:三主三从实战配置与常见报错处理
Redis Cluster 集群搭建的核心是让多个 Redis 节点通过分片和主从复制组成一个可横向扩展的高可用集群。
本文以最常见的三主三从架构为例,在三台或六台 Linux 服务器上完成部署,适合零基础用户按步骤操作。
搭建前的节点规划与环境确认
开始前先确认目标:至少 3 个主节点,每个主节点配 1 个从节点,共 6 个 Redis 实例。
如果只有 3 台服务器,可以在每台机器上启动 2 个实例,端口分别用 7001 和 7002。
系统层面需要确认三点。
- Redis 版本建议 5.0 以上,安装命令以系统包管理器或源码编译为准,本文不绑定具体版本号。
- 每个节点开放两个端口:客户端端口(如 7001)和集群总线端口(客户端端口 + 10000,即 17001)。防火墙和安全组都要放行。
- 关闭或调整可能影响集群通信的保护模式,并确保各节点时间同步。
查看 Redis 是否可用:
redis-server --version
redis-cli --version
如果命令不存在,先完成 Redis 安装再继续。
修改每个节点的 redis.conf
Redis Cluster 搭建失败,多数是配置文件没改对。
以下配置项在每个实例的 redis.conf 中都要修改,不能只改一台。
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000
appendonly yes
daemonize yes
protected-mode no
bind 0.0.0.0
几个关键点说明。
cluster-enabled yes是开启集群模式的总开关,不写这一项后面所有集群命令都会失败。cluster-config-file由 Redis 自动维护,不要手动编辑,每个实例的文件名建议带端口号区分。cluster-node-timeout 15000表示节点失联超过 15 秒才判定故障,内网环境可保持默认或适当调整。protected-mode no和bind 0.0.0.0用于允许跨机通信,生产环境应配合防火墙限制来源 IP,不要直接暴露公网。
改完后按实例逐个启动:
redis-server /path/to/7001/redis.conf
redis-server /path/to/7002/redis.conf
启动后用 ps -ef | grep redis 确认每个端口对应的进程都在。
用 redis-cli 创建三主三从集群
所有节点启动后,用一条命令完成槽位分配和主从关系建立。
假设六台机器 IP 为 10.0.0.11 到 10.0.0.16,端口均为 7001。
redis-cli --cluster create \
10.0.0.11:7001 10.0.0.12:7001 10.0.0.13:7001 \
10.0.0.14:7001 10.0.0.15:7001 10.0.0.16:7001 \
--cluster-replicas 1
--cluster-replicas 1 表示每个主节点自动分配一个从节点。
命令执行后会列出主从分配方案,输入 yes 确认。
如果只有三台机器、每台两个实例,把地址写成 10.0.0.11:7001 10.0.0.11:7002 ... 的形式即可。
看到 All 16384 slots covered 就说明槽位分配完成。
验证集群状态是否正常
创建完成后不要直接上业务,先做三项检查。
查看集群整体信息:
redis-cli -c -p 7001 cluster info
重点看 cluster_state:ok 和 cluster_slots_assigned:16384。
如果状态是 fail 或槽位不是 16384,说明集群没有真正就绪。
查看节点列表和主从关系:
redis-cli -c -p 7001 cluster nodes
输出中每个主节点后面应跟一个 slave 节点,且槽位区间连续覆盖 0 到 16383。
做一次读写测试:
redis-cli -c -p 7001 set testkey hello
redis-cli -c -p 7001 get testkey
注意集群模式要用 -c 参数,否则遇到槽位不在当前节点时会报 MOVED 错误。
能正常写入和读出,说明集群基本可用。
搭建过程中容易踩的坑
端口没放行导致节点无法握手。 集群总线端口是客户端端口加 10000,只开 7001 不开 17001,节点之间会一直 handshake 失败。
配置文件只改了一部分节点。 六个实例必须全部开启 cluster-enabled yes,漏掉任何一个都会在创建时提示节点未启用集群。
已有数据未清理就建集群。 如果节点里已有数据,创建集群前先执行 flushall 并删除旧的 nodes-*.conf,否则可能残留旧集群信息。
用单机思维连接集群。 业务代码连接 Redis Cluster 需要使用支持集群的客户端,普通单点客户端无法自动处理槽位跳转。
节点时间不同步。 时间偏差过大会影响故障判定,建议开启 NTP 同步。
常见问题排查
创建集群时提示 Node is not empty。 说明该节点存在数据或旧集群配置,清理数据并删除 nodes-*.conf 后重启再试。
cluster_state:fail 且槽位不足。 通常是部分主节点未成功分配槽位,可用 redis-cli --cluster fix 尝试修复,或检查是否有节点掉线。
业务连接报 CLUSTERDOWN。 说明集群处于不可用状态,先用 cluster info 和 cluster nodes 确认是否有多数主节点失联,再检查网络和防火墙。
从节点没有同步数据。 用 cluster nodes 确认主从关系是否建立,若显示 disconnected,检查主节点总线端口是否可达。
Redis Cluster 集群搭建的关键不在于命令多复杂,而在于每个节点的配置是否一致、端口是否互通、创建后是否验证到 cluster_state:ok。
按本文顺序执行并逐项检查,三主三从集群通常可以一次搭建成功。