上一篇我们搭建了Redis哨兵模式,实现了主从架构的自动故障切换,彻底解决了单机Redis的高可用问题,足以应对中小规模的业务场景。但随着业务体量增长,海量数据存储、超高并发写入的需求随之而来,无论是单机Redis还是主从+哨兵架构,都会遇到单机存储上限、写请求无法横向扩容的瓶颈。
这时候就需要Redis官方的分布式解决方案——Redis Cluster(集群)登场。它通过数据分片实现横向扩容,同时整合主从复制与故障转移,既能支撑亿级数据存储,又能保证集群高可用。本篇就从零搭建三主三从Redis Cluster集群,从原理、搭建、验证到运维,全程手把手教学,新手也能轻松落地分布式Redis架构。
核心定位:Redis Cluster是Redis官方分布式方案,无中心节点,支持数据自动分片、主从冗余、故障自动转移,突破单机性能与存储限制,是大型业务场景的首选Redis架构。
一、Redis Cluster核心原理
1. 数据分片:哈希槽机制
Redis Cluster最核心的设计是哈希槽(Hash Slot),整个集群被划分为16384个哈希槽(0-16383),所有数据通过Key的CRC16算法取模,映射到对应的哈希槽中。
- 集群中每个主节点负责一部分哈希槽,数据按槽分布存储,实现分片扩容
- 新增/删除节点时,只需迁移对应哈希槽,无需全量数据搬迁,扩容无感
- 只有主节点处理哈希槽,从节点作为副本,负责数据备份与故障顶替
2. 高可用机制:主从+故障转移
- 集群采用主从分离架构,每个主节点搭配1-多个从节点,保证数据冗余
- 集群内置类似哨兵的故障检测机制,主节点宕机后,自动选举对应的从节点升级为主节点
- 集群容错:半数以上主节点可达,集群正常运行;主节点无可用从节点,集群宕机
3. 集群核心优势
- 横向扩容:轻松扩展至数百节点,支撑TB级数据存储
- 读写分离:主节点负责写,从节点负责读,并发性能翻倍
- 高可用:自动故障转移,无需额外部署哨兵组件
- 无中心节点:集群去中心化,无单点瓶颈
- 平滑扩容:在线迁移哈希槽,业务不中断
二、搭建前准备:环境规划
Redis Cluster集群至少需要3个主节点,为保证高可用,每个主节点配置1个从节点,本次搭建三主三从标准集群(生产可扩展更多节点)。为简化实操,采用单服务器多端口模拟,生产环境建议节点分散在不同服务器。
| 节点角色 | 端口 | 负责哈希槽 | 备注 |
|---|---|---|---|
| 主节点1 | 7001 | 0-5460 | 主节点 |
| 主节点2 | 7002 | 5461-10922 | 主节点 |
| 主节点3 | 7003 | 10923-16383 | 主节点 |
| 从节点1 | 7004 | 副本(无槽) | 主节点1副本 |
| 从节点2 | 7005 | 副本(无槽) | 主节点2副本 |
| 从节点3 | 7006 | 副本(无槽) | 主节点3副本 |
前置条件:服务器已安装Redis(5.0以上版本,推荐7.0+);防火墙开放7001-7006端口(集群总线端口为端口+10000,需同步放行);关闭SELinux,避免节点通信受阻。
三、创建集群节点配置
1. 创建节点目录
# 进入Redis安装目录
cd /usr/local/redis
# 创建集群总目录
mkdir redis-cluster
# 进入集群目录,创建6个节点子目录
cd redis-cluster
mkdir 7001 7002 7003 7004 7005 7006
2. 编写节点配置文件
以7001节点为例,创建redis.conf配置,其余节点仅修改端口即可复用。
# 进入7001目录
cd 7001
vim redis.conf
# 节点端口
port 7001
# 后台运行
daemonize yes
# 进程PID文件
pidfile /var/run/redis_7001.pid
# 日志文件
logfile "/usr/local/redis/redis-cluster/7001/redis.log"
# 数据文件目录
dir /usr/local/redis/redis-cluster/7001
# 开启集群模式
cluster-enabled yes
# 集群配置文件(自动生成)
cluster-config-file nodes_7001.conf
# 集群心跳超时时间(毫秒)
cluster-node-timeout 5000
# 开启AOF持久化
appendonly yes
# 集群节点密码(统一密码)
requirepass 123456
masterauth 123456
# 允许远程连接
bind 0.0.0.0
protected-mode no
3. 快速配置其余节点
将7001目录的redis.conf复制到其余5个节点目录,批量修改port、pidfile、logfile、dir、cluster-config-file为对应端口号,完成所有节点配置。
四、启动所有集群节点
# 依次启动6个节点
redis-server /usr/local/redis/redis-cluster/7001/redis.conf
redis-server /usr/local/redis/redis-cluster/7002/redis.conf
redis-server /usr/local/redis/redis-cluster/7003/redis.conf
redis-server /usr/local/redis/redis-cluster/7004/redis.conf
redis-server /usr/local/redis/redis-cluster/7005/redis.conf
redis-server /usr/local/redis/redis-cluster/7006/redis.conf
# 检查节点进程,确认6个节点均启动成功
ps -ef | grep redis
五、创建Redis Cluster集群
Redis 5.0+使用redis-cli –cluster命令创建集群,替代旧版ruby脚本,操作更简便。
# 创建三主三从集群,分配哈希槽
redis-cli -a 123456 --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
--cluster-replicas 1:表示每个主节点配置1个从节点- 执行后输入yes,确认哈希槽分配,等待集群创建完成
六、集群验证与测试
1. 查看集群状态
# 连接任意集群节点
redis-cli -c -a 123456 -p 7001
# 查看集群节点信息
cluster nodes
# 查看集群槽分配状态
cluster slots
# 查看集群整体状态
cluster info
出现cluster_state:ok,代表集群正常运行,哈希槽分配完整。
2. 数据分片测试
# 写入测试数据,集群自动路由到对应节点
set name testcluster
set age 20
set score 99
# 读取数据,验证分片正常
get name
get age
get score
命令行自动切换至对应节点,数据读写正常,说明集群分片生效。
3. 故障转移测试
- 手动停止主节点1:
redis-cli -a 123456 -p 7001 shutdown - 查看集群节点:
cluster nodes,原从节点7004自动升级为主节点 - 重启7001节点,它会自动变为新主节点的从节点
- 数据读写不受影响,故障转移成功
七、Redis Cluster常用运维命令
1. 集群基础运维
# 查看集群节点
redis-cli -c -a 密码 -p 端口 cluster nodes
# 查看集群状态
redis-cli -c -a 密码 -p 端口 cluster info
# 检查集群槽分配是否完整
redis-cli -a 密码 --cluster check 127.0.0.1:7001
2. 集群扩容(新增主节点)
# 添加新节点
redis-cli -a 密码 --cluster add-node 新节点IP:端口 现有节点IP:端口
# 迁移哈希槽,完成扩容
redis-cli -a 密码 --cluster reshard 现有节点IP:端口
3. 集群缩容(删除节点)
# 迁移目标节点哈希槽至其他节点
redis-cli -a 密码 --cluster reshard 现有节点IP:端口
# 删除节点
redis-cli -a 密码 --cluster del-node 节点IP:端口 节点ID
八、集群常见坑与避坑指南
1. 集群创建失败
- 原因:端口未放行、集群总线端口(端口+10000)未开放、配置文件错误
- 解决:放行所有节点端口+10000端口,核对cluster-enabled配置
2. 集群状态为fail
- 原因:哈希槽分配不完整、主节点无可用从节点、节点超时
- 解决:修复故障节点,重新分配槽位,保证每个主节点有从节点
3. 批量操作/事务失效
- 原因:Key映射到不同节点,集群不支持跨节点批量操作
- 解决:使用HashTag(如{user}name)强制Key分配到同一节点
4. 客户端连接报错
- 解决:连接时加
-c参数开启集群模式,使用支持集群的客户端
九、生产环境优化建议
- 节点部署:主从节点分散在不同服务器/机架,避免物理机故障导致集群宕机
- 槽分配:均衡分配哈希槽,避免单节点数据过载
- 内存控制:单节点内存控制在10G以内,防止大内存fork阻塞
- 密码管控:集群统一强密码,禁止公网直接访问集群端口
- 监控告警:监控集群状态、槽分配、节点存活、内存使用率
总结
本篇我们完成了Redis Cluster三主三从集群的搭建、验证与故障测试,实现了数据分片存储、横向扩容和内置高可用,彻底突破单机Redis的性能与存储瓶颈,足以支撑大型业务的海量并发需求。
至此,我们已经完成了从Redis基础入门、安装配置、数据类型、持久化、主从、哨兵到Cluster集群的全体系学习。