Redis 集群架构
Redis 集群由多个主节点(Master)和对应的从节点(Replica)组成,每个节点负责存储部分数据(分片)。采用去中心化的分布式架构,通过分片 (Sharding) 实现数据的分布式存储。
集群架构不需要哨兵节点
Redis 集群采用去中心化分布式架构,通过 16384 个哈希槽实现数据分片与负载均衡。节点间利用 Gossip 协议交换状态,支持主从复制与自动故障转移。本文详解了集群特点、通信机制及故障恢复流程,并提供了生产级 3 主 3 从的部署方案,涵盖基础配置、安装、集群创建及高可用验证步骤,适用于百万级日活场景。

Redis 集群由多个主节点(Master)和对应的从节点(Replica)组成,每个节点负责存储部分数据(分片)。采用去中心化的分布式架构,通过分片 (Sharding) 实现数据的分布式存储。
集群架构不需要哨兵节点
| 核心机制 | 技术实现 | 设计目标 |
|---|
| 分布式数据分片 | 采用 16384 Slot 哈希槽分区,数据按 CRC16(key) mod 16384 分配到不同节点 | 负载均衡 & 水平扩展 |
| 去中心化架构 | 节点间通过 Gossip 协议交换状态(PING/PONG),无单点依赖 | 高可用 & 故障自愈 |
| 主从复制模型 | 每个分片包含 1 主 N 从(建议至少 1 从),主节点故障时从节点自动晋升(Raft 选主) | 数据冗余 & 快速恢复 |
| 客户端重定向 | 客户端直连任意节点,若访问错误分片返回 MOVED 响应并重定向 | 降低代理层开销 |
Redis 集群将整个数据空间划分为 16384 个哈希槽(编号 0~16383),每个槽对应一个数据分片。
分配算法:slot = CRC16(key) % 16384
定位节点
1. 客户端计算键的哈希槽
2. 查找槽所在节点
3. 直接连接对应节点操作数据
集群维护一个槽到节点的映射表(CLUSTER SLOTS 命令可查看),客户端根据槽号找到对应节点。
动态扩缩容
添加节点:新节点加入时,会从现有节点迁移部分哈希槽(如从 Node A 迁移 1000 个槽到 Node C)。
删除节点:将待删除节点的哈希槽重新分配到其他节点。
Redis 集群使用 Gossip 协议传播节点状态信息(如新增节点、故障检测、槽迁移等)
| 消息类型 | 说明 |
|---|---|
| MEET | 手动触发新节点加入集群 |
| PING | 检测节点健康状态,节点定期交换元数据(如槽分配、IP 地址、端口) |
| PONG | 对 PING/MEET 的响应,节点定期交换元数据(如槽分配、IP 地址、端口) |
| FAIL | 广播故障节点信息,通知其他节点某节点已下线,触发故障转移 |
| PUBLISH | 发布订阅消息 |
1、故障检测
主观下线(PFail):节点 A 发现节点 B 超过 cluster-node-timeout 未响应,标记 B 为 PFail。
客观下线(Fail):节点 A 通过 Gossip 协议将 PFail 广播给其他节点,若多数节点确认 B 不可达,则标记 B 为 Fail。
2、故障转移
1)故障检测:超过半数主节点确认某主节点下线
2)满足条件的 Replica 选举:
基于 Raft 算法的选举机制
优先选择复制偏移量最大的,数据最新从节点
3)配置更新:新主节点接管槽位并通知集群
3、槽重新分配
新 Master 接管原 Master 的哈希槽。
其他节点更新槽映射表。
硬件:3 主 3 从,不用哨兵节点,针对大型公司(日活百万级至千万级,QPS 10 万 +)的场景
| 主机名 | IP 地址 | 角色 | 硬件配置 | 服务端口 |
|---|---|---|---|---|
| redis-m1 | 192.168.1.1 | 主节点 1 | 16 核/64GB/1TB | 6379, 16379 (集群总线) |
| redis-m2 | 192.168.1.2 | 主节点 2 | 16 核/64GB/1TB | 6379, 16379 |
| redis-m3 | 192.168.1.3 | 主节点 3 | 16 核/64GB/1TB | 6379, 16379 |
| redis-s1 | 192.168.1.4 | 从节点 1 | 16 核/64GB/1TB | 6379, 16379 |
| redis-s2 | 192.168.1.5 | 从节点 2 | 16 核/64GB/1TB | 6379, 16379 |
| redis-s3 | 192.168.1.6 | 从节点 3 | 16 核/64GB/1TB | 6379, 16379 |
说明:
# 设置主机名(根据角色修改)
hostnamectl set-hostname redis-m1 # 主节点 1
hostnamectl set-hostname redis-m2 # 主节点 2
hostnamectl set-hostname redis-m3 # 主节点 3
hostnamectl set-hostname redis-s1 # 从节点 1
hostnamectl set-hostname redis-s2 # 从节点 2
hostnamectl set-hostname redis-s3 # 从节点 3
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 或者开放端口
# firewall-cmd --permanent --add-port=6379/tcp --add-port=26379/tcp
# firewall-cmd --reload
# 关闭 SELinux(临时)
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 方式一:源码编译
cd /usr/local/src
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar xzf redis-7.2.4.tar.gz
cd redis-7.2.4
make && make install PREFIX=/usr/local/redis
# 创建数据目录和配置目录
mkdir -p /data/redis/{data,logs,conf,run}
useradd redis -s /sbin/nologin -M
chown -R redis:redis /data/redis /usr/local/redis
# 启动 redis[暂时不启动]
./redis-server /data/redis/conf/redis.conf
以 redis-m1(192.168.1.1)为例,编辑 /data/redis/conf/redis.conf
# 集群配置
cluster-enabled yes
cluster-config-file /data/redis/conf/nodes-6379.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.1.1 # 替换为本机 IP
cluster-announce-port 6379 # redis 端口
cluster-announce-bus-port 16379 # redis 集群总线端口
# 以下配置和主从架构一致即可
# 基础配置
# 主节点认证密码(可选,建议设置)
# 持久化配置 RDB+AOF
# AOF 配置(可根据需求选择开启)
# 内存管理(根据实际内存调整,留出系统内存)
启动 redis
./redis-server /data/redis/conf/redis.conf
从节点配置与主节点基本相同,仅 cluster-announce-ip 需修改为对应 IP。
以 redis-s1(192.168.1.4)为例,配置文件同上,只需将 cluster-announce-ip 改为 192.168.1.4。
# 集群配置
cluster-enabled yes
cluster-config-file /data/redis/conf/nodes-6379.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.1.4 # 替换为本机 IP
cluster-announce-port 6379
cluster-announce-bus-port 16379
启动 redis
./redis-server /data/redis/conf/redis.conf
在任意一台有 redis-cli 的节点(如 redis-m1)执行:
# 列出所有 6 个节点的 IP:端口,为每个主节点分配 1 个从节点。
./redis-cli -a Redis123 --cluster create \
192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 \
192.168.1.4:6379 192.168.1.5:6379 192.168.1.6:6379 \
--cluster-replicas 1
执行后会显示分配方案,确认后输入 yes。
等待片刻,集群创建成功。
redis-cli -a Redis123 -c -h 192.168.1.1 cluster info
输出示例:
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_known_nodes:6
cluster_size:3
redis-cli -a Redis123 -c -h 192.168.1.1 cluster nodes
应列出 6 个节点,包含主从关系及槽位分配
redis-cli -a Redis123 -c -h 192.168.1.1 set foo bar
redis-cli -a Redis123 -c -h 192.168.1.1 get foo
systemctl stop redissystemctl start redis若需将从节点提升为主,可在从节点执行:
redis-cli -a Redis123 -h 192.168.1.4 -p 6379 CLUSTER FAILOVER
总写能力:3 个主节点处理写请求,可线性扩展,总写 QPS 约 15 万~24 万(按单节点 5~8 万估算)。
总读能力:如果所有读请求都发送到主节点,则总读 QPS 同样约 15 万24 万;如果允许从节点处理读(通过客户端配置),则总读 QPS 可接近 **30 万48 万**(3 主 +3 从同时服务读,但需注意从节点可能有一定延迟)。
总混合 QPS:在读写比例 2:8 下,总 QPS 可达 20 万~30 万。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online