三个复制机制
主从复制有三个机制,正常的指令持续复制;通过缓冲区补全的部分复制;通过RDB文件的全量复制。三个复制机制的状态转移如下
数据类型
在数据复制和同步时,主要依靠 replication ID
和 offset
通过指令可以查看一个主从节点的这两个信息
>>> info replication
role: master
master_replid:
master_replid2:
master_repl_offset:
second_repl_offset:
replication ID
可以看作一个数据库的源头信息, offset
则是基于这个源头进行了多少版本
每一个主节点有两个 replication ID
:当从节点选举为主节点时,老的 replication ID
会被记录到master_replid2上,供其他从节点继续复制数据。
复制过程
当从节点第一次连接主节点时,复制大致过程如下
主流程:
- 从节点会保存主节点网络信息
- 建立主从节点间socket连接
- 从节点发送Ping命令,并通过心跳保持连接畅通
- 验证节点密码及权限
- 执行psync指令
- 指令持续复制
由于是第一次复制,会使用全量复制过程:
(1)从节点发送pysnc ? -1
(2)主节点返回FULLRESYNC replication ID offset
(3)主节点执行bgsave
,开始保存数据到RDB文件
(4)发送RDB到从节点
(5)主节点在执行数据修改操作,例如写指令,过期指令时,会写入缓冲区。缓冲区可通过client-output-buffer-limit
控制,当区域大小超过阈值,会断开从节点的复制连接。
(6)从节点把RDB数据加载到内存
(7)主节点开始发送缓冲数据
(8)从节点加载缓存数据
在复制过程中,如果出现超时连接,或者网络断开。在连接恢复后,会先尝试部分复制过程
(1)从节点发送自己节点的数据信息replication ID offset
(2)主节点判断replication ID
是否匹配自己的信息,并在缓冲区查找offset
。如果缓冲区有相同的offset
,则可以继续通过部分复制。该缓冲区的大小通过repl-backlog-size
控制
(3)如果找不到,则会执行全量复制