PSYNC 部分重同步的原理

150 阅读2分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

PSYNC 部分重同步的原理

部分重同步分为三部分:

主服务器的复制偏移量和从服务器的复制偏移量

主服务器的复制积压缓冲区

服务器的运行ID

主服务器的复制偏移量和从服务器的复制偏移量

执行复制的主服务器和从服务器都会分别维护一个复制偏移量,主服务器每次向从服务器传播N个字节的数据,将自己的复制偏移量的值加N,从服务器每次收到主服务器传播来的N个字节的数据,将自己的复制偏移量加N

当主从服务器的偏移量相同说明主从服务器处于一致状态

主服务器的复制积压缓冲区

复制积压缓冲区是由主服务器维护的一个固定长度先进先出队列,默认大小为1MB

当主服务器进行命令传播时,不仅会将写命令发送给所有从服务器,还会将写命令入队到复制积压缓冲区里面,复制积压缓冲区为队列中的每个字节记录相应的复制偏移量

当从服务器重新连上主服务器时,从服务器会通过PSYNC命令将自己的复制偏移量offset发送给主服务器,主服务器根据这个复制偏移量决定进行部分重同步操作还是完整重同步,如果偏移量之后的数据存在于复制积压缓冲区里,对从服务器执行部分重同步操作,如果不存在进行完整重同步

服务器的运行ID

每个Redis服务器都有个运行ID,运行ID在服务器启动时自动生成,由40个随机的十六进制字符组成,当从服务器对主服务器进行初次复制时,主服务器将自己的运行ID传给从服务器,从发起将这个运行ID保存起来。当从服务器断线后重连主服务器,将运行ID发送给主服务器,如果两个ID相同,说明从服务器断线之前复制的就是当前连接的这个主服务器,进行部分重同步,如果两者不相同就需要进行完整重同步