另外一篇写的很好很深入的文章:http://www.tuicool.com/articles/fAnYFb ; RDB持久化 http://www.tuicool.com/articles/F3Erii2

复制即主服务器向从服务器的数据同步,REDIS的实现具有参考意义,尤其对于有主从同步需求,数据量不是特别大,可以用内存存储,其中巧妙之处在于 offset和缓冲区的配对使用,让主服务器能够很快的知道应该同步哪些数据,即使面对多个从服务器可以做到处理流程一样。

书中分析了老版本和新版本在复制过程中,断链发生时的不同处理,来描述复制的过程。

老版本复制主要2个方式:

1. 从服务器主动发送SYNC给主服务器,主服务器启动BGSAVE,生成一个DB文件,传给从服务器,从服务器加载DB文件,然后主服务器将这个过程中接收到的写命令也同步给从服务器,从服务器也执行这些写命令,同步结束。

SYNC的过程是非常耗费资源的,CPU,内存,带宽都会在不同时期被占用

2. 主从服务器DB相同,主服务器执行了写命令,主动同步给从服务器,称之为命令传播

老版本的bug:上面第2点,假如主服务器和从服务器断链,主服务器无法感知,依然进行命令传播,将主服务器上的写命令传送给从服务器,而从服务器接收不到,最后建连后数据就不一致了。

当然,建链后可以直接来一次SYNC,不过这样过于耗费资源。

新版本:

有了PSYNC命令,断链后,等到建链,从服务器发送PSYNC给主服务器,主服务器会将断链时间段的所有写命令同步给从服务器。

下图中+CONTINUE回复标识开始部分同步。

二 部分复制的实现细节:

1. 首先,主从服务器都会记下同步的字节数,所谓复制偏移量,主服务器上记录 同步多少字节给从服务器,从服务器记录接收到主服务器同步多少个字节,下图15-7中同步了10086字节的数据

如果断链后恢复,从服务器发送PSYNC给主服务器,带上本地的复制偏移量,主服务器比较后发现和本地的不一样,就意味着主从数据不一致,需要进行数据同步。

2. 主服务发现本地的offset和从服务器的offset不一致,意味着要进行数据同步,怎么同步呢?

主服务器中会有一个固定长度(1MB)的FIFO的复制积压缓冲区(server.repl_backlog),每个复制到从服务器的字节,都会储存在这个缓冲区中,每个字节都对应到一个offset.(实现在feedReplicationBacklog)

(masterTryPartialResynchronization)当从服务器发送PSYNC,带来自己的offset,主服务器会在复制积压缓冲区中查找,如果offset+1依然在缓冲区中,没有被挤压出队列(固定长度FIFO,存储最新的命令,如果队列满,最老的命令会被挤压出队列),就可以执行部分复制(addReplyReplicationBacklog进行复制哪一部分的挑选)。否则就要进行全部复制,即SYNC

2.服务器运行ID,从服务器会存储主服务器的运行ID,此ID是全局唯一的。如果断链再建联,主服务器发现从服务器发来的主服务器运行ID(伴随PSYNC命令)和自己的不一样,那么就要进行完整的复制,如果ID一致,可以选择进行部分复制。

三 心跳检测 -- 补发缺失数据

从服务器会定时向主服务器发送ACK(replicationSendAck中实现),进行心跳保活,消息会带上server.master->reploff,那么当主向从同步时,消息有丢失,导致slave的offset没有更新,那么主服务器通过比较本地的offset和消息里salve的offset,就知道需要重新发送部分数据给slave.

这个方法主要是防止master和slave都没有断线,只是有通信的丢包,无法触发上面说到的部分重同步功能,因为部分重同步是建立在断链后恢复的前提的。

[redis读书笔记] 第三部分 多机数据库的实现 复制的更多相关文章

  1. 《Linux内核设计与分析》第六周读书笔记——第三章

    <Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...

  2. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  3. 读书笔记第三周 人月神话 刘鼎乾 PB16070837

    读书笔记第三周:人月神话   这本书主要讲述了如何管理一个软件开发团队的问题,其中如何提高团队的效率可以说是本书的重点之一了.感觉这本书地中文版翻译得比较晦涩,很多表达比较模糊,看起来有些吃力,因此下 ...

  4. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形

    原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...

  5. 《Redis 设计与实现》读书笔记(三)

    多机数据库实现 十五 .复制 从服务器通过命令 slaveof 127.0.0.1 6000 成为主服务器的从服务器.然后执行复制操作,保持自己的状态和主服务器一样 1.理论 同步 成为从服务器后的同 ...

  6. Redis学习笔记(三)Redis支持的5种数据类型的总结

    继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...

  7. 《android开发艺术探索》读书笔记(三)--分发机制和滑动冲突

    接上篇<android开发艺术探索>读书笔记(二) No1: 通过MotionEvent对象可以得到点击事件发生的x和y坐标,getX/getY返回的是相对于当前View左上角的x和y坐标 ...

  8. [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串

    本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...

  9. 【高性能Mysql 】读书笔记(三)

    第5章 创建高性能的索引 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 索引基础 索引的重要性:找一本800面的书的某一段内容,没有目录也没有页码(页码也可类比 ...

随机推荐

  1. 小白学 Python 爬虫(39): JavaScript 渲染服务 scrapy-splash 入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  2. Yolo V3损失函数占个坑

    https://blog.csdn.net/weixin_43384257/article/details/100974776目前来看讲的最清楚的博客 https://zhuanlan.zhihu.c ...

  3. linux下挂载硬盘出错的解决方法

    我的电脑是 Uuntu16.04 + win10 双系统,今天在Ubuntu中打开D盘时报错 Error mounting /dev/sda5 原因是D盘的格式是ntfs,在linux中会出现不识别的 ...

  4. java.sql.SQLException: connection holder is null 问题处理

    问题描述 上上个周测试的时候突然报系统异常,于是我立即查看日志,发现是一个数据库异常:java.sql.SQLException: connection holder is null我第一想到的就是可 ...

  5. 测试必备之Java知识(二)—— Java高级的东西

    Java高级 类加载过程 加载(创建class对象) -> 连接(验证-准备-解析) -> 类初始化 类加载器类别 根类加载器:加载java核心类 扩展类加载器:加载JRE目录中的jar包 ...

  6. CSS基础应用总结

    目录 CSS 样式笔记 文字水平居中和垂直居中 如何设置a标签不带下划线 控件右对齐 div上下居中 控件左右居中 控件展示在同一行 设置文字超出部分...显示 CSS 样式笔记 文字水平居中和垂直居 ...

  7. pta 6-7 统计某类完全平方数 (20分)

    6-7 统计某类完全平方数 (20分) 本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144.676等. 函数接口定义: int IsTheNumber ...

  8. Python+Excel 操作对比

    前言 从网页爬下来的大量数据需要excel清洗成堆的科学实验数据需要导入excel进行分析作为一名面向逼格的Python程序员该如何合理而又优雅的选择生产力工具呢? 得益于辛勤劳作的python大神们 ...

  9. GP工作室—Alpha版本发布1

    目录 GP工作室-Alpha版本发布1 一.简介 1.1作业要求 1.2团队成员 二.软件下载安装说明 五.项目总结 @(Gold Point团队の项目计划) GP工作室-Alpha版本发布1 一.简 ...

  10. Python学习,第六课 - 集合

    Python中集合的相关操作 集合是一个无序的,不重复的数据组合 它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 list_1 =set ...