告别单点瓶颈:Redis主从架构与读写分离实战

大家好!在之前的文章中,我们深入探讨了Redis的持久化机制(RDB和AOF),解决了数据"丢不丢"的问题。但随着业务量的增长,我们很快会面临另一个挑战:"快不快"

单台Redis服务器虽然性能强劲,但毕竟受限于CPU和网络带宽,其并发处理能力(QPS)是有上限的(通常在3万-5万左右)。当面对"双11"这种海量读请求时,单节点很容易成为瓶颈。

怎么办?既然"一夫当关"太累,那我们就组建一支"军队"!今天,我们就来学习Redis最基础的集群模式------主从复制,通过"人多力量大"来实现读写分离,大幅提升系统的并发能力。


什么是主从架构?

主从架构的核心思想非常简单:一主多从,读写分离

  • 主节点(Master)
    • 它是集群的"大脑",负责处理所有的写操作(如SET、DEL)。
    • 它会将接收到的写命令,实时同步给所有的从节点。
  • 从节点(Slave/Replica)
    • 它们是主节点的"分身",负责处理读操作(如GET)。
    • 它们不能直接写入数据(除非特殊配置),只能被动接收主节点的数据同步。
    • 注:在Redis 5.0之前,从节点被称为Slave,后来为了消除"主奴"色彩,官方改称为Replica,但两者指代的是同一个东西。

通过这种架构,我们可以将巨大的读压力分散到多个从节点上,而主节点则专注于写操作,从而成倍地提升系统的整体吞吐量。


实战演练:单机模拟三节点集群

在生产环境中,主从节点通常部署在不同的物理机上。但为了学习和测试,我们可以在一台虚拟机上,通过不同端口来模拟三个Redis实例。

环境规划

  • IP地址:192.168.80.134(本机,也就是你虚拟机的ip)
  • Master节点:端口 7001
  • Slave节点1:端口 7002
  • Slave节点2:端口 7003

准备工作

  1. 创建目录 :在/tmp下创建700170027003三个文件夹,作为各自的工作目录。
  2. 准备配置文件 :将原始的redis.conf复制三份,分别放入这三个文件夹中。
  3. 修改配置
    • 修改port:分别改为7001、7002、7003。
    • 修改dir:指向各自的工作目录(如dir /tmp/7001/)。
    • 关闭AOF:为了演示方便,暂时设置appendonly no(生产环境建议开启)。
    • 声明IP:添加replica-announce-ip 192.168.80.134,确保节点间能正确识别IP。

启动实例

分别启动三个Redis实例:
redis-server /tmp/7001/redis.conf
redis-server /tmp/7002/redis.conf
redis-server /tmp/7003/redis.conf

此时,它们是三个互不相关的独立Redis实例。

一件重要的事:防火墙相关端口一定要开放或者直接关闭,主节点中配置bind用

bash 复制代码
bind 127.0.0.1 192.168.80.134

这个很重要,不然后续会失败,因为:(这里博主一开始也没注意到,排了半天错)

虽然从节点和主节点在同一台物理机 上,但网络数据包的走向是:从节点 -> 网卡 -> 回环 -> 主节点

如果主节点的配置里写着 bind 127.0.0.1,这就相当于主节点对外宣布:"我只听 127.0.0.1 的话,别的 IP(包括 192.168.80.134)找我,我一律不理。"

为什么同一个虚拟机也不行?

  • 从节点的视角 :你告诉从节点 replicaof 192.168.80.134 7001
  • 网络包的流向 :从节点会把数据包发给 192.168.80.134
  • 主节点的视角 :主节点监听的是 127.0.0.1
  • 结果 :虽然都在同一台机器里,但入口 IP 不匹配。主节点觉得:"我不认识 192.168.80.134 这个地址进来的请求",于是拒绝连接(或者在防火墙/保护模式下直接丢弃)

建立"血缘"关系

实例启动后,我们需要手动建立主从关系。这可以通过命令临时生效,也可以写入配置文件永久生效。

方式一:命令行临时配置(推荐测试用)

我们登录到从节点,告诉它"谁是你的老大"。

  1. 连接7002redis-cli -p 7002
  2. 执行命令slaveof 192.168.80.134 7001
    • 注:Redis 5.0后推荐使用 replicaof 192.168.80.134 7001,效果一样。
  3. 连接7003redis-cli -p 7003
  4. 执行命令replicaof 192.168.80.134 7001

方式二:配置文件永久生效(推荐生产用)

在从节点的redis.conf中添加一行配置:
replicaof 192.168.80.134 7001

这样重启后,主从关系依然存在。

验证状态

在主节点(7001)上执行info replication,你应该能看到类似这样的输出:
role:master
connected_slaves:2
slave0:ip=192.168.150.101,port=7002...
slave1:ip=192.168.150.101,port=7003...

这说明主从关系搭建成功!


读写分离测试

现在,让我们看看主从架构是如何工作的。

1. 写操作(只能在Master)

我们在主节点(7001)写入数据:
127.0.0.1:7001> set num 300
OK

2. 读操作(可以在Slave)

接着,我们去从节点(7002和7003)读取数据:
127.0.0.1:7003> get num
"123"

数据已经成功同步!

3. 从节点写保护

如果你尝试在从节点写入数据:
127.0.0.1:7002> set number 666

系统会报错:
(error) READONLY You can't write against a read only replica.

这是Redis的保护机制,防止从节点的数据与主节点不一致。


知识小结

为了方便大家复习,我整理了本节的重点速查表:

知识点 核心内容 避坑/考点
架构角色 Master负责写,Slave负责读 实现读写分离,提升读性能
配置命令 slaveof <ip> <port>replicaof 需在从节点上执行
数据流向 单向复制:Master → Slave 从节点数据是只读的副本
状态查看 info replication 关注 connected_slaves 数量
术语演变 Redis 5.0前叫Slave,后叫Replica 考试或面试时需注意版本差异
相关推荐
rustfs1 分钟前
MinIO 国产平替,RustFS 发布 Beta 版本啦
分布式·docker·云原生·rust·开源
LONGZETECH20 分钟前
新能源汽车专业升级|仿真教学软件科学布局指南
人工智能·物联网·架构·汽车·新能源汽车仿真教学软件
John_ToDebug21 分钟前
Chrome 浏览器原生下载逻辑架构
chrome·架构·下载
KeyonY1 小时前
车联网规则引擎设计之热更新与版本管理
redis·golang·车联网
许彰午1 小时前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
代码中介商1 小时前
Linux多线程编程完全指南(下):线程同步与互斥锁
linux·redis·线程·互斥锁
Lyyaoo.1 小时前
Session粘滞性问题->Redis实现session共享
数据库·redis·缓存
珠海西格电力1 小时前
零碳园区管理系统“云-边-端”架构协同的价值及具体案例
大数据·数据库·人工智能·架构·能源
ai产品老杨1 小时前
深度架构解析:基于异构计算与 Docker 容器化的 AI 视频管理平台实战
人工智能·docker·架构
Mr_sst1 小时前
文件上传并发控制:为什么选Redisson可过期信号量?(避坑指南)
网络·数据库·redis·分布式·安全架构