易君召
易君召
发布于 2026-07-28 / 1 阅读
0
0

高效 Redis 集群完整配置方案

本文覆盖 Redis 官方 Cluster 集群(分片集群,无中心化),从架构选型、硬件规划、部署、参数调优、运维高可用、性能优化全流程落地,适配生产高并发场景。

一、集群架构选型(核心决定效率)

1. Redis Cluster 标准架构规则

  1. 至少 6 个节点:3 主 + 3 从(最小生产规格);

  2. 主节点负责数据分片,从节点做副本、故障转移;

  3. 数据槽位共 16384 个,均匀分配给所有主节点;

  4. 去中心化,任意节点可接收命令,自动转发对应槽位主库;

  5. 故障判定:半数以上主节点感知某主下线,触发从库升主。

2. 节点配比推荐(按业务量级)

业务规模

主从配比

适用场景

测试 / 小流量

3 主 3 从(6 节点)

QPS < 5w,缓存、简单计数

中大型业务

6 主 6 从(12 节点)

QPS 5w~20w,热点商品、会话缓存

超高并发

9 主 18 从(27 节点)

QPS >20w,秒杀、实时风控、排行榜

3. 硬件与服务器隔离规范(高效基础)

  1. 主从物理隔离:同一台机器不能同时部署同一分片的主 + 从,避免单机宕机分片数据全丢;

  2. CPU:Redis 单线程处理命令,优先 3.5GHz+ 高主频 CPU,多核心用于持久化、网络 IO;

  3. 内存:单节点内存建议 16G~64G,单节点最大不超 96G(RDB/AOF fork 阻塞风险);

  4. 磁盘:

    • 高性能场景:NVMe SSD(AOF 刷盘低延迟);

    • 禁止机械硬盘(AOF 刷盘阻塞主进程);

  5. 网络:万兆网卡,集群节点内网互通,关闭防火墙 / 限制集群端口。

二、部署前环境准备

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

所有节点基础配置统一,仅修改 portpidfilelogfiledbfilename 区分节点。

# 基础网络
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. 内存调优

  1. maxmemory 预留 20% 系统空闲内存,禁止内存打满触发 OOM;

  2. 缓存业务固定使用 allkeys-lru;带过期业务 volatile-lru

  3. 大 Key 拆分:单个 value >100k 会阻塞网络、迁移缓慢,拆分为 Hash/List 分段存储。

2. 持久化性能平衡

  1. 高吞吐缓存业务:appendfsync everysec,混合 AOF;

  2. 金融零丢失场景:appendfsync always,必须高配 SSD;

  3. 低峰期手动触发 BGREWRITEAOF,避免业务高峰自动重写阻塞。

3. 集群迁移 / 扩容优化

集群扩容新增主节点流程:

  1. 启动新空白 Redis 节点;

  2. 添加进集群:redis-cli --cluster add-node 新节点IP:端口 任意集群节点IP:端口

  3. 重新分片迁移槽位:redis-cli --cluster reshard

  4. 为新主分配从节点:redis-cli --cluster add-node 从节点IP:端口 集群节点IP:端口 --cluster-slave --cluster-master-id 新主节点ID

迁移调优参数(减少业务卡顿):

conf

cluster-require-full-coverage no # 部分槽位下线集群仍可正常访问在线槽位(生产必开)

4. 客户端优化(大幅降低集群转发损耗)

  1. 使用智能集群客户端

    Java:Lettuce(异步、支持槽位缓存,推荐),禁止老旧 JedisCluster;

    Go:redigo/rediscluster;Python:redis-py-cluster

  2. 客户端本地缓存槽位映射,避免每次命令转发重定向;

  3. 批量操作使用 Pipeline,减少网络往返;

  4. 多 Key 操作约束:同一槽位的 Key 才能批量 MSET/MGET,不同槽位多 Key 命令报错,业务设计时用 HashTag 强制 Key 落到同一槽位:

    plaintext

    # HashTag 大括号内内容决定槽位
    {user:1000}:info、{user:1000}:cart 落在同一个分片
    

六、高可用保障配置(集群稳定基础)

  1. cluster-require-full-coverage no

    默认 yes:任意槽位不可用整个集群拒绝写入;生产改为 no,仅不可用槽位报错,其余正常读写。

  2. 合理 cluster-node-timeout 15000

    过短易网络抖动误判节点下线,过长故障转移恢复慢,10~15s 最佳。

  3. 禁止单机主从同机,避免单点宕机分片数据丢失;

  4. 定时备份 RDB+AOF,备份文件同步至异地存储;

  5. 监控指标:节点存活、槽位完整度、主从复制延迟、慢查询、内存淘汰、AOF 阻塞。

七、常见集群性能问题解决方案

  1. 集群频繁重定向(ASK/MOVED)

    原因:客户端未缓存槽位、大量随机 Key;解决:更换 Lettuce、使用 HashTag 聚合批量 Key。

  2. AOF 刷盘阻塞 Redis 主线程

    原因:机械硬盘、appendfsync always;解决:更换 NVMe SSD,everysec 刷盘。

  3. 主从复制延迟高

    优化:关闭从节点 RDB 自动 save、从节点内存略大于主库、内网万兆网络。

  4. 槽位迁移业务卡顿

    低峰期执行 reshard,调低迁移速度,开启 cluster-require-full-coverage no。

  5. 大 Key 导致集群迁移、命令执行阻塞

    使用 redis-cli --bigkeys 扫描大 Key,业务拆分存储。

八、运维监控配套(保障长期高效运行)

  1. 指标采集:Prometheus + redis-exporter;

  2. 可视化告警:Grafana 面板,监控告警项:

    • 集群槽位缺失、主节点下线、从库复制中断

    • 内存使用率 >80%、内存频繁淘汰

    • AOF 阻塞、慢查询突增、客户端连接溢出

  3. 定时巡检脚本:每日自动执行 --cluster check,输出集群健康报告。

九、补充:集群 vs 哨兵主从 选型区分

  1. Redis Cluster(分片集群,本文方案)

    优势:横向扩容数据容量、分片分摊读写压力,支持百 G 级海量缓存;

    适用:大数据量、高 QPS 缓存业务。

  2. Redis Sentinel 哨兵(单分片主从)

    优势:部署简单、无槽位限制;

    劣势:无法横向扩容存储,单节点上限;

    适用:数据量小、无需扩容的小型业务。


评论