第15章 复制
在redis中,用户可以通过执行slaveof命令或者设置slaveof选项,让一个服务器去复制(replicated)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave)。
15.1 旧版复制功能的实现
Redis的复制功能分为同步(sync)和命令传播(command propagate)两个传播:
- 同步操作作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态;
- 命令传播操作则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。
15.2 旧版复制功能的实现
从服务器对主服务器的复制可以分为以下两种情况:
- 初次复制:从服务器以前没有复制过任何主服务器,或者从服务器当前要复制的主服务器和上一次复制的主服务器不同。
- 断线后重复制:处于命令传播阶段的主从服务器因为网络原因而中断了复制,但从服务器通过自动重连接重新连上了主服务器,并继续复制主服务器。
对于第二种情况,主从服务器断开的时间越短,主服务器在断线期间执行的写命令就越少,而执行少量写命令所产生的数据量通常比整个数据库的数据量要少得多,在这种情况下,为了让服务器补足一小部分缺失的数据,却要让主从服务器重新执行一次SYNC命令,这种做法无疑是非常低效的。
15.3 新版复制功能的实现
- 完整同步,类似于初次复制
- 部分重同步,用于处理断线后重复制的情况,当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接受并执行这些写命令,就可以将数据更新至主服务器当前所处的状态。
15.4 部分重同步的实现
部分重同步功能由以下三个部分构成:
- 主服务器的复制偏移量和从服务器的复制偏移量
- 主服务器的复制积压缓冲区
- 服务器的运行ID
15.6 复制的实现
- 1、设置主服务器的地址和端口
- 2、建立套接字连接
- 3、发送ping命令
- 4、身份验证
- 5、发送端口信息
- 6、同步
- 7、命令传播
15.7 心跳检测
发送Repliconf ack命令对于主从服务器有三个作用:
- 检测主从服务器的网络连接状态
- 辅助实现min-slaves选项
- 检测命令丢失