《Redis设计与实现》学习笔记(十一) 第十五章 复制
文章目录
一. 旧版复制功能的实现
1. 分为同步和命令传播两个部分:
- 同步将从服务器更新到
与主服务器一样
的服务器状态 - 命令传播用于主服务器被修改,需要回到
主从一致
的状态
2. 同步
- 需要从服务器向主服务器发送
SYNC
命令 - 主服务器接收到SYNC后,使用
BGSAVE生成一个RDB
文件 - 从服务器使用生成的RDB更新到与主服务器一样的状态
3. 命令传播
发送造成了不一致的写命令给从服务器执行
二. 旧版的缺陷
对于断线后的重复制来说,效率非常低,需要复制所有RDB文件里的键值对
三. 新版复制功能的实现
1. 2.8版本后,用PSYNC代替SYNC
2. PSYNC有两种模式:
- 完整重同步
- 部分重同步:只同步断开后的缺失的键值对
四. 部分重同步的实现
1. 复制偏移量replication offset:
- 在主服务器里表示向从服务器发送的数据字节数N1
- 在从服务器里表示从主服务器收到的数据字节数N2
- 通过对比N1,N2可以确定是否一致,也可以通过N1-N2的差值确定需要重新同步的数据量
2. 复制积压缓冲区
- 由主服务器维护的一个
固定长度,FIFO
的队列 - 当主服务器发送命令传播时,不仅会发送给所有
从服务器
,还会将写命令
入队到复制积压缓冲区
。 - 如果偏移量之后的数据仍在复制积压缓冲区,那可以执行部分重同步;否则只能执行完整重同步
3.服务运行期ID
用来验证重连后是否重连的是同一个主服务器
五. PSYNC的实现
六. 复制的实现
- 设置主服务器的地址和端口
- 建立接套字连接
- 发送PING命令
- 收到PONG回复后,身份验证
- 从服务器发送监听端口号
- 同步
- 命令传播
七. 心跳检测
- 从服务器会以每秒一次向主服务器发送:REPLCONF ACK
- 三个作用:
- 检测主从服务器的网络连接状态
- 辅助实现min-slaves选项
- 检测命令丢失