找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

450

积分

0

好友

56

主题
发表于 昨天 00:12 | 查看: 4| 回复: 0

Redis作为一个内存数据库,通过主从复制来保持数据的高可用性是十分必要的。本节将深入介绍其主从同步的核心原理与实现细节。

1. 核心原理

主从复制主要基于以下机制实现:

  • 数据同步:从节点通过复制主节点的数据副本,实现数据冗余和高可用。
  • 异步复制:默认采用异步方式,主节点在写入数据后立即响应客户端,同时将写命令传播给从节点。
  • 全量同步 + 增量同步:根据从节点的状态,Redis 会自动选择全量或增量方式同步数据。

2. 工作流程

(1)建立连接

  1. 从节点执行 SLAVEOF <master_ip> <master_port> 或配置 slaveof 指令,向主节点发起连接请求。
  2. 从节点与主节点建立 Socket 连接,用于后续的命令与数据传输。

(2)数据同步阶段

Redis 根据从节点的复制偏移量决定同步方式:

a) 全量同步(Full Resynchronization)

触发条件

  • 从节点首次连接主节点。
  • 从节点的复制偏移量不在主节点的复制积压缓冲区中。

流程

  1. 从节点发送 PSYNC 命令请求同步。
  2. 主节点执行 BGSAVE 在后台生成 RDB 快照文件,同时将生成期间接收到的写命令缓存到复制缓冲区。
  3. 主节点将 RDB 文件发送给从节点,从节点清空自身旧数据并加载 RDB 快照。
  4. 主节点发送缓冲区的写命令,从节点执行这些命令以追上主节点的最新状态。
b) 增量同步(Partial Resynchronization)

触发条件

  • 从节点与主节点网络短暂中断后重连。
  • 从节点的复制偏移量仍存在于主节点的复制积压缓冲区中。

流程

  1. 从节点发送 PSYNC 命令,并携带上次复制记录的偏移量。
  2. 主节点比对偏移量,将积压缓冲区中从该偏移量之后的所有写命令发送给从节点。
  3. 从节点执行这些命令,从而快速追上主节点数据。

3. 核心概念

(1)复制偏移量(Replication Offset)

  • 主节点和从节点各自维护一个偏移量,记录已复制/接收的数据字节数。
  • 每次主节点向从节点传播 N 字节数据时,双方偏移量都增加 N。
  • 通过对比主从偏移量,可以判断数据的一致性。

(2)复制积压缓冲区(Replication Backlog)

  • 主节点维护的一个固定大小的循环缓冲区(默认 1MB)。
  • 用于保存最近传播的写命令,是增量同步的关键。
  • 若从节点的偏移量仍在缓冲区范围内,则进行增量同步;否则触发全量同步。

(3)服务器运行 ID(Run ID)

  • 每个 Redis 节点启动时都会生成一个唯一的 Run ID。
  • 从节点会记录主节点的 Run ID,用于判断主节点是否发生了变更(例如主节点重启后 Run ID 改变会触发全量同步)。

4. 命令传播阶段

  • 完成初始数据同步后,主节点进入命令传播阶段,持续将接收到的写命令异步发送给所有从节点。
  • 从节点接收并执行相同的命令,以保持数据的实时同步。

5. 主从拓扑结构

  1. 一主一从:结构简单,适用于数据备份或基础的读写分离场景。
  2. 一主多从:适用于读多写少的场景,读请求可以在多个从节点上负载均衡。
  3. 树状结构(链式复制):从节点可以进一步作为其他节点的主节点,形成级联复制,有助于减轻顶层主节点的复制压力。

6. 重要配置参数


# 主节点相关配置
repl-backlog-size 1mb    # 复制积压缓冲区大小
repl-backlog-ttl 3600    # 缓冲区保留时间(秒)
min-slaves-to-write 1    # 至少 N 个从节点在线才接受写操作
min-slaves-max-lag 10    # 从节点延迟不超过 N 秒

# 从节点相关配置
slave-read-only yes      # 从节点只读(默认)
repl-diskless-sync no    # 是否使用无盘复制(通过网络直接传输 RDB)



上一篇:Claude Code SKILL实战:前端开发中AI代码可用率99%的真实体验
下一篇:Vibe Coding如何重塑VoIP开发:从SIP堆栈重写到Asterisk/FreeSwitch重构
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-18 15:03 , Processed in 0.305840 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

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