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检测到写命令缺失,会补发写命令;

* 代码分析

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值