Redis 主从复制
导言
作为分布式系统中实现数据高可用与读写分离的核心技术,Redis 主从复制(Master-Replica Replication)通过多节点数据同步,解决了单点故障风险与读写负载不均问题。
一、核心原理:全量复制与增量复制双机制
Redis 主从复制通过 “全量初始化 + 增量衔接” 的方式实现数据同步,两种复制模式适配不同场景需求,需明确触发条件与执行流程。
1. 全量复制:从节点初始化同步
触发场景
从节点首次连接主节点(冷启动场景)
从节点断开时间超过repl_backlog_buffer(复制积压缓冲区)大小
主节点执行flushall/flushdb后,从节点同步时无有效偏移量
关键细节
RDB 传输期间主节点通过复制客户端缓冲区(默认 1GB)缓存新写请求,缓冲区满会导致复制失败,需根据写入量调整client-output-buffer-limit replica
从节点加载 RDB 时会阻塞读请求,可通过replica-lazy-flush yes(默认开启)延迟清空数据,减少阻塞时间
2. 增量复制:从节点断连恢复
核心依赖
复制偏移量:主从节点各自维护的字节偏移量(master_repl_offset/slave_repl_offset),用于判断数据差异
复制积压缓冲区(repl_backlog_buffer):主节点环形缓冲区,默认 1MB,存储最近写操作,用于断连后增量同步
执行流程
- 从节点重连后发送PSYNC 主节点ID 已同步偏移量
- 主节点校验:若偏移量在repl_backlog_buffer范围内,返回CONTINUE
- 主节点从偏移量位置开始,推送增量写命令(如 SET、INCR)
- 从节点执行命令,同步偏移量至主节点水平
优化点
- repl_backlog_buffer大小建议按公式配置:业务每秒写入量 × 最大断连时间 × 1.5(例:每秒写入 100MB,断连 10 秒,建议设为 1.5GB)
二、部署配置:基于场景的参数选型
1. 基础配置模板(单主双从架构)
主节点配置(redis-master.conf)
1 | # 网络配置 |
从节点配置(redis-replica1.conf)
1 | port 6380 # 从节点端口与主节点区分 |
2. 场景化配置建议
场景 | 关键参数调整 | 理由 |
---|---|---|
高写入场景 | repl_backlog_size=500mb+ | 减少全量复制触发概率 |
磁盘 IO 瓶颈 | repl-diskless-sync=yes | 避免 RDB 文件写入磁盘的 IO 开销 |
低延迟读需求 | replica-lazy-flush=no | 快速加载 RDB,缩短从节点不可读时间 |
跨机房部署 | repl-timeout=60(默认 60 秒) | 应对跨机房网络延迟,避免误判超时 |
三、实战案例:从零搭建单主双从架构
环境准备
- 节点规划:主节点 (192.168.1.100:6379)、从节点 1 (192.168.1.101:6380)、从节点 2 (192.168.1.102:6381)
步骤 1::配置主从节点
1 | # 主节点配置(192.168.1.100) |
步骤 2:启动与验证
1 | # 启动所有节点 |
四、技术对比:主从复制 vsRedis Cluster
特性 | 主从复制(含哨兵) | Redis Cluster(集群) |
---|---|---|
数据分布 | 所有节点数据完全一致 | 数据分片存储(16384 个哈希槽) |
高可用机制 | 哨兵选举新主节点 | 内置故障转移(主从复制 + 槽迁移) |
扩展性 | 纵向扩展(加从节点提升读性能) | 横向扩展(加节点扩展存储 / 写性能) |
适用场景 | 读多写少、数据量适中(<10GB) | 大数据量(>10GB)、高并发写场景 |
复杂度 | 低(配置简单,运维成本低) | 高(需管理槽分配、跨节点事务) |
五、数据一致性保障:验证与监控
1. 一致性验证方法
偏移量校验:主从节点info replication中的master_repl_offset与slave_repl_offset需一致
数据抽样:主节点执行keys *随机选 key,从节点验证值是否匹配
全量比对:使用redis-cli --scan遍历所有 key,批量校验(适合小数据量)
2. 核心监控指标
指标类别 | 关键指标(通过 INFO 命令获取) | 阈值建议 |
---|---|---|
复制状态 | connected_slaves(从节点数) | 与配置数量一致 |
延迟监控 | master_link_down_time(断连时间) | <10 秒 |
同步健康度 | repl_backlog_active(缓冲区激活状态) | yes |
性能指标 | used_cpu_sys(系统 CPU 使用率) | <70% |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.