记得上周我们电商平台搞大促,平时运行良好的Redis突然就扛不住了,高峰期每秒近10万的请求直接把单实例Redis打趴下,缓存雪崩导致数据库也跟着崩溃,整个网站瘫痪了近半小时,事后复盘时,CTO拍着桌子说:"必须上Redis集群!"
作为团队里的"Redis专家",我主动请缨研究Redis集群方案,但当我看到各大云厂商动辄上万的集群报价时,突然萌生了一个大胆的想法:为什么不自己动手搭建一个Redis集群呢?
Redis集群主要解决两个问题:
高可用:每个分片有主从复制,主节点挂了从节点能顶上
去中心化:节点间通过Gossip协议通信,不需要额外的代理层
我找了三台闲置的服务器(其实用虚拟机也行),配置如下:
确保每台机器上已经安装:
我决定搭建一个3主3从的最小可用集群,以下是详细步骤:
在每台机器上创建两个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-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-cli -p 7000 shutdown # 等待几秒后检查 redis-cli -p 7001 cluster nodes | grep 7001
应该能看到7001的角色从"slave"变成了"master"。
在搭建过程中,我遇到了几个典型问题:
节点无法互通:防火墙没开,记得开放集群总线端口(默认是Redis端口+10000)
槽位未完全分配:创建集群后一定要检查所有16384个槽位是否都已分配
内存不足:集群模式下每个key会有额外内存开销,实际可用内存比单机少10%左右
客户端兼容性:有些老版本客户端不支持集群模式,需要升级
经过一段时间的运行,我总结了几点优化经验:
合理设置hash_tag:对相关key使用{}包裹相同部分,确保它们落在同一节点
避免大key:集群环境下大key会导致节点负载不均衡
调整超时参数:根据网络状况适当调整cluster-node-timeout
监控必不可少:使用redis-cli --cluster check定期检查集群健康状态
从决定自建Redis集群到最终上线,我花了整整两周时间,虽然过程充满挑战,但收获巨大,现在我们的电商平台平稳支撑着日均百万级的请求,集群自动处理了三次硬件故障,真正实现了高可用。
自己动手搭建Redis集群不仅节省了成本,更重要的是让我深入理解了分布式系统的核心原理,如果你也面临Redis性能瓶颈,不妨尝试自己动手搭建一个集群,这绝对是一次值得的投资!
本文由 蒉玄穆 于2025-08-01发表在【云服务器提供商】,文中图片由(蒉玄穆)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/499769.html
发表评论