一。新版复制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>,发送则为初次复制);最后,如果不相同则直接执行完整重同步,相同则尝试通过复制偏移量和复制积压缓冲区的比对来执行部分重同步)

最新文章

  1. Android学习笔记(三)
  2. java 动态编译
  3. python面向对象编程实例解析
  4. Wine install, 卸载的方法
  5. 使用ajax提交form表单(转)
  6. 个人完善的springboot拦截器
  7. 学习python importlib的导入机制
  8. PHP文件系统管理
  9. linux 使用的部分命令
  10. Grunt jshint Warning: Path must be a string . Received null Use
  11. 基础:位(bit)、字节(byte)、字符、编码之间的关系
  12. windows 远程连接“发生身份验证错误 要求的函数不受支持”
  13. 使用git连接本地和远程github
  14. 关于flask自带web应用服务器Werkzeug 使用requests请求时出现的错误。
  15. C++ 与 CDC相关的知识,点滴总结
  16. DataTable的数据或表结构复制
  17. spring boot 通过Maven + tomcat 自动化部署
  18. Git 基础 - 查看提交历史
  19. EasyUI获取所有选中行中的某一列的值
  20. jquery-3 jquery选择器

热门文章

  1. WPF 简单打印
  2. 【C#】wpf自定义calendar日期选择控件的样式
  3. Win8Metro(C#)数字图像处理--2.25二值图像距离变换
  4. WebApi 中FromUri参数自动解析成实体的要求
  5. git + gerrit push 代码问题
  6. C++&amp;Win32写的空当接龙
  7. QAbstractItemView为截断的项显示ToolTip(使用事件过滤)
  8. 把滚动箱的样式做如下调整来模拟 TPanel
  9. python常用点小记
  10. C语言指针学习总结