Redis Cluster 原理与部署:哈希槽、主从、故障转移和扩缩容

2026-07-25
1
-
- 分钟

Redis Cluster 将键空间划分为 16384 个 hash slot,并把槽分配给多个主节点。客户端根据 MOVED/ASK 重定向访问正确节点;每个主节点通常配置副本以参与故障转移。

## 核心概念

键通过 CRC16(key) mod 16384 计算槽。带 hash tag 的键只对花括号内容计算,例如 order:{1001}:itemsorder:{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 infocluster nodes、复制偏移和应用错误。不要通过同时停止多数主节点来验证生产高可用。

## 持久化与备份

Redis Cluster 的每个主节点只保存部分数据,备份必须覆盖所有主节点并记录集群拓扑。AOF/RDB 是本地持久化机制,不等于异地备份。恢复前确认各分片数据集、槽分布和应用写入已停止或被隔离。

## 安全

- 绑定受控网络,使用 ACL 与 TLS(版本和构建支持时)。

- 不直接暴露公网。

- 为管理操作使用独立账号和最小权限。

- 密码不写入脚本和命令历史。

- 限制 CONFIG、MODULE、DEBUG 和危险命令。

参考:https://redis.io/docs/latest/operate/oss_and_stack/management/scaling/

原创

Redis Cluster 原理与部署:哈希槽、主从、故障转移和扩缩容

本文链接: Redis Cluster 原理与部署:哈希槽、主从、故障转移和扩缩容

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录