Redis主从复制:原理、配置与实战演示

📚 什么是Redis主从复制?

Redis主从复制(Master-Slave Replication)是一种数据冗余备份和高可用性解决方案 。它允许将一个Redis服务器(主节点)的数据自动同步到一个或多个Redis服务器(从节点)。

为什么需要主从复制?

  • 数据持久化保障:即使Redis服务重启,硬盘上的持久化数据可以恢复,但硬盘损坏仍会导致数据丢失

  • 避免单点故障:主从架构确保一台服务器宕机时,其他服务器可继续提供服务

  • 读写分离:主节点处理写操作,从节点处理读操作,提升系统性能

  • 数据备份:多个副本提供数据安全保障


🏗️ 主从复制架构图

一主两从架构

架构特点:

  • 主Redis中的数据有两个副本(从Redis1和从Redis2)

  • 即使一台Redis服务器宕机,其他两台仍可继续服务

  • 主Redis写入数据时,通过主从复制机制自动复制到所有从节点

主从级联架构

架构特点:

  • 一个Redis节点可以既是主又是从

  • 实现更灵活的数据同步拓扑

  • 减轻主节点的复制压力


🔄 核心特性

  1. 数据实时同步:主节点的数据变更实时同步到从节点

  2. 单一主节点:系统中只有一个主Redis,可配置多个从Redis

  3. 非阻塞复制:主从复制不会阻塞Master,同步期间Master仍可处理客户端请求

  4. 自动故障转移(结合哨兵模式):主节点故障时,从节点可自动升级为主节点


⚙️ 主从配置实战

环境准备

复制代码
主节点:192.168.0.209:6379
从节点:192.168.1.100:6380

主Redis配置(基本无需特殊配置)

复制代码
# redis-master.conf
bind 0.0.0.0
port 6379
requirepass 2020
daemonize yes

从Redis配置

复制代码
# redis-slave.conf
bind 0.0.0.0
port 6380
slaveof 192.168.0.209 6379  # 关键配置:指定主节点
masterauth 2020              # 主节点密码
requirepass 2020
daemonize yes
replica-read-only yes        # 从节点只读(默认)

配置说明:

  • slaveof:指定主Redis的IP和端口

  • masterauth:连接主节点所需的密码(如果主节点设置了密码)

  • replica-read-only:设置从节点为只读模式


🔧 配置步骤详解

步骤1:启动主节点

复制代码
redis-server /path/to/redis-master.conf

步骤2:启动从节点

复制代码
redis-server /path/to/redis-slave.conf

步骤3:验证主从状态

复制代码
# 检查主节点状态
redis-cli -p 6379 -a 2020 INFO replication

# 检查从节点状态  
redis-cli -p 6380 -a 2020 INFO replication

步骤4:测试数据同步

复制代码
# 在主节点写入数据
redis-cli -p 6379 -a 2020 SET demo_key "Hello Master-Slave"

# 在从节点读取数据
redis-cli -p 6380 -a 2020 GET demo_key
# 应返回:"Hello Master-Slave"

🔍 复制原理深入解析

全量复制流程

复制代码
1. 从节点连接主节点,发送SYNC命令
2. 主节点执行BGSAVE生成RDB快照
3. 主节点将RDB文件发送给从节点
4. 从节点清空旧数据,加载RDB文件
5. 主节点将缓冲区的写命令发送给从节点
6. 从节点执行这些命令,完成数据同步

部分复制机制(PSYNC)

复制代码
# 从节点发送PSYNC命令格式
PSYNC <master_runid> <offset>

参数说明:

  • master_runid:主节点标识,随机生成的40位字符串

  • offset:复制偏移量,标识数据同步位置

验证流程:

  1. 从机连接主机,发送PSYNC命令

  2. 主机验证runid和offset是否有效

  3. runid验证失败​ → 执行全量同步

  4. runid验证通过,offset有效​ → 执行部分同步

  5. runid验证通过,offset无效​ → 执行全量同步

复制积压缓冲区

主节点维护一个固定大小的复制积压缓冲区(replication backlog),用于保存最近的写命令。当从节点断线重连时:

  • 如果offset在缓冲区内 → 执行部分复制

  • 如果offset不在缓冲区内 → 执行全量复制

    配置积压缓冲区大小(默认1MB)

    repl-backlog-size 10mb

    配置缓冲区存活时间(默认1小时)

    repl-backlog-ttl 3600


⚠️ 常见问题与解决方案

问题1:主从连接失败

症状master_link_status:down

解决方案

复制代码
# 检查主节点配置
redis-cli -p 6379 CONFIG GET bind
redis-cli -p 6379 CONFIG GET protected-mode

# 从节点重新连接
redis-cli -p 6380 SLAVEOF NO ONE
redis-cli -p 6380 SLAVEOF 127.0.0.1 6379

问题2:认证失败

症状NOAUTH Authentication required

解决方案

复制代码
# 确保主从节点密码一致
# 主节点:requirepass 2020
# 从节点:masterauth 2020 和 requirepass 2020

问题3:同步延迟

症状:从节点数据落后主节点

解决方案

复制代码
# 调整复制参数
redis-cli -p 6379 CONFIG SET repl-backlog-size 10mb
redis-cli -p 6379 CONFIG SET repl-timeout 60
redis-cli -p 6379 CONFIG SET client-output-buffer-limit "slave 0 0 0"

通过主从复制,Redis实现了数据的多副本存储,为数据安全和系统高可用提供了坚实保障。

相关推荐
人工智能培训几秒前
大语言模型:从语言理解到通用智能的跃迁
linux·服务器·前端·人工智能
一拳不是超人11 分钟前
做独立开发三个月,我的第一个产品终于有了 1000 个用户
前端·程序员
Amos_Web21 分钟前
Rspack 源码解析(十):Hash 与 Asset 生成
前端·rust·源码阅读
福兮说24 分钟前
用 IndexedDB 存用户的文件,我踩过的五个坑
前端·javascript
闪耀之光M7824 分钟前
前端依赖自动导入:unplugin-auto-import
前端
Anastasiozzzz29 分钟前
重新定义 Agent 基建:Redis 在现代 AI 与智能体系统中的工程实践
java·人工智能·redis·ai
Ricon组态薄荷糖38 分钟前
Ricon组态系统:工业组件开发指南与实践
前端·后端·物联网
flash俊杰43 分钟前
Electron 桌面应用的进程模型:为什么 fork Next.js standalone
前端
沙蒿同学1 小时前
我把架构约定编译成了会变红的测试:Wails v2 + Go + Vue3 桌面脚手架实战
前端·后端·github
cpolar技术支持1 小时前
本地 Playwright 测试报告怎么远程复盘?Trace Viewer 跑起来后,用 cpolar 分享失败现场
前端·自动化测试·测试工具·cpolar·playwright