redis 复制 replication机制、原理及实现代码分析
* 方案
完全重同步
* slave发送sync命令;
*主收到sync命令后执行bgsave命令,后台生成rdb文件,并用一个写缓存区记录从现在开始执行的所有写命令;
* 当bgsave执行完毕,master将rdb文件发送给slave,slave接收到这个rdb文件,用rdb更新数据库;
* master把写缓冲区的所有写命令发送给slave;slave执行这些命令,将自己的数据库状态更新至master当前所处状态;
部分重同步
部分重同步功能
部件:master/slave复制偏移量;master复制积压缓冲区-(fifo队列);server 运行id;
* slave没有复制过任何master,或者之前执行过slave no one,master发送psync?-1命令,主动请求完整重同步;
* 相反,slave向master发送 psync <runid> <offset>,runid为上次master的ID,offset为slave当前的复制偏移量;
部分重同步 master的回复:
* master回复 fullresync <runid> <offset>,<runid>为master的runid;
* master回复+continue,master将与slave执行部分重同步操作;
注:两个图来源书籍《redis 设计与实现》
# 复制实现步骤
* 设置master的ip和port;
* slave与master建立socket链接,slave作为客户端;
* slave发送ping命令,master回复pong命令或者返回错误;或者超时;
* 身份验证:slave发送 auth xxx验证;
* slave向master发送端口信息replconf listening-port <port-num>,slave作为服务端,master根据这个port建立到slave的socket链接,作为客户端;
* 进行同步:完全重同步或部分重同步步骤;
* 命令传播:当同步完成后,master一直讲自己执行的写命令,发送给slave;
* slave每秒一次向master发送 replconf ack <replication_offset> 报告自己的复制偏移量,如果master检测到写命令缺失,会补发写命令;
* 代码分析