易君召
易君召
发布于 2026-11-13 / 4 阅读
0

Redis Cluster 高效集群配置完整方案

Redis Cluster 原生分片集群:16384 哈希槽、Gossip 节点通信、自带故障转移,不要叠加哨兵;生产最低起步:3 主 3 从(6 节点),跨机架 / 跨可用区部署,避免单点故障域重合。 核心约束:只支持 db0,跨 slot 多 key 命令不支持;需要多 key 原子操作使用 HashTag {tag}。

一、架构选型与节点规划

1. 拓扑原则

  • 最小可用:3 主 + 3 从;每主至少 1 副本,主和副本不要同机 / 同 AZ,最好跨 3 个机架 / 可用区,保证单 AZ 故障不丢服务Redis

  • 规模建议:单集群总节点建议 ≤ 60 个;节点过多 Gossip 消息风暴、故障检测延迟上涨;超大规模用 Proxy 模式(Predixy/Corvus) 或者拆分多集群

  • 读写分离:Cluster 本身不自动路由读请求到从节点;客户端 / 代理层做读从,降低主节点 CPU 压力

  • 一致性:异步复制,不保证强一致;业务允许短暂丢数据;强一致场景不要用 Cluster

2. 硬件 / OS 基础优化(非常关键,很多性能问题根源)

# 关闭透明大页 THP(必做,fork写时复制延迟杀手)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 内核参数 /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 1024
net.ipv4.tcp_keepalive_time = 30
# 调高文件句柄
ulimit -n 65535
  • 内存分配器:jemalloc(默认),不要用 libc,减少内存碎片

  • CPU:Redis 单线程核心,单实例不要绑太多核;一台机器多实例做好 CPU 隔离、NUMA 绑定

  • 磁盘:持久化优先 SSD;机械盘 AOF rewrite 会严重卡顿

二、redis.conf 集群核心配置(可直接复制)

# 基础
port 6379
bind 0.0.0.0
protected-mode no
requirepass Redis@2026
masterauth Redis@2026
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis_6379.log

# 集群开关
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000               # 节点超时15s,主节点失联后开始故障转移
cluster-slave-validity-factor 10        # 从节点断连超过15*10=150s 不参与选主
cluster-migration-barrier 1             # 至少保留1个健康从,才允许副本迁移
cluster-require-full-coverage no        # ✅ 生产必开:部分slot不可用,其余slot继续提供服务,集群不全挂
cluster-allow-reads-when-down no        # 集群FAIL状态禁止写入,防止脑裂脏写

# 内存控制(单节点上限,预留fork内存)
maxmemory 12gb
maxmemory-policy allkeys-lru
maxmemory-samples 5

# 持久化策略(推荐RDB+AOF混合)
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes

参数说明:

  1. cluster-node-timeout:默认 15000(15s),不要太小,容易误判故障;内网稳定环境最低不低于 5s

  2. cluster-require-full-coverage no:线上最重要配置,默认 yes,一个分片挂了整个集群不可用

  3. cluster-migration-barrier:副本自动迁移,均衡分片副本数量,避免有的主没从

三、创建集群命令

所有节点启动后,使用 redis-cli 一键创建(Redis 7+)

redis-cli --cluster create \
10.0.0.1:6379 10.0.0.2:6379 10.0.0.3:6379 \
10.0.0.4:6379 10.0.0.5:6379 10.0.0.6:6379 \
--cluster-replicas 1 -a Redis@2026

--cluster-replicas 1 = 每个主分配 1 个从节点,3 主 3 从

常用运维命令

# 查看集群状态
redis-cli -a xxx --cluster check 10.0.0.1:6379
redis-cli -a xxx -c -h 10.0.0.1 -p 6379
CLUSTER INFO
CLUSTER NODES

# 扩容:添加新master,reshard迁移槽
redis-cli --cluster add-node new_ip:6379 exist_ip:6379 --cluster-master-id xxx
redis-cli --cluster reshard exist_ip:6379

# 缩容:迁移完槽后删除节点
redis-cli --cluster del-node ip:port nodeid

-c 参数:客户端自动跟随 MOVED 重定向,本地维护 slot 映射表

四、客户端选型(决定集群效率)

  • Java:Redisson(首选),内置集群路由、连接池、重试、读写分离;JedisCluster 可用但维护弱

  • Go:redigo、go-redis

  • Python:redis-py Cluster

  • 不推荐裸客户端自己处理 MOVED/ASK,极易踩坑

  • 连接池:每个节点独立连接池,控制连接数;不要无限创建连接

  • 读写分离方案:客户端侧配置 readFrom=SLAVE,读请求打到从节点;注意从节点读是最终一致性

Proxy 方案(适合多语言、老旧客户端)

Predixy / Corvus / Redis Cluster Proxy:统一入口,客户端像访问单机 Redis,代理内部维护 slot 路由;代价多一层网络转发。

五、Key 设计与性能优化(重中之重)

  1. 哈希槽均衡:key 尽量随机,不要大量固定前缀;热点 key 单独处理

  2. HashTag:{order:10001}:pay、{order:10001}:status,大括号内内容参与 CRC16 计算,同 tag 落到同一个 slot,支持 mget/mset;不要把所有 key 放同一个 tag,退化成单点瓶颈

  3. 避免大 key、大 list、大 hash;大 key 迁移、复制、过期阻塞主线程

  4. 慢命令:keys *、hgetall、flushall 禁止在线上集群执行;用 scan 分批遍历

  5. 过期策略:集中过期会产生风暴,key 过期时间增加随机偏移

六、持久化、备份与故障

  • 缓存场景:可关闭 AOF,只开 RDB;数据不能丢:RDB+AOF 混合(aof-use-rdb-preamble yes)

  • 备份:定时执行 redis-cli --cluster backup,或者单独节点 RDB 文件拷贝

  • 故障转移:Gossip 多数派投票,主节点下线后,健康从节点自动升主;原主恢复后自动变成副本

  • 脑裂风险:cluster-allow-reads-when-down no,集群标记 FAIL 时禁止写入,防止网络分区双主写

七、监控指标(Prometheus+Grafana)

重点监控:

  • cluster_state:ok/fail

  • cluster_slots_assigned、cluster_slots_ok:16384 全部 ok 才正常

  • 主从延迟:master_repl_offset差值

  • 内存碎片率、evicted_keys、expired_keys

  • 命令耗时、redis_blocked_clients、client_longest_output_list

  • 网络:节点间 Gossip 流量、TCP 重传

告警:cluster_state=fail、slot 丢失、主从延迟飙升、内存快打满、节点 down

八、常见坑清单

  1. ❌ 集群模式用 select 1:不支持多 db,只能 db0

  2. ❌ 跨 slot mget、pipeline、事务:直接报错,必须 HashTag

  3. ❌ 节点端口不通:集群除 6379,还要开放 port+10000(集群总线端口)

  4. ❌ 单节点内存过大:fork RDB 时 STW 卡顿,建议单实例控制在 16G 以内

  5. ❌ cluster-require-full-coverage yes:一个分片挂,整个集群不可用

  6. ❌ 主从放同一台宿主机:机器宕机直接丢分片

九、部署方案对比

方案

适用

特点

Redis Cluster

大容量、高写入、需要水平扩写

分片 + HA,原生,客户端复杂

Sentinel 哨兵

数据单机放得下,只需要高可用、读扩展

不分片,写瓶颈在单主

Proxy+Cluster

多语言、老业务、不想改客户端

统一入口,增加转发延迟


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/redis-cluster-high-performance-configuration-complete-guide

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/