Redis Cluster 将键空间划分为 16384 个 hash slot,并把槽分配给多个主节点。客户端根据 MOVED/ASK 重定向访问正确节点;每个主节点通常配置副本以参与故障转移。
## 核心概念
键通过 CRC16(key) mod 16384 计算槽。带 hash tag 的键只对花括号内容计算,例如 order:{1001}:items 与 order:{1001}:total 落在同一槽,可执行多键操作。
Cluster 提供分片和一定可用性,但不是强一致系统。网络分区、异步复制和故障切换期间可能丢失最近写入;多数主节点不可用时,集群会停止服务。
## 最小实验拓扑
常见实验为 3 主 3 从,生产还需跨主机、机架或可用区分布。每个节点配置唯一端口、持久目录、cluster-enabled、AOF/RDB 策略和受控网络。
```conf
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
dir /var/lib/redis/7000
appendonly yes
protected-mode yes
```
创建:
```bash
redis-cli --cluster create \
redis1:7000 redis2:7000 redis3:7000 \
redis4:7000 redis5:7000 redis6:7000 \
--cluster-replicas 1
redis-cli --cluster check redis1:7000
```
节点间除客户端端口外还需要 cluster bus 通信。必须在防火墙、安全组、容器网络和 NAT 环境中正确暴露 announce 地址与端口。
## 客户端要求
使用支持 Redis Cluster 的客户端并配置连接池、超时、重试上限和拓扑刷新。不要在应用中固定单个节点。跨槽多键命令、事务和 Lua 脚本受到限制,数据模型设计时就要确定 hash tag。
## 扩容与缩容
添加节点后并不会自动获得槽,需要 reshard:
```bash
redis-cli --cluster add-node NEW_NODE EXISTING_NODE
redis-cli --cluster reshard EXISTING_NODE
```
移除主节点前先迁走全部槽,再确认其副本关系和客户端拓扑已更新。操作期间观察延迟、带宽、复制积压和失败重试。
## 故障转移
副本检测主节点不可达,在集群多数主节点授权后提升。测试时关注 cluster info、cluster nodes、复制偏移和应用错误。不要通过同时停止多数主节点来验证生产高可用。
## 持久化与备份
Redis Cluster 的每个主节点只保存部分数据,备份必须覆盖所有主节点并记录集群拓扑。AOF/RDB 是本地持久化机制,不等于异地备份。恢复前确认各分片数据集、槽分布和应用写入已停止或被隔离。
## 安全
- 绑定受控网络,使用 ACL 与 TLS(版本和构建支持时)。
- 不直接暴露公网。
- 为管理操作使用独立账号和最小权限。
- 密码不写入脚本和命令历史。
- 限制 CONFIG、MODULE、DEBUG 和危险命令。
参考:https://redis.io/docs/latest/operate/oss_and_stack/management/scaling/