Redis Cluster 搭建实战:三主三从集群部署与验
Redis Cluster 搭建的核心目标是把数据自动分片到多个节点,并在部分节点故障时仍能继续服务。
本文按三主三从的最小生产可用架构,给出从零开始的完整操作路径。
先确认环境和节点规划
Redis Cluster 至少需要 3 个主节点,推荐每个主节点配 1 个从节点,共 6 个实例。
下面以 3 台服务器、每台跑 2 个实例为例,IP 用占位符表示,请替换成你自己的内网地址。
- 服务器 A:
192.168.1.11,端口7001、7002 - 服务器 B:
192.168.1.12,端口7001、7002 - 服务器 C:
192.168.1.13,端口7001、7002
系统建议使用主流 Linux 发行版,Redis 版本建议 5.0 以上,6.x 和 7.x 均支持集群模式。
安装方式可以选择系统包管理器或源码编译,这里以源码编译为例,假设 Redis 安装在 /usr/local/redis,可执行文件在 /usr/local/redis/bin。
搭建前请确认:
- 各节点之间内网互通,安全组或防火墙放行
7001、7002以及集群总线端口17001、17002。集群总线端口默认是服务端口加 10000,必须放行,否则节点无法握手。 - 系统已安装
gcc、make、tcl等编译依赖,源码编译时需要。 - 每台服务器的时间同步正常,建议开启 NTP。
创建目录和配置文件
下面命令在每台服务器上执行,先建目录:
mkdir -p /data/redis/{7001,7002}
mkdir -p /data/redis/logs
然后为每个实例写一份 redis.conf。
可以直接复制模板再改端口,以 7001 为例:
cp /usr/local/redis/redis.conf /data/redis/7001/redis.conf
修改以下关键配置项,没提到的保持默认即可:
port 7001
bind 0.0.0.0
protected-mode no
daemonize yes
pidfile /data/redis/7001/redis.pid
logfile /data/redis/logs/7001.log
dir /data/redis/7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000
appendonly yes
几个容易写错的地方:
cluster-enabled yes必须打开,否则实例只会以单机模式启动。cluster-config-file是集群自动维护的文件,不要手动编辑,每个实例文件名要区分开。protected-mode no在绑定内网地址且配合防火墙使用时可以关闭,但如果机器有公网 IP,请务必再用防火墙限制访问来源。
7002 端口按同样方式复制一份,把端口和路径里的 7001 全部替换成 7002 即可。
三台服务器都完成后,逐个启动实例:
/usr/local/redis/bin/redis-server /data/redis/7001/redis.conf
/usr/local/redis/bin/redis-server /data/redis/7002/redis.conf
用 ps -ef | grep redis 或 redis-cli -p 7001 ping 确认每个实例都返回 PONG。
用 redis-cli 创建集群
六个实例都启动后,只需要在其中一台服务器上执行一次创建命令:
/usr/local/redis/bin/redis-cli --cluster create \
192.168.1.11:7001 192.168.1.12:7001 192.168.1.13:7001 \
192.168.1.11:7002 192.168.1.12:7002 192.168.1.13:7002 \
--cluster-replicas 1
命令会先列出主从分配方案,并提示输入 yes 确认。--cluster-replicas 1 表示每个主节点配 1 个从节点。
确认后 Redis 会自动分配 16384 个哈希槽并完成主从配对。
如果提示 Waiting for the cluster to join 长时间卡住,优先检查集群总线端口是否放行、节点之间是否能互相连通。
验证集群状态和读写
创建完成后,用下面命令查看集群健康状态:
/usr/local/redis/bin/redis-cli -p 7001 cluster info
/usr/local/redis/bin/redis-cli -p 7001 cluster nodes
cluster info 中 cluster_state 应为 ok,cluster_slots_assigned 应为 16384。cluster nodes 会列出所有节点及其角色,
确认是 3 个 master、
3 个 slave,
且每个 master 有对应的 slave。
接着测试读写。
集群模式连接需要加 -c 参数,否则会报 MOVED 错误:
/usr/local/redis/bin/redis-cli -c -p 7001
set foo bar
get foo
能正常写入并读回即说明集群工作正常。
常见报错和避坑点
节点启动后 cluster_state 一直是 fail:通常是槽位未分配满 16384,或者有节点没加入。
用 cluster nodes 检查是否有节点处于 fail 或未分配槽位,必要时重新执行 redis-cli --cluster create 或用 --cluster add-node 补节点。
客户端报 MOVED 或 ASK:说明客户端没有开启集群模式。
多数客户端库需要显式配置集群节点列表,Java 的 Jedis 用 JedisCluster,Python 的 redis-py 用 RedisCluster,不要把集群当单机连。
从节点不切换:检查 cluster-node-timeout 是否设置合理,以及从节点与主节点之间的网络是否稳定。
切换需要多数主节点达成共识,如果超过半数主节点不可达,集群会停止对外服务,这是设计行为。
数据目录权限问题:Redis 以哪个用户启动,就要保证 dir 目录对该用户可写,否则启动会失败或 AOF 无法落盘。
需要特别注意,
集群模式下多 key 操作如 mget、
事务,
要求所有 key 落在同一个槽位,
可以用 {tag} 形式让 key 落到同一槽,
例如 {user}: 和
1{user}:。
2
几个常见疑问
如果只有一台服务器想测试,能不能搭集群?
可以,用不同端口在同一台机器上跑 6 个实例即可,但只建议用于本地验证,生产环境单机无法提供真正的高可用。
集群搭建完成后能直接扩容吗?
可以,用 redis-cli --cluster add-node 加入新节点,再用 --cluster reshard 迁移槽位。
扩容操作涉及数据迁移,建议在低峰期进行并提前备份。
Redis Cluster 搭建本身不复杂,难点多集中在端口放行、槽位分配和客户端集群模式配置上。
按本文顺序执行并逐项验证,大多数环境都能顺利跑通;
如果中途报错,优先回到集群状态检查那一步定位问题。