上一篇我们搭建了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个从节点,本次搭建三主三从标准集群(生产可扩展更多节点)。为简化实操,采用单服务器多端口模拟,生产环境建议节点分散在不同服务器。

节点角色端口负责哈希槽备注
主节点170010-5460主节点
主节点270025461-10922主节点
主节点3700310923-16383主节点
从节点17004副本(无槽)主节点1副本
从节点27005副本(无槽)主节点2副本
从节点37006副本(无槽)主节点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. 手动停止主节点1:redis-cli -a 123456 -p 7001 shutdown
  2. 查看集群节点:cluster nodes,原从节点7004自动升级为主节点
  3. 重启7001节点,它会自动变为新主节点的从节点
  4. 数据读写不受影响,故障转移成功

七、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集群的全体系学习。

发表回复