当前位置:嗨网首页>书籍在线阅读

09-增量复制

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.1.7 增量复制

8.1.2节在介绍复制的原理时提到当主从数据库连接断开后,从数据库会发送 SYNC 命令来重新进行一次完整复制操作。这样即使断开期间数据库的变化很小(甚至没有),也需要将数据库中的所有数据重新快照并传送一次。在正常的网络应用环境中,这种实现方式显然不太理想。Redis 2.8版相对2.6版的最重要的更新之一就是实现了主从断线重连的情况下的增量复制。

增量复制是基于如下3点实现的。

(1)从数据库会存储主数据库的运行ID( run id )。每个Redis运行实例均会拥有一个唯一的运行ID,每当实例重启后,就会自动生成一个新的运行ID。

(2)在复制同步阶段,主数据库每将一个命令传送给从数据库时,都会同时把该命令存放到一个积压队列(backlog)中,并记录下当前积压队列中存放的命令的偏移量范围。

(3)同时,从数据库接收到主数据库传来的命令时,会记录下该命令的偏移量。

这3点是实现增量复制的基础。回到8.1.2节的主从通信流程,可以看到,当主从连接准备就绪后,从数据库会发送一条 SYNC 命令来告诉主数据库可以开始把所有数据同步过来了。而2.8版之后,不再发送 SYNC 命令,取而代之的是发送 PSYNC ,格式为“ PSYNC主数据库的运行ID 断开前最新的命令偏移量 ”。主数据库收到 PSYNC 命令后,会执行以下判断来决定此次重连是否可以执行增量复制。

(1)首先主数据库会判断从数据库传送来的运行ID是否和自己的运行ID相同。这一步骤的意义在于确保从数据库之前确实是和自己同步的,以免从数据库拿到错误的数据(比如主数据库在断线期间重启过,会造成数据的不一致)。

(2)然后判断从数据库最后同步成功的命令偏移量是否在积压队列中,如果在则可以执行增量复制,并将积压队列中相应的命令发送给从数据库。

如果此次重连不满足增量复制的条件,主数据库会进行一次全部同步(即与Redis 2.6的过程相同)。

大部分情况下,增量复制的过程对开发者来说是完全透明的,开发者不需要关心增量复制的具体细节。2.8版本的主数据库也可以正常地和旧版本的从数据库同步(通过接收 SYNC 命令),同样2.8版本的从数据库也可以与旧版本的主数据库同步(通过发送 SYNC 命令)。唯一需要开发者设置的就是积压队列的大小了。

积压队列在本质上是一个固定长度的循环队列,默认情况下积压队列的大小为1 MB,可以通过配置文件的 repl-backlog-size 选项来调整。很容易理解的是,积压队列越大,其允许的主从数据库断线的时间就越长。根据主从数据库之间的网络状态,设置一个合理的积压队列很重要。因为积压队列存储的内容是命令本身,如 SET foo bar ,所以估算积压队列的大小只需要估计主从数据库断线的时间中主数据库可能执行的命令的大小即可。

与积压队列相关的另一个配置选项是 repl-backlog-ttl ,即当所有从数据库与主数据库断开连接后,经过多久时间可以释放积压队列的内存空间。默认时间是1小时。