本文覆盖 Redis 官方 Cluster 集群(分片集群,无中心化),从架构选型、硬件规划、部署、参数调优、运维高可用、性能优化全流程落地,适配生产高并发场景。
一、集群架构选型(核心决定效率)
1. Redis Cluster 标准架构规则
至少 6 个节点:3 主 + 3 从(最小生产规格);
主节点负责数据分片,从节点做副本、故障转移;
数据槽位共
16384个,均匀分配给所有主节点;去中心化,任意节点可接收命令,自动转发对应槽位主库;
故障判定:半数以上主节点感知某主下线,触发从库升主。
2. 节点配比推荐(按业务量级)
3. 硬件与服务器隔离规范(高效基础)
主从物理隔离:同一台机器不能同时部署同一分片的主 + 从,避免单机宕机分片数据全丢;
CPU:Redis 单线程处理命令,优先 3.5GHz+ 高主频 CPU,多核心用于持久化、网络 IO;
内存:单节点内存建议 16G~64G,单节点最大不超 96G(RDB/AOF fork 阻塞风险);
磁盘:
高性能场景:NVMe SSD(AOF 刷盘低延迟);
禁止机械硬盘(AOF 刷盘阻塞主进程);
网络:万兆网卡,集群节点内网互通,关闭防火墙 / 限制集群端口。
二、部署前环境准备
1. 端口规划(单机器多节点)
Redis Cluster 需要两个端口:
业务端口:
6379集群总线端口:业务端口 + 10000 =
16379(节点间通信、故障检测)
示例 6 节点端口规划(3 台机器,每台 2 节点):
机器 1:6379(主 1)、6380(从 2)
机器 2:6381(主 2)、6382(从 3)
机器 3:6383(主 3)、6384(从 1)
2. 系统内核调优(必做,解决阻塞 / 连接溢出)
(1)文件句柄限制
Redis 大量连接会耗尽句柄,修改 /etc/security/limits.conf
conf
redis soft nofile 1048576
redis hard nofile 1048576
(2)内核 TCP 参数 /etc/sysctl.conf
conf
# 端口复用,解决短连接大量TIME_WAIT
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
# 最大文件句柄
fs.file-max = 1048576
# 减少内存swap,Redis绝对禁止swap
vm.swappiness = 0
# 脏页刷盘优化,避免fork大量阻塞
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
# 增大TCP连接队列
net.core.somaxconn = 10240
生效:sysctl -p
(3)关闭透明大页(THP,严重阻塞 fork)
bash
echo never > /sys/kernel/mm/transparent_hugepage/enabled
写入 /etc/rc.local 开机自动执行。
3. Redis 安装(推荐 7.2+ 稳定版)
7.x 大幅优化集群性能、网络 IO、分片迁移效率。
bash
# 编译安装
wget https://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz
cd redis-stable && make -j$(nproc)
make install PREFIX=/usr/local/redis
三、集群节点通用高效配置 redis.conf
所有节点基础配置统一,仅修改 port、pidfile、logfile、dbfilename 区分节点。
# 基础网络
port 6379
bind 0.0.0.0 # 集群节点互通,生产限制内网IP
protected-mode no
tcp-backlog 10240
timeout 300
tcp-keepalive 60
# 内存核心优化(决定集群吞吐)
maxmemory 48g # 单节点内存上限,根据机器调整
maxmemory-policy allkeys-lru # 缓存场景通用淘汰策略
maxmemory-samples 10 # LRU采样精度,平衡CPU与淘汰准确度
# 集群开关(核心)
cluster-enabled yes
cluster-config-file nodes-6379.conf # 集群元数据文件
cluster-node-timeout 15000 # 节点失联判定15s,不建议低于10s
# 持久化配置(高可用+性能平衡)
## RDB 定时快照(全量备份)
save 300 1000 # 5分钟1000次修改触发RDB
rdbcompression yes
rdb-checksum yes
dbfilename dump-6379.rdb
dir /data/redis/6379
## AOF 增量日志(故障快速恢复)
appendonly yes
appendfilename appendonly-6379.aof
# 刷盘策略:everysec 平衡性能与数据安全(推荐)
# always 完全不丢数据但性能暴跌;no 丢数据风险高
appendfsync everysec
no-appendfsync-on-rewrite yes # AOF重写时暂停刷盘,降低阻塞
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes # AOF混合持久化,重写生成RDB头,恢复更快
# 日志、进程
pidfile /var/run/redis-6379.pid
logfile /data/redis/6379/redis.log
loglevel notice
# 禁用危险命令(生产安全)
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
# 替代:使用 SCAN 遍历key,不阻塞集群
# 慢查询监控(定位慢命令)
slowlog-log-slower-than 10000 # 10ms以上记录慢日志
slowlog-max-len 1000
# 客户端连接限制
maxclients 100000
四、一键创建 Redis Cluster 集群
1. 启动所有节点
每个节点独立配置文件,后台启动:
bash
/usr/local/redis/bin/redis-server /data/redis/6379/redis.conf
/usr/local/redis/bin/redis-server /data/redis/6380/redis.conf
# 依次启动全部6个节点
2. redis-cli 一键构建集群(Redis 5.0+ 内置)
bash
redis-cli --cluster create \
10.0.0.1:6379 10.0.0.2:6381 10.0.0.3:6383 \
10.0.0.1:6380 10.0.0.2:6382 10.0.0.3:6384 \
--cluster-replicas 1
参数说明:
--cluster-replicas 1:每个主节点分配 1 个从节点;前半部分 IP 端口为主节点,后半自动分配从库;
执行后输入
yes确认槽位自动分配。
3. 集群验证
bash
# 连接集群任意节点,-c 开启集群自动槽位转发
redis-cli -c -h 10.0.0.1 -p 6379
# 查看集群完整状态
CLUSTER INFO
CLUSTER NODES
# 校验槽位分配是否完整(无missing槽位)
redis-cli --cluster check 10.0.0.1:6379
五、集群核心性能调优(高效关键)
1. 内存调优
maxmemory预留 20% 系统空闲内存,禁止内存打满触发 OOM;缓存业务固定使用
allkeys-lru;带过期业务volatile-lru;大 Key 拆分:单个 value >100k 会阻塞网络、迁移缓慢,拆分为 Hash/List 分段存储。
2. 持久化性能平衡
高吞吐缓存业务:
appendfsync everysec,混合 AOF;金融零丢失场景:
appendfsync always,必须高配 SSD;低峰期手动触发
BGREWRITEAOF,避免业务高峰自动重写阻塞。
3. 集群迁移 / 扩容优化
集群扩容新增主节点流程:
启动新空白 Redis 节点;
添加进集群:
redis-cli --cluster add-node 新节点IP:端口 任意集群节点IP:端口;重新分片迁移槽位:
redis-cli --cluster reshard;为新主分配从节点:
redis-cli --cluster add-node 从节点IP:端口 集群节点IP:端口 --cluster-slave --cluster-master-id 新主节点ID
迁移调优参数(减少业务卡顿):
conf
cluster-require-full-coverage no # 部分槽位下线集群仍可正常访问在线槽位(生产必开)
4. 客户端优化(大幅降低集群转发损耗)
使用智能集群客户端:
Java:Lettuce(异步、支持槽位缓存,推荐),禁止老旧 JedisCluster;
Go:redigo/rediscluster;Python:redis-py-cluster
客户端本地缓存槽位映射,避免每次命令转发重定向;
批量操作使用
Pipeline,减少网络往返;多 Key 操作约束:同一槽位的 Key 才能批量 MSET/MGET,不同槽位多 Key 命令报错,业务设计时用 HashTag 强制 Key 落到同一槽位:
plaintext
# HashTag 大括号内内容决定槽位 {user:1000}:info、{user:1000}:cart 落在同一个分片
六、高可用保障配置(集群稳定基础)
cluster-require-full-coverage no
默认 yes:任意槽位不可用整个集群拒绝写入;生产改为 no,仅不可用槽位报错,其余正常读写。
合理
cluster-node-timeout 15000过短易网络抖动误判节点下线,过长故障转移恢复慢,10~15s 最佳。
禁止单机主从同机,避免单点宕机分片数据丢失;
定时备份 RDB+AOF,备份文件同步至异地存储;
监控指标:节点存活、槽位完整度、主从复制延迟、慢查询、内存淘汰、AOF 阻塞。
七、常见集群性能问题解决方案
集群频繁重定向(ASK/MOVED)
原因:客户端未缓存槽位、大量随机 Key;解决:更换 Lettuce、使用 HashTag 聚合批量 Key。
AOF 刷盘阻塞 Redis 主线程
原因:机械硬盘、appendfsync always;解决:更换 NVMe SSD,everysec 刷盘。
主从复制延迟高
优化:关闭从节点 RDB 自动 save、从节点内存略大于主库、内网万兆网络。
槽位迁移业务卡顿
低峰期执行 reshard,调低迁移速度,开启 cluster-require-full-coverage no。
大 Key 导致集群迁移、命令执行阻塞
使用
redis-cli --bigkeys扫描大 Key,业务拆分存储。
八、运维监控配套(保障长期高效运行)
指标采集:Prometheus + redis-exporter;
可视化告警:Grafana 面板,监控告警项:
集群槽位缺失、主节点下线、从库复制中断
内存使用率 >80%、内存频繁淘汰
AOF 阻塞、慢查询突增、客户端连接溢出
定时巡检脚本:每日自动执行
--cluster check,输出集群健康报告。
九、补充:集群 vs 哨兵主从 选型区分
Redis Cluster(分片集群,本文方案)
优势:横向扩容数据容量、分片分摊读写压力,支持百 G 级海量缓存;
适用:大数据量、高 QPS 缓存业务。
Redis Sentinel 哨兵(单分片主从)
优势:部署简单、无槽位限制;
劣势:无法横向扩容存储,单节点上限;
适用:数据量小、无需扩容的小型业务。