一。新版复制PSYNC命令实现:复制实现总流程
(1)通过客户端向从服务器发送 slaveof <master_ip> <master_port>;此为异步执行,从服务器设置好属性后向客户端返回OK时才真正执行复制
(2)建立套接字连接;(可认为从服务器变成了主服务器的客户端)
(3)从服务器发送PING命令,主服务器返回PONG命令;返回则继续执行,否则断开重连
(4)从服务器是否设置了masterauth;设置了则需进行身份验证,未设置则跳过
(5)从服务器向主服务器发送从服务器监听的端口号
(6)PSYNC命令数据同步(完整重同步或部分重同步)
(7)命令传播(保持主从服务器数据一致,收/发命令时,从/主服务器的复制偏移量增加;同时,将命令传播至复制积压缓冲区)
(8)心跳检测(默认每秒一次)
二。新版复制PSYNC命令实现:同步与命令传播
服务器中的三个重要参数:复制偏移量、复制积压缓冲区、服务器运行ID
1.主/从服务器的复制偏移量:记录收/发字节数(主发送多少则偏移量增加多少,从接收多少则偏移量增加多少);用于判断主从服务器数据是否一致(通过偏移量是否相同)。
2.主服务器的复制积压缓冲区:固定长度FIFO队列,默认1M,存储最近的一部分命令;用于部分重同步。
(首先,命令传播时不仅将命令发送给从服务器还会将命令发送到复制积压缓冲区;其次,断线后重复制时先判断是否能够进行部分重同步即判断复制偏移量offset之后的数据是否还在复制积压缓冲区中;最后,如果存在则返回+CONTINUE回复,将复制积压缓冲区在偏移量之后的数据发送给从服务器,完成部分重同步;不存在,则返回+FULLRESYNC <runid> <offset>并执行完整重同步)
3.服务器运行ID:记录主从服务器运行ID;用于部分重同步。
(首先,初次复制时主服务器将自己的运行ID发送给从服务器,从服务器保存该ID;其次,断线重连后从服务器通过运行ID判断重连的是否为上次的主服务器(是否发送PSYNC <runid> <offset>,发送则为初次复制);最后,如果不相同则直接执行完整重同步,相同则尝试通过复制偏移量和复制积压缓冲区的比对来执行部分重同步)