告别单点瓶颈: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 考试或面试时需注意版本差异
相关推荐
哦豁灬2 小时前
bitbrick_k1集群使用prima_cpp分布式部署大模型推理
分布式
枫叶林FYL2 小时前
【Python高级工程与架构实战】项目二:事件驱动微服务拆分(分布式版)
分布式·微服务·架构
大力财经2 小时前
云访谈 203:她在资阳,下注 “换电电动车 + 分布式换电站” 新未来
分布式
Devin~Y2 小时前
高并发内容社区实战面试:从 Java 基础到 Spring Cloud、Kafka、Redis、RAG 搜索全解析
java·spring boot·redis·spring cloud·kafka·向量数据库·rag
清水白石0082 小时前
《从缓存到数据库:一致性之痛与工程之道》
数据库·python·缓存
电磁脑机2 小时前
和大脑正确交互的脑机接口研究推演理论
分布式·神经网络·架构·交互·信号处理
Albert Edison3 小时前
【RabbitMQ】核心概念|工作流程|界面操作
分布式·rabbitmq·ruby
刘~浪地球4 小时前
Redis 从入门到精通(十):管道技术
数据库·redis·缓存
搜佛说11 小时前
02-第2章-核心概念与架构
数据库·物联网·微服务·架构·边缘计算·iot