文章目录
- Redis集群架构
- 生产级集群部署文档
-
- 基础配置-所有节点
- 安装Redis-所有节点
- 配置Redis集群节点
-
- [主节点配置(redis-m1, redis-m2, redis-m3)](#主节点配置(redis-m1, redis-m2, redis-m3))
- [从节点配置(redis-s1, redis-s2, redis-s3)](#从节点配置(redis-s1, redis-s2, redis-s3))
- 集群配置
- 验证
Redis集群架构
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协议传播节点状态信息(如新增节点、故障检测、槽迁移等)
- 每秒随机选择5个节点中最久未通信的节点进行PING
- 携带自身和其他节点的状态信息
- 收到PING后回复PONG消息

| 消息类型 | 说明 |
|---|---|
| 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, |
说明:
- 集群共6个节点,3主3从,16384个槽位均匀分布在3个主节点。
- 每个从节点为其对应主节点的副本(由集群自动分配,也可手动指定)。
- 所有服务器之间网络互通,防火墙开放 6379 (Redis)和 16379(集群总线)端口。
- 主从节点和哨兵节点分开部署,避免资源争用,提高稳定性。
基础配置-所有节点
java
# 设置主机名(根据角色修改)
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
安装Redis-所有节点
shell
# 方式一:源码编译
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集群节点
主节点配置(redis-m1, redis-m2, redis-m3)
以 redis-m1(192.168.1.1)为例, 编辑 /data/redis/conf/redis.conf
java
# 集群配置
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
从节点配置(redis-s1, redis-s2, redis-s3)
从节点配置与主节点基本相同,仅 cluster-announce-ip 需修改为对应IP。
以 redis-s1(192.168.1.4)为例,配置文件同上,只需将 cluster-announce-ip 改为 192.168.1.4。
java
# 集群配置
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)执行:
shell
# 列出所有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
输出示例:
plain
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
高可用测试
- 模拟主节点故障
- 在 redis-m1上执行后等待30s:systemctl stop redis
- Redis Cluster会自动将从节点(例如 redis-s1)提升为新主节点。
- 恢复原主节点
- 启动redis-m1:systemctl 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万。