当前位置:首页 > 问答 > 正文

Redis集群 动手实践:自己动手,打造Redis集群,手写redis集群

自己动手,打造Redis集群:从零开始的手写实践

场景引入:当单机Redis扛不住了

记得上周我们电商平台搞大促,平时运行良好的Redis突然就扛不住了,高峰期每秒近10万的请求直接把单实例Redis打趴下,缓存雪崩导致数据库也跟着崩溃,整个网站瘫痪了近半小时,事后复盘时,CTO拍着桌子说:"必须上Redis集群!"

作为团队里的"Redis专家",我主动请缨研究Redis集群方案,但当我看到各大云厂商动辄上万的集群报价时,突然萌生了一个大胆的想法:为什么不自己动手搭建一个Redis集群呢?

Redis集群基础知识

为什么需要Redis集群?

Redis集群主要解决两个问题:

  1. 数据分片:单机内存有限,集群可以把数据分散到多台机器 2.数据分片:Redis集群使用哈希槽(hash slot)进行数据分片,共有16384个槽位

高可用:每个分片有主从复制,主节点挂了从节点能顶上

去中心化:节点间通过Gossip协议通信,不需要额外的代理层

准备工作

硬件准备

我找了三台闲置的服务器(其实用虚拟机也行),配置如下:

  • CPU:4核
  • 内存:8GB
  • 系统:Ubuntu 22.04

软件准备

确保每台机器上已经安装:

  • Redis 7.0+(2025年最新稳定版)
  • Ruby环境(用于运行集群管理脚本)
  • 基本的网络工具(ping, telnet等)

搭建6节点Redis集群

我决定搭建一个3主3从的最小可用集群,以下是详细步骤:

第一步:配置Redis节点

在每台机器上创建两个Redis实例(一个主一个从),共6个节点,以第一台机器为例:

# 创建两个配置目录
mkdir -p /opt/redis/cluster/{7000,7001}
# 主节点7000配置
cat > /opt/redis/cluster/7000/redis.conf <<EOF
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
EOF
# 从节点7001配置
cat > /opt/redis/cluster/7001/redis.conf <<EOF
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
EOF

其他两台机器也类似操作,端口号分别为7002/7003和7004/7005。

Redis集群 动手实践:自己动手,打造Redis集群,手写redis集群

第二步:启动所有节点

在每台机器上执行:

redis-server /opt/redis/cluster/7000/redis.conf
redis-server /opt/redis/cluster/7001/redis.conf

第三步:创建集群

使用redis-cli的集群命令创建集群:

redis-cli --cluster create \
  192.168.1.101:7000 192.168.1.101:7001 \
  192.168.1.102:7002 192.168.1.102:7003 \
  192.168.1.103:7004 192.168.1.103:7005 \
  --cluster-replicas 1

这个命令会自动分配主从关系,并把16384个槽位均匀分配到3个主节点上。

验证集群状态

检查集群节点

redis-cli -p 7000 cluster nodes

输出类似这样:

a1b2c3... 192.168.1.101:7000@17000 myself,master - 0 1650000000000 1 connected 0-5460
d4e5f6... 192.168.1.102:7002@17002 master - 0 1650000001000 2 connected 5461-10922
g7h8i9... 192.168.1.103:7004@17004 master - 0 1650000002000 3 connected 10923-16383
...

可以看到3个主节点各自负责一部分哈希槽。

测试数据读写

# 连接到集群
redis-cli -c -p 7000
# 设置几个键值
127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 192.168.1.103:7004
OK
127.0.0.1:7004> set hello world
-> Redirected to slot [866] located at 192.168.1.101:7000
OK
127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 192.168.1.103:7004
"bar"

注意观察重定向过程,这正是集群工作的体现!

集群运维实战

添加新节点

随着业务增长,我们需要扩容,添加一个新主节点:

# 在新机器上启动一个Redis实例7006
redis-server /opt/redis/cluster/7006/redis.conf
# 将新节点加入集群
redis-cli --cluster add-node 192.168.1.104:7006 192.168.1.101:7000
# 重新分配槽位
redis-cli --cluster reshard 192.168.1.101:7000

故障转移测试

手动停止一个主节点(比如7000),观察其从节点(7001)是否自动提升为主节点:

Redis集群 动手实践:自己动手,打造Redis集群,手写redis集群

redis-cli -p 7000 shutdown
# 等待几秒后检查
redis-cli -p 7001 cluster nodes | grep 7001

应该能看到7001的角色从"slave"变成了"master"。

踩坑经验分享

在搭建过程中,我遇到了几个典型问题:

  1. 节点无法互通:防火墙没开,记得开放集群总线端口(默认是Redis端口+10000)

  2. 槽位未完全分配:创建集群后一定要检查所有16384个槽位是否都已分配

  3. 内存不足:集群模式下每个key会有额外内存开销,实际可用内存比单机少10%左右

  4. 客户端兼容性:有些老版本客户端不支持集群模式,需要升级

性能优化建议

经过一段时间的运行,我总结了几点优化经验:

  1. 合理设置hash_tag:对相关key使用{}包裹相同部分,确保它们落在同一节点

    Redis集群 动手实践:自己动手,打造Redis集群,手写redis集群

  2. 避免大key:集群环境下大key会导致节点负载不均衡

  3. 调整超时参数:根据网络状况适当调整cluster-node-timeout

  4. 监控必不可少:使用redis-cli --cluster check定期检查集群健康状态

写在最后

从决定自建Redis集群到最终上线,我花了整整两周时间,虽然过程充满挑战,但收获巨大,现在我们的电商平台平稳支撑着日均百万级的请求,集群自动处理了三次硬件故障,真正实现了高可用。

自己动手搭建Redis集群不仅节省了成本,更重要的是让我深入理解了分布式系统的核心原理,如果你也面临Redis性能瓶颈,不妨尝试自己动手搭建一个集群,这绝对是一次值得的投资!

发表评论