• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    解读redis slaveof命令执行后为什么需要清库重新同步

    发布者: Error | 发布时间: 2025-6-19 12:37| 查看数: 85| 评论数: 0|帖子模式

    在 Redis 中,执行
    1. SLAVEOF
    复制代码
    (或
    1. REPLICAOF
    复制代码
    )命令后,从节点需要清空现有数据并重新同步的主要原因如下:

    1. 保证数据一致性

    核心目标:确保从节点的数据与主节点 完全一致
    问题场景

    • 如果从节点之前有其他数据(例如曾是其他主节点的副本,或自身是独立主节点),直接保留数据会导致新旧数据混合。
    • 主节点的数据状态可能与从节点存在冲突(例如相同的键但值不同),导致数据逻辑错误。

    2. 全量同步的触发条件

    当从节点执行
    1. SLAVEOF
    复制代码
    连接到主节点时,Redis 会触发以下两种同步机制:

    (1) 全量同步(Full Sync)

    触发条件

    • 从节点是首次连接到主节点。
    • 主从的复制 ID 不匹配(例如主节点发生过故障转移)。
    • 从节点的复制偏移量(
      1. repl_offset
      复制代码
      不在主节点的复制积压缓冲区(
      1. repl_backlog
      复制代码
      )范围内。
    操作流程

    • 主节点生成当前数据的 RDB 快照,发送给从节点。
    • 从节点清空自身数据,加载 RDB 文件。
    • 主节点将生成 RDB 期间的新写入命令缓存,待 RDB 传输完成后发送给从节点(增量同步)。

    (2) 部分同步(Partial Sync)

    触发条件

    • 主从的复制 ID 一致。
    • 从节点的复制偏移量仍在主节点的
      1. repl_backlog
      复制代码
      范围内。
    操作流程

    • 主节点直接发送从节点缺失的增量命令(无需清空数据)。
    • 从节点应用这些命令,追上主节点状态。

    3. 清空数据的必要性


    • 全量同步必须清空数据
    从节点需要以主节点的 RDB 快照为基准重建数据集,若保留原有数据,会导致数据不一致。
    1. # 示例:从节点加载 RDB 前自动执行 FLUSHALL
    2. [从节点日志]
    3. MASTER <-> REPLICA sync: Flushing old data
    复制代码

    • 部分同步无需清空数据
    增量命令是基于从节点已有的数据状态追加的,因此保留数据是安全的。

    4. 数据一致性的风险

    场景风险不清空数据 + 全量同步主节点 RDB 数据与从节点旧数据混合,导致键覆盖、过期时间错乱等问题。不清空数据 + 部分同步仅当复制 ID 和偏移量匹配时安全,否则数据可能不完整或逻辑冲突。
    如何避免全量同步(减少清库开销)

    (1) 合理配置
    1. repl-backlog-size
    复制代码

    • 增大主节点的复制积压缓冲区(默认 1MB),允许更长时间的断线后仍能触发部分同步:
    1. # 主节点配置(redis.conf)
    2. repl-backlog-size 64mb  # 根据业务写入量调整
    复制代码
    (2) 避免频繁主从切换

    • 减少主节点故障转移次数(如优化 Sentinel 参数
      1. down-after-milliseconds
      复制代码
      ),避免复制 ID 变更。
    (3) 持久化复制 ID 和偏移量

    • 从节点重启时,若复制 ID 和偏移量仍有效,可触发部分同步:
    1. # 从节点配置(redis.conf)
    2. repl-diskless-sync no  # 启用磁盘备份(默认)
    复制代码
    示例:同步流程的日志分析

    (1) 全量同步日志
    1. # 主节点日志[19042] 01 Jan 12:00:00.123 * Replica 127.0.0.1:6380 asks for synchronization[19042] 01 Jan 12:00:00.123 * Full resync requested by replica 127.0.0.1:6380[19042] 01 Jan 12:00:00.123 * Starting BGSAVE for SYNC with target: disk
    2. # 从节点日志[19043] 01 Jan 12:00:00.125 * MASTER <-> REPLICA sync started[19043] 01 Jan 12:00:00.125 * MASTER <-> REPLICA sync: Flushing old data[19043] 01 Jan 12:00:00.125 * MASTER <-> REPLICA sync: Loading DB in memory
    复制代码
    (2) 部分同步日志
    1. # 主节点日志[19042] 01 Jan 12:00:00.123 * Replica 127.0.0.1:6380 requests partial resynchronization[19042] 01 Jan 12:00:00.123 * Partial resynchronization request accepted
    2. # 从节点日志[19043] 01 Jan 12:00:00.125 * MASTER <-> REPLICA sync: Master accepted a Partial Resynchronization
    复制代码
    总结


    • 全量同步必须清空数据:确保从节点以主节点的 RDB 快照为基准,避免数据不一致。
    • 部分同步无需清空:基于复制积压缓冲区的增量命令追加,保留数据安全。
    • 优化建议:通过调整
      1. repl-backlog-size
      复制代码
      和减少主从切换频率,尽量避免全量同步,降低清库对服务的影响。
    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    来源:https://www.jb51.net/database/3391662ng.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表