redis全量复制(版本2.8以上)
1、(第一次复制)首先slave节点,传送一个命令 psync?-1 给mater节点,告诉master节点,我不知道你你的 runid和偏移量是多少
2、master收到请求,回复slave节点,+FULLRESYNC {runid} {offset},这是我的runid以及偏移量,slave节点收到后,会保存master节点的runid以及偏移量信息。
3、master自己执行bgsave命令生成快照(生成速度快,传输快),传输给slave节点,同时master也会将本身的buffer(redis缓冲区),传输给slave节点。
4、slave节点接收完数据,执行清空旧数据,最后加载从master节点复制过来的RDB文件,完成复制。
全量复制的开销:
1、主节点- bgsave时间
2、主节点- RDB文件的网络传输
3、从节点- 清空数据时间
4、从节点- 加载RDB的时间
5、可能的AOF重写时间(AOF开启的话)
redis部分复制(增量复制,版本2.8以上)
增量复制是基于如下3点实现的。
(1)从数据库会存储主数据库的运行ID(run id)。每个Redis 运行实例均会拥有一个 唯一的运行ID,每当实例重启后,就会自动生成一个新的运行ID。
(2)在复制同步阶段,主数据库每将一个命令传送给从数据库时,都会同时把该命令 存放到一个==积压队列(backlog)==中,并记录下当前积压队列中存放的命令的偏移量范围。
(3)同时,从数据库接收到主数据库传来的命令时,会记录下该命令的偏移量。
实现步骤
主数据库收到 PSYNC命令后,会执行以下判断 来决定此次重连是否可以执行增量复制。
(1)首先主数据库会判断从数据库传送来的运行ID是否和自己的运行ID相同。这一步 骤的意义在于确保从数据库之前确实是和自己同步的,以免从数据库拿到错误的数据(比如 主数据库在断线期间重启过,会造成数据的不一致)。
(2)然后判断从数据库最后同步成功的命令偏移量是否在积压队列中,如果在则可以 执行增量复制,并将积压队列中相应的命令发送给从数据库。 如果此次重连不满足增量复制的条件,主数据库会进行一次全部同步
PS:积压队列
积压队列在本质上是一个固定长度的循环队列,默认情况下积压队列的大小为 1 MB, 可以通过配置文件的repl-backlog-size选项来调整。很容易理解的是,积压队列越大,其允许 的主从数据库断线的时间就越长。根据主从数据库之间的网络状态,设置一个合理的积压队 列很重要。因为积压队列存储的内容是命令本身,如 SET foo bar,所以估算积压队列的大小 只需要估计主从数据库断线的时间中主数据库可能执行的命令的大小即可。 与积压队列相关的另一个配置选项是repl-backlog-ttl,即当所有从数据库与主数据库断开 连接后,经过多久时间可以释放积压队列的内存空间。默认时间是1小时。
部分选取 Redis入门指南(第2版)-李子骅