Redis 主从复制和持久化

https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/

以下是关于 Redis 主从复制的详细实现原理、操作步骤及实践注意事项的完整说明:


一、Redis 主从复制核心原理

1. 复制流程架构

主节点(Master)
  │
  ├── 全量复制(首次同步)
  │    ├── BGSAVE生成RDB文件
  │    └── 传输RDB+缓冲区命令
  │
  └── 增量复制(持续同步)
       ├── 复制偏移量(offset)
       └── 环形缓冲区(repl_backlog)

2. 关键技术点

  • 异步复制:主节点处理完命令后立即返回客户端,异步同步从节点
  • 复制ID:每个主节点启动时生成唯一标识(master_replid
  • 偏移量机制:主从节点各自维护复制偏移量(master_repl_offset
  • PSYNC协议:Redis 2.8+ 引入的优化同步协议,支持断点续传

二、主从复制配置步骤

1. 快速配置(命令行方式)

# 在从节点执行(Redis 5.0+)
$ redis-cli --replicaof <master-ip> <master-port>

# 传统方式(所有版本)
127.0.0.1:6380> REPLICAOF 192.168.1.100 6379
OK

# 取消复制
127.0.0.1:6380> REPLICAOF NO ONE

2. 持久化配置(修改配置文件)

# 从节点 redis.conf 配置
replicaof 192.168.1.100 6379
masterauth yourpassword  # 如果主节点有密码
replica-serve-stale-data yes  # 主节点宕机时是否继续服务
replica-read-only yes     # 从节点只读

3. 主节点验证配置

# 查看主节点复制信息
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.101,port=6380,state=online,offset=1156,lag=0
slave1:ip=192.168.1.102,port=6381,state=online,offset=1156,lag=1

三、复制过程详解

1. 全量复制(首次同步)

  1. 从节点发送PSYNC ? -1请求
  2. 主节点执行BGSAVE生成RDB快照
  3. 主节点将RDB文件传输给从节点
  4. 从节点清空旧数据,加载新RDB
  5. 主节点发送复制缓冲区的写命令

注意事项

  • 主节点内存使用会翻倍(RDB生成期间)
  • 网络带宽占用大,建议在低峰期操作
  • 可设置repl-diskless-sync yes进行无盘复制(Redis 2.8.18+)

2. 增量复制(断线重连)

  1. 从节点携带master_replidoffset发起PSYNC请求
  2. 主节点检查复制积压缓冲区(repl_backlog)
  3. 如果offset在缓冲区内,发送增量数据
  4. 如果offset已溢出,触发全量复制

缓冲区配置

# 主节点配置(默认1MB)
repl-backlog-size 1mb
repl-backlog-ttl 3600  # 断开后保留时间(秒)

四、高级配置与优化

1. 安全认证

# 主节点设置密码
requirepass masterpass123

# 从节点配置
masterauth masterpass123

2. 网络优化

# 主节点配置
repl-disable-tcp-nodelay no  # 开启减少小包数量
client-output-buffer-limit replica 256mb 64mb 60  # 调整复制缓冲区

# 从节点配置
repl-timeout 60  # 复制超时时间(秒)

3. 读写分离实现

// Java客户端示例(Jedis)
JedisPoolConfig poolConfig = new JedisPoolConfig();
JedisPool masterPool = new JedisPool(poolConfig, "master-host", 6379);
JedisPool replicaPool = new JedisPool(poolConfig, "replica-host", 6380);

// 写操作使用主节点
try (Jedis master = masterPool.getResource()) {
    master.set("key", "value");
}

// 读操作使用从节点
try (Jedis replica = replicaPool.getResource()) {
    String value = replica.get("key");
}

五、故障处理与监控

1. 常见问题排查

问题现象:从节点显示state=wait_bgsave

  • 原因:主节点正在执行BGSAVE
  • 解决:检查主节点磁盘空间和内存使用

问题现象MASTER <-> REPLICA sync: Finished with success

  • 原因:正常完成全量同步
  • 验证:检查master_repl_offset是否一致

2. 监控指标

# 关键监控项
redis-cli info replication | grep -E "connected_slaves|master_repl_offset|slave[0-9]_"

# Prometheus监控配置
- name: redis_replication
  metrics_path: /metrics
  static_configs:
    - targets: ['redis-host:9121']  # 需部署redis_exporter

3. 主节点故障处理

  1. 手动提升从节点为主节点:
    redis-cli -h replica-host -p 6380 REPLICAOF NO ONE
    
  2. 修改其他从节点指向新主节点
  3. 恢复原主节点后设置为新主节点的从节点

六、主从复制限制与解决方案

限制项 解决方案
写性能单点瓶颈 使用Redis Cluster分片
主从延迟 监控slave_repl_offset差值
全量复制期间服务中断 使用无盘复制+千兆网络
脑裂问题 配合Sentinel实现自动故障转移
数据一致性风险 使用WAIT命令强制同步

一致性保障命令

# 等待至少1个从节点确认(超时1秒)
127.0.0.1:6379> SET key value
127.0.0.1:6379> WAIT 1 1000

七、生产环境最佳实践

  1. 拓扑建议

    • 主节点:专用高配服务器,关闭持久化
    • 从节点:多实例部署,开启AOF持久化
    • 至少保留一个从节点与主节点跨机房部署
  2. 版本要求

    • 主从节点尽量保持相同大版本
    • Redis 5.0+ 推荐使用REPLICAOF命令
  3. 安全建议

    • 启用SSL加密传输(Redis 6.0+)
    • 配置防火墙规则限制访问来源IP
    • 定期执行BGREWRITEAOF压缩日志

通过以上配置和优化,Redis主从复制可以实现:

  • 数据可靠性:99.999%(年故障时间<5分钟)
  • 同步延迟:百兆网络下<10ms,千兆网络<2ms
  • 故障切换时间:人工干预约1分钟,配合Sentinel可达秒级切换
posted @ 2024-12-30 11:20  nptr  阅读(34)  评论(0)    收藏  举报