# 016. redis 主从复制原理、断点续传、无磁盘化复制、过期 key 处理

# 主从架构的核心原理

当启动一个 slave node 的时候,它会发送一个 PSYNC 命令给 master node,

  • 如果是重新连接:master node 仅仅会复制给 slave 部分缺少的数据;
  • 如果是首次连接:会触发一次 full resynchronization(全量同步)

开始 full resynchronization 的时候,master 会启动一个后台线程,开始生成一份 RDB 快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。RDB 文件生成完毕之后,master 会将这个 RDB 发送给 slave,slave 会先写入本地磁盘,然后再从本地磁盘加载到内存中。然后 master 会将内存中缓存的写命令发送给 slave,slave 也会同步这些数据。

slave node 如果跟 master node 有网络故障,断开了连接,会自动重连。master如果发现有多个 slave node 都来重新连接,仅仅会启动一个 rdb save 操作,用一份数据服务所有 slave node。

在正常情况下异步复制会很简单,来一条,异步复制一条

# 主从复制的断点续传

从 redis 2.8 开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份

master node 会在内存中创建一个 backlog,master 和 slave 都会保存一个 replica offset 和 master id,offset 就是保存在 backlog 中的。如果 master 和 slave 网络连接断掉了,slave 会让 master 从上次的 replica offset 开始继续复制,但是如果没有找到对应的 offset,那么就会执行一次 resynchronization

# 无磁盘化复制

master 在内存中直接创建 rdb,然后通过网络发送给 slave,不会在自己本地落地磁盘了

该功能是通过配置文件配置的,主要涉及到以下两个参数:

  • repl-diskless-sync:无磁盘同步 默认为 no(关闭状态)
  • repl-diskless-sync-delay:等待一定时长再开始复制,因为要等更多 slave 重新连接过来

# 过期 key 处理

  • slave 不会过期 key
  • 只会等待 master 过期 key。

如果 master 过期了一个 key,或者通过 LRU 淘汰了一个 key,那么会模拟一条 del 命令发送给 slave。