redis 复制提纲
让一个服务器去复制另一个服务器 slaveof
基本概念
Redis 复制功能分为同步(Sync)和命令传播(command propagate)两个操作
同步流程
发送Sync命令
发送RDB文件
发送缓冲区保存的所有写命令
旧版本复制的功能缺陷
初次复制、断线后复制
Sync需要执行BGSAVE,非常消耗资源
断线后没有必要再次进行全量复制
新版复制功能的实现
使用PSYNC命令代替SYNC命令来执行复制时候的同步操作
PSYNC具有完整重同步(full resynchronization)和部分重同步(partial resynchronization) 两种模式
完整重同步用于初次复制,执行步骤和SYNC命令的执行步骤基本一样。
部分重同步用于断线后复制的情况。部分重同步有一下三部分组成:
主服务器的复制偏移量(replication offset)和从服务器的复制偏移量
主服务器的复制积压缓冲区(replication backlog),主服务器维护的一个固定长度先进先出的队列默认大小1MB。
服务器的运行ID (run ID),在启动时生成,40个随机的十六进制字符组成。
部分重同步的流程:
从服务器通过PSYNC命令将自己的偏移量发给主服务器,主服务器根据这个偏移量判断执行何种同步。
如果积压的命令已经不再积压缓冲区了,那么就进行完整重同步。
PSYNC
从服务器:从服务器从来没有复制过任何服务器,发送PSYNC -1命令
从服务器:复制过,发送PSYNC
命令, 主服务器:返回 + FULLRESYNC
表示进行全整重同步 主服务器:返回 + CONTINUE 表示进行部分重同步。
复制流程
设置主服务器的地址和端口
建立套接字连
发送PING命令
身份验证
发送端口信息
同步
命令传播