Redis Cluster 集群配置详解【第四篇】

Redis Cluster 是 Redis 官方提供的分布式解决方案,旨在解决单节点 Redis 的性能瓶颈和高可用性问题。通过将数据分片存储在多个节点,并支持自动故障转移,Redis Cluster 能够提供水平扩展能力和高容错性。

在本系列的前几篇文章中,我们已经介绍了 Redis Cluster 的核心架构、数据分片原理、故障检测与自动故障转移机制。本篇作为第四篇,将聚焦 Redis Cluster 的配置实践,从环境准备、配置文件详解、集群创建、验证、扩展到最佳实践,帮助读者从零开始搭建一个稳定、高效的 Redis Cluster 集群。

目录#

  1. 环境准备与前置要求
  2. Redis 节点配置文件详解
  3. 集群创建:从节点启动到集群初始化
  4. 集群状态验证与管理
  5. 集群配置参数调优
  6. 集群扩展:添加/删除节点
  7. 最佳实践与注意事项
  8. 常见问题排查
  9. 总结
  10. 参考资料

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-7000700017000/data/redis/7000
主节点node-7001700117001/data/redis/7001
主节点node-7002700217002/data/redis/7002
从节点node-7003700317003/data/redis/7003
从节点node-7004700417004/data/redis/7004
从节点node-7005700517005/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 no

2.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 60000

2.3 配置文件模板使用#

为每个节点创建独立的配置文件,仅需修改 portdircluster-config-fileappendfilename 等节点特有参数。例如,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 安全相关#

  • requirepassmasterauth:必须设置强密码(至少 12 位,包含大小写、数字、特殊字符)。
  • bind:生产环境绑定内网 IP(如 bind 192.168.1.100),禁止绑定 0.0.0.0
  • TLS 加密:Redis 6.0+ 支持 TLS,通过 tls-porttls-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:7000
  • 127.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>

删除主节点(需先迁移槽位):#

  1. 执行 redis-cli --cluster reshard 将主节点的槽位迁移到其他主节点。
  2. 确认槽位为空后,删除节点:
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 yescluster-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,并掌握日常管理、故障排查的核心技能。在生产环境中,还需结合监控、备份、安全策略,确保集群稳定运行。

10. 参考资料#