Redis Cluster 集群配置详解【第四篇】
Redis Cluster 是 Redis 官方提供的分布式解决方案,旨在解决单节点 Redis 的性能瓶颈和高可用性问题。通过将数据分片存储在多个节点,并支持自动故障转移,Redis Cluster 能够提供水平扩展能力和高容错性。
在本系列的前几篇文章中,我们已经介绍了 Redis Cluster 的核心架构、数据分片原理、故障检测与自动故障转移机制。本篇作为第四篇,将聚焦 Redis Cluster 的配置实践,从环境准备、配置文件详解、集群创建、验证、扩展到最佳实践,帮助读者从零开始搭建一个稳定、高效的 Redis Cluster 集群。
目录#
1. 环境准备与前置要求#
在配置 Redis Cluster 前,需确保满足以下环境和软件要求:
1.1 软件版本要求#
- Redis 版本:建议使用 Redis 6.0 及以上(支持 TLS、集群稳定性优化)。
- 操作系统:Linux(推荐 CentOS/Ubuntu,Windows 不支持 Redis Cluster)。
- 依赖工具:
redis-cli(Redis 自带,用于集群管理)、ruby(可选,Redis 5.0 前创建集群需依赖redis-trib.rb,5.0 后redis-cli已集成集群管理功能)。
1.2 硬件与网络要求#
- 节点数量:Redis Cluster 至少需要 3 个主节点(用于分片数据),建议配置 3 主 3 从(每个主节点 1 个从节点,提高可用性)。
- 网络:所有节点间需互通两个端口:
- 服务端口(如 7000-7005):用于客户端连接和数据通信。
- 集群总线端口(服务端口 + 10000,如 17000-17005):用于节点间心跳检测和元数据同步(必须开放,否则集群无法正常通信)。
- 存储:每个节点需独立的目录(避免数据冲突),建议使用 SSD 提升性能。
1.3 环境示例#
本文以 3 主 3 从 集群为例,节点规划如下:
| 节点角色 | 节点名称 | 服务端口 | 集群总线端口 | 数据目录 |
|---|---|---|---|---|
| 主节点 | node-7000 | 7000 | 17000 | /data/redis/7000 |
| 主节点 | node-7001 | 7001 | 17001 | /data/redis/7001 |
| 主节点 | node-7002 | 7002 | 17002 | /data/redis/7002 |
| 从节点 | node-7003 | 7003 | 17003 | /data/redis/7003 |
| 从节点 | node-7004 | 7004 | 17004 | /data/redis/7004 |
| 从节点 | node-7005 | 7005 | 17005 | /data/redis/7005 |
2. Redis 节点配置文件详解#
每个 Redis 节点需通过配置文件(redis.conf)启用集群模式并定义核心参数。以下是集群配置的关键参数及说明:
2.1 核心集群配置(必选)#
# 启用集群模式(必须设置为 yes)
cluster-enabled yes
# 集群节点元数据文件路径(自动生成,记录节点ID、槽位分配等信息)
cluster-config-file nodes-7000.conf # 每个节点文件名需唯一(如 nodes-7001.conf)
# 集群节点超时时间(单位:毫秒)
# 若节点超过此时间未响应,集群会将其标记为故障并触发故障转移
cluster-node-timeout 15000
# 数据持久化(建议开启,避免节点重启后数据丢失)
appendonly yes
appendfilename "appendonly-7000.aof" # AOF 文件名,按节点区分
# 端口号(每个节点唯一)
port 7000
# 数据目录(每个节点独立)
dir /data/redis/7000
# 绑定地址(生产环境建议绑定具体 IP,避免暴露公网;测试可绑定 0.0.0.0)
bind 0.0.0.0
# 关闭保护模式(测试环境,生产环境需结合密码和 bind 限制)
protected-mode no2.2 可选配置(根据场景调整)#
# 密码认证(生产环境必须设置,避免未授权访问)
requirepass "your_strong_password" # 客户端连接密码
masterauth "your_strong_password" # 从节点同步主节点数据时的密码(需与主节点一致)
# 从节点只读(默认 yes,避免从节点接收写请求)
replica-read-only yes
# 集群复制有效性因子(默认 10)
# 若从节点与主节点失联时间 > cluster-node-timeout * cluster-replica-validity-factor,
# 则从节点不会被选为故障转移的候选节点
cluster-replica-validity-factor 10
# 最小从节点数量(主节点故障时,需至少有 N 个健康从节点才允许故障转移,默认 0)
cluster-migration-barrier 1
# 槽位迁移超时时间(默认 60000 毫秒)
cluster-slave-validity-factor 600002.3 配置文件模板使用#
为每个节点创建独立的配置文件,仅需修改 port、dir、cluster-config-file、appendfilename 等节点特有参数。例如,node-7000 的配置文件 redis-7000.conf 内容如下:
port 7000
dir /data/redis/7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
appendonly yes
appendfilename "appendonly-7000.aof"
bind 0.0.0.0
protected-mode no
# requirepass "your_password" # 生产环境启用
# masterauth "your_password" # 生产环境启用3. 集群创建:从节点启动到集群初始化#
3.1 启动所有节点#
首先,为每个节点创建数据目录并启动 Redis 服务:
# 创建数据目录(以 node-7000 为例,其他节点类似)
mkdir -p /data/redis/{7000,7001,7002,7003,7004,7005}
# 启动节点(后台运行)
redis-server /path/to/redis-7000.conf &
redis-server /path/to/redis-7001.conf &
redis-server /path/to/redis-7002.conf &
redis-server /path/to/redis-7003.conf &
redis-server /path/to/redis-7004.conf &
redis-server /path/to/redis-7005.conf &验证节点是否启动成功:
ps -ef | grep redis-server # 查看进程
netstat -tulpn | grep redis # 查看端口监听3.2 初始化集群(核心步骤)#
使用 redis-cli --cluster create 命令初始化集群,自动分配槽位并建立主从关系。
语法:#
redis-cli --cluster create <node1-ip:port> <node2-ip:port> ... --cluster-replicas <num-replicas>--cluster-replicas <num-replicas>:每个主节点的从节点数量(本文示例为 1,即 3 主 3 从)。
示例(3 主 3 从):#
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1执行过程与确认:#
命令执行后,Redis 会自动分配主节点(前 3 个)和从节点(后 3 个),并均匀分配 16384 个槽位到 3 个主节点。输出如下:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0-5460
Master[1] -> Slots 5461-10922
Master[2] -> Slots 10923-16383
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[OK] Perfect anti-affinity obtained!
>>> Checking if cluster is ok...
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: xxxxxxxx... 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
M: yyyyyyyy... 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
M: zzzzzzzz... 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
S: aaaaaaaa... 127.0.0.1:7003
replicates xxxxxxxx...
S: bbbbbbbb... 127.0.0.1:7004
replicates yyyyyyyy...
S: cccccccc... 127.0.0.1:7005
replicates zzzzzzzz...
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
输入 yes 确认分配方案,集群初始化完成。
4. 集群状态验证与管理#
4.1 查看集群信息#
通过 redis-cli 连接任意节点,执行 cluster info 查看集群状态:
redis-cli -p 7000 cluster info关键输出:
cluster_state:ok:集群正常运行(若为fail,表示集群异常)。cluster_slots_assigned:16384:所有槽位已分配。cluster_size:3:主节点数量。
4.2 查看节点列表与槽位分配#
执行 cluster nodes 查看所有节点信息:
redis-cli -p 7000 cluster nodes输出示例(节点 ID、IP:端口、角色、槽位范围等):
xxxxxxxx... 127.0.0.1:7000@17000 master - 0 1690000000000 1 connected 0-5460
yyyyyyyy... 127.0.0.1:7001@17001 master - 0 1690000000000 2 connected 5461-10922
zzzzzzzz... 127.0.0.1:7002@17002 master - 0 1690000000000 3 connected 10923-16383
aaaaaaaa... 127.0.0.1:7003@17003 slave xxxxxxxx... 0 1690000000000 4 connected
bbbbbbbb... 127.0.0.1:7004@17004 slave yyyyyyyy... 0 1690000000000 5 connected
cccccccc... 127.0.0.1:7005@17005 slave zzzzzzzz... 0 1690000000000 6 connected
4.3 检查槽位覆盖#
使用 redis-cli --cluster check 命令检查槽位分配是否完整:
redis-cli --cluster check 127.0.0.1:7000输出 [OK] All 16384 slots covered 表示槽位分配正常。
5. 集群配置参数调优#
合理调整配置参数可提升集群稳定性和性能,以下是关键参数的调优建议:
5.1 集群稳定性相关#
cluster-node-timeout:建议设置为 15000-30000 毫秒(15-30 秒)。值过小可能导致误判故障,值过大则故障转移延迟增加。cluster-replica-validity-factor:默认 10,若从节点与主节点失联时间超过cluster-node-timeout * 10,则无法参与故障转移。生产环境建议设为 5(即 5 倍超时时间),避免因网络波动导致从节点失效。cluster-migration-barrier:默认 1,即主节点至少有 1 个健康从节点时,才允许其他从节点迁移。建议保持默认,确保主节点有备份。
5.2 性能优化相关#
appendfsync:AOF 持久化策略,建议设为everysec(每秒刷盘),平衡性能与数据安全性(always性能较差,no有数据丢失风险)。maxmemory-policy:内存满时的淘汰策略,建议设为allkeys-lru(优先淘汰最近最少使用的 key)。repl-backlog-size:复制积压缓冲区大小,建议设为 1GB(避免主从断连后全量同步)。
5.3 安全相关#
requirepass和masterauth:必须设置强密码(至少 12 位,包含大小写、数字、特殊字符)。bind:生产环境绑定内网 IP(如bind 192.168.1.100),禁止绑定0.0.0.0。- TLS 加密:Redis 6.0+ 支持 TLS,通过
tls-port、tls-cert-file等参数配置,防止数据传输被窃听。
6. 集群扩展:添加/删除节点#
6.1 添加主节点#
步骤 1:启动新节点(如 port 7006)#
创建配置文件 redis-7006.conf,启动节点:
redis-server /path/to/redis-7006.conf &步骤 2:将新节点加入集群#
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000127.0.0.1:7006:新节点地址。127.0.0.1:7000:集群中已存在的节点地址。
步骤 3:迁移槽位到新节点#
新节点默认无槽位,需通过 reshard 命令分配槽位:
redis-cli --cluster reshard 127.0.0.1:7000按提示输入:
- 迁移槽位数量(如 1000)。
- 目标节点 ID(新节点的 ID,通过
cluster nodes获取)。 - 源节点 ID(输入
all表示从所有主节点迁移)。 - 输入
yes确认迁移。
6.2 添加从节点#
为现有主节点添加从节点(如为 node-7000 添加从节点 7007):
步骤 1:启动新节点(port 7007)#
步骤 2:加入集群并指定主节点#
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id <master-node-id>--cluster-slave:声明为从节点。--cluster-master-id:指定主节点 ID(node-7000 的 ID)。
6.3 删除节点#
删除从节点:#
redis-cli --cluster del-node 127.0.0.1:7000 <slave-node-id>删除主节点(需先迁移槽位):#
- 执行
redis-cli --cluster reshard将主节点的槽位迁移到其他主节点。 - 确认槽位为空后,删除节点:
redis-cli --cluster del-node 127.0.0.1:7000 <master-node-id>7. 最佳实践与注意事项#
7.1 生产环境部署原则#
- 节点分散:主从节点避免部署在同一物理机/虚拟机,防止单点故障。
- 资源隔离:每个节点独立 CPU、内存、磁盘,避免资源竞争。
- 监控告警:通过 Prometheus + Grafana 监控集群指标(如槽位分配、节点健康状态、内存使用率),设置告警阈值(如内存使用率 > 80%)。
7.2 数据备份策略#
Redis Cluster 无内置备份机制,需手动或通过工具备份:
- 单节点备份:使用
redis-cli -p 7000 SAVE生成 RDB 文件,或BGREWRITEAOF重写 AOF 文件。 - 自动化备份:通过定时任务(如
crontab)执行备份脚本,将 RDB/AOF 文件同步到远程存储(如 S3)。
7.3 避免常见误区#
- 不要过度分片:主节点数量建议不超过 10 个(过多会增加节点通信开销)。
- 避免大 key:单个 key 大小不超过 100MB,防止槽位迁移卡顿。
- 禁用
FLUSHALL/FLUSHDB:生产环境通过rename-command禁用危险命令:rename-command FLUSHALL "" rename-command FLUSHDB ""
8. 常见问题排查#
8.1 集群无法启动:节点间通信失败#
- 检查端口:确保服务端口(7000-7005)和集群总线端口(17000-17005)已开放(防火墙/安全组)。
- 配置文件错误:确认
cluster-enabled yes,cluster-config-file路径可写。
8.2 槽位分配不完整(cluster_state:fail)#
- 执行
redis-cli --cluster check <node-ip:port>查看未分配槽位。 - 通过
redis-cli --cluster fix <node-ip:port>自动修复槽位分配。
8.3 从节点无法同步主节点数据#
- 检查
masterauth是否与主节点requirepass一致。 - 查看主节点日志:
tail -f /data/redis/7000/redis-server.log,排查同步错误(如网络超时、密码错误)。
9. 总结#
Redis Cluster 的配置是实现分布式存储和高可用的基础,需重点关注节点规划、配置参数调优、集群初始化与扩展。通过本文的步骤,读者可从零搭建一个 3 主 3 从的 Redis Cluster,并掌握日常管理、故障排查的核心技能。在生产环境中,还需结合监控、备份、安全策略,确保集群稳定运行。