导言

作为分布式系统中实现数据高可用与读写分离的核心技术,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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 网络配置
bind 0.0.0.0 # 生产环境建议指定内网IP
port 6379
protected-mode yes # 开启保护模式,避免公网访问

# 安全配置
requirepass Redis@2025 # 主节点密码
masterauth Redis@2025 # 从节点变为主节点时需验证

# 复制核心配置
repl_backlog_size 100mb # 复制积压缓冲区,根据业务调整
repl_backlog_ttl 3600 # 缓冲区无从节点时保留1小时

# 性能优化
repl-diskless-sync no # 磁盘IO充足时用磁盘同步(默认),IO紧张设为yes(无盘同步)
repl-diskless-sync-delay 5 # 无盘同步延迟5秒,等待更多从节点连接

从节点配置(redis-replica1.conf)

1
2
3
4
5
6
7
8
9
10
11
12
port 6380  # 从节点端口与主节点区分
replicaof 192.168.1.100 6379 # 指定主节点地址
masterauth Redis@2025 # 匹配主节点requirepass

# 读写分离配置
replica-read-only yes # 从节点只读(默认开启)
replica-serve-stale-data no # 同步异常时拒绝读请求,保障数据一致性

# 持久化配合
appendonly yes # 从节点开启AOF,避免主节点宕机后数据丢失
auto-aof-rewrite-percentage 100 # AOF文件增长100%时重写
auto-aof-rewrite-min-size 64mb

2. 场景化配置建议

场景 关键参数调整 理由
高写入场景 repl_backlog_size=500mb+ 减少全量复制触发概率
磁盘 IO 瓶颈 repl-diskless-sync=yes 避免 RDB 文件写入磁盘的 IO 开销
低延迟读需求 replica-lazy-flush=no 快速加载 RDB,缩短从节点不可读时间
跨机房部署 repl-timeout=60(默认 60 秒) 应对跨机房网络延迟,避免误判超时

三、实战案例:从零搭建单主双从架构

环境准备

步骤 1::配置主从节点

1
2
3
4
5
6
7
8
9
10
11
12
# 主节点配置(192.168.1.100)
sed -i 's/^bind 127.0.0.1/bind 0.0.0.0/' /etc/redis/redis-master.conf
sed -i 's/^# requirepass.*/requirepass Redis@2025/' /etc/redis/redis-master.conf
sed -i 's/^# repl_backlog_size.*/repl_backlog_size 100mb/' /etc/redis/redis-master.conf

# 从节点1配置(192.168.1.101)
cp /etc/redis/redis-master.conf /etc/redis/redis-replica1.conf
sed -i 's/^port 6379/port 6380/' /etc/redis/redis-replica1.conf
sed -i '/^requirepass/d' /etc/redis/redis-replica1.conf # 从节点无需密码(只读)
echo -e "replicaof 192.168.1.100 6379\nmasterauth Redis@2025" >> /etc/redis/redis-replica1.conf

# 从节点2配置(192.168.1.102)同理,端口设为6381

步骤 2:启动与验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 启动所有节点
/usr/local/redis/bin/redis-server /etc/redis/redis-master.conf
/usr/local/redis/bin/redis-server /etc/redis/redis-replica1.conf
/usr/local/redis/bin/redis-server /etc/redis/redis-replica2.conf

# 验证主节点状态
/usr/local/redis/bin/redis-cli -h 192.168.1.100 -p 6379 -a Redis@2025 info replication
# 关键输出:role:master, connected_slaves:2, slave0:ip=192.168.1.101,port=6380,...

# 验证数据同步
# 主节点写入数据
redis-cli -h 192.168.1.100 -p 6379 -a Redis@2025 set product:1001 "iPhone 15"

# 从节点读取数据
redis-cli -h 192.168.1.101 -p 6380 get product:1001 # 应返回"iPhone 15"

四、技术对比:主从复制 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%