Redis复制时主从节点之间的数据同步

Redis主从节点的数据同步是Redis复制中很重要的一步,今天来详细介绍一下Redis主从节点之间的数据同步。

Redis数据同步的过程主要分为全量复制和增量复制:

全量复制:一般用于第一次复制的场景,它会把主节点的数据一次性发送给从节点

增量复制:一般用于在主从复制过程中因网络闪断等原因造成的数据丢失场景,当从节点再次连接上主节点后,如果条件允许,主节点会补发从节点丢失的数据给从节点

全量复制由于同步的是主节点的所有数据,所以在数据量很大的时候,会对主节点和网络造成很大的开销;增量复制由于补发的数据远全量数据,可以有效地避免全量复制带来的过高开销。

早期的Redis中只有全量复制,这样会导致短暂的网络波动也会引起从节点重新向主节点发起全量复制,产生过高的开销。所以在Redis 2.8版本带来了增量复制,有效的避免了不必要的全量复制。

首先,我们来了解一下几个概念。

1.复制偏移量

参与复制的主从节点都会维护自身的复制偏移量。

主节点在处理完写命令之后,会把命令的字节长度做累计记录。通过 info replication 命令中的 master_repl_offset 指标可以看到偏移量:

从节点每秒钟上报自身的复制偏移量到主节点,因此主节点也会保存从节点的复制偏移量,具体在slave指标的offset中:

从节点在同步收到主节点的命令后,也会累加记录自身的偏移量,统计在 info replication 中的 slave_repl_offset 指标中:

通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致。通过 master_repl_offset - slave_repl_offset 可以计算出主从节点复制相差得数据量,这个差值可以判定当前复制的健康度。

2.复制积压缓冲区

复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为1M,当主节点有连接的从节点时复制积压缓冲区会被创建,这时主节点响应写命令时,不仅会把命令发送给从节点,还会写入到复制积压缓冲区。

复制积压缓冲区采用先进先出的原则,能保存最近已复制的数据,用于在增量复制时对于丢失的数据进行补救,在 info rellication 命令中可以看到复制积压缓冲区的详细信息:

3.主节点运行ID

每个Redis节点启动后都会分配一个40位的十六进制字符串作为运行ID。

运行ID的主要作用是用来识别Redis节点,从节点会保存主节点的运行ID用来表示自己正在复制的时哪个主节点。

如果从节点只使用ip+port来识别主节点,那么在主节点重启变更了整体数据集之后(比如说使用RDB持久化,重启丢失了部分数据),从节点再基于偏移量复制数据将是不安全的,因此当主节点运行ID变化后从节点将做全量复制。

通常情况下重启Redis后运行ID会随之变化,运行ID变化的主要原因在于重启后加载的RDB文件可能不是最新数据的快照,如果运行ID不变的话可能导致从节点还基于偏移量来对主节点做增量复制。

如果希望重启Redis并且不修改运行ID,可以执行 debug reload 命令,这个命令会阻塞当前Redis主线程,阻塞期间会生成本地RDB快照并清空数据之后再加载RDB文件。由于会阻塞主线程并且生成新的RDB文件,所以再大数据量的主节点需要谨慎使用。

4.psync命令

从节点发送psync命令会实现同步数据集的功能,命令格式:

其中runId是所复制的主节点的运行ID,offset是从节点已复制数据的偏移量。

psync命令流程:

从节点发送psync命令到主节点,如果没有runId则默认值为?,如果是第一次参与复制offset默认值-1

主节点根据psync参数和自身数据情况响应结果

响应+FULLRESYNC ,那么从节点将触发全量复制

响应+CONTINUE,那么从节点触发增量复制

响应+ERR,说明主节点版本低于2.8,无法识别psync命令,从节点将发送旧版的sync命令触发全量复制

5.全量复制

全量复制是Redis早期唯一支持的复制方式,也是主从之间第一次建立复制时必须的过程。

全量复制会复制主节点上的所有数据,全量复制的过程包括主节点生成RDB,主从节点之间传递RDB文件以及从节点执行RDB文件,在此期间会大量消耗服务器的CPU、内存和网络资源。

6.增量复制

增量复制是Redis针对全量复制过高开销做出的一种优化措施,使用 psync 命令实现。

如果因为网络原因导致主从节点之间的连接断开,在网络恢复之后,从节点会发送 psync 命令到主节点,主节点会根据从节点已复制的偏移量offset在主节点的复制积压缓冲区中找到对应的数据同步到从节点,可以很好的解决主从复制之间因为网络短时间中断造成的数据不一致问题;从节点已复制的偏移量offset在主节点的复制积压缓冲区中找不到,那么将触发全量复制。

总结

今天这篇文章介绍了Redis复制时主从节点之间数据同步的方式,下一篇文章将带来全量复制和增量复制的具体实现方式。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180913G0D3QK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券