【阅读笔记】redis 主从复制

本文分析 redis 在进行主从复制时是如何交互的

基本概念

打开主从复制功能

打开主从复制功能有三种方式

  1. 在配置文件中设置打开
  2. 在 redis-server 的启动时,用命令行参数打开
  3. 在 redis-server 运行过程中,通过客户端命令打开

三种方式都是用 replicaof $HOST $IP 命令打开

同步和命令传播

复制功能分为同步命令传播两个操作

  • 同步操作用于将 master 的数据复制到 slave
  • 命令传播用于让 slave 执行 master 的更新,从而使用数据一致

复制积压缓冲区(Replication Backlog)

在命令传播的过程中,有可能因为 slave 下线等原因造成数据不一致。当 slave 重新上线后,需要复制缺失的数据。如果将 master 所有数据复制给 slave,可能会造成比较大的开销,所以采用复制积压缓冲区来减少全量复制的需要。当进行命令传播时, master 除了把命令发送给所有 slave 外,还将命令写入复制积压缓冲区。当 slave 由于下线丢失一部分数据时,就可以通过复制积压缓冲区的数据来进行恢复,不需要全量复制数据。除非 slave 下线的时间比较长,造成缺失的数据比复制积压缓冲区还大,那么这时就需要进行全量复制。

replicationCron 函数

redis 周期地(每秒)执行 replicationCron 函数。master 会在 replicationCron 进行 slave 存活检查,保活,断开超时连接,清空复制积压缓冲区,调用 bgsave 生成数据文件等操作。slave 在 replicationCron 连接 master。

同步相关命令介绍

  • SLAVEOF 打开主从复制功能
  • REPLICAOF 同上
  • PING 用于检测对方是否存活,由 master 发给 slave
  • REPLCONF 将 slave 的 IP, 侦听端口发给 master
  • SYNC 用于全量同步
  • PSYNC 用于部分同步

同步操作 master - slave 交互过程分析

  • 全量同步过程

同步流程图

  • 命令传播过程
    命令传播流程图