简介

引入数据复制的原因:

  1. 数据距离用户更近,让用户访问延迟降低
  2. 提高容错机制,某个节点坏掉后,其备份节点仍然能提供服务
  3. 负载扩展到多台机器,提高吞吐量

复制技术的真正难点在于如何处理持续变更的数据。

主节点与从节点

主从复制:

  1. 指定某个副本作为主副本,客户端全部写入主副本,更新主副本本地存储。
  2. 主副本把数据发送给从副本,从副本严格按照主副本发来的操作顺序,操作本地存储的数据
  3. 客户端可以从所有的副本中读取数据

同步复制: 主节点发送给从节点数据后,需要等从节点回复
异步复制: 主节点发送给从节点数据后,不必等从节点回复

同步复制,如果由于某些原因,导致主节点一直没有收到从节点的回复,那么后续的复制操作会阻塞。不过,同步复制逻辑简单,主节点发生故障后,任何一个从节点都可以当主节点。
异步复制,IO 非常高效,但是从节点会存在数据滞后的问题,主节点挂掉后,数据丢失。
半同步复制:有一个从节点保持和主节点同步操作,其余的从节点才用异步操作。相当于有个备份的主节点

配置新的从节点: 主节点定时 dump 数据快照,在下一次 dump 数据快照之前,保留更改的操作日志。新的从节点加入后,先发送数据快照,然后再发送更改日志即可。像 redis 之类的备份操作,都是这么做的。

实现复制日志:

  1. 基于语句的复制:复制 INSERT DEL 等更改语句,然后把对应的语句发送给从节点。实现简单,但是缺陷在于RNAD NOW 等与环境有关的命令没有意义。
  2. 基于 WAL 预写日志:对于 SSTable 或者 LSMT 的方式,保留 追加的 write 日志,然后发送给从节点即可。适用于追加模式的数据库。
  3. 基于行的逻辑日志复制:类似于 MySQL 的 binlog,复制与存储分离。

复制滞后

复制滞后的问题,一般是暂时的,异步复制最终会一致,称之为『最终一致性』

**读自己的写:**写入主副本,但是读的从副本还没同步完数据
**单调读:**用户获取的数据的时间戳顺序不对。比如 A、B、C 3个对等机器,用户的请求路由到了3个机器上,A 中存在 x 用户的评论,但是 B C 中没有,A 返回了结果,B、C 也返回了结果,但是 B、C 的结果覆盖了 A 的结果,导致用户看到的评论消失了。
**前缀一致性:**用户获取的数据的时间戳是乱序的

多主节点

多个主节点,每个主节点同时是其他主节点的从节点。这些主节点,有自己的私有从节点。

场景:

  1. 多个数据中心同步数据
  2. 用户多个设备,比如一个用户有mac、iphone 和 ipad 这样的场景。这些设备可以离线
  3. 协作编辑

多主节点最难解决的是写入冲突的问题,一般来说最佳方案是避免冲突,其余方案这里暂时不涉及。

多主节点的拓扑结构:

  1. 环状拓扑
  2. 星式拓扑
  3. p2p 模式
    1和2的模式,最麻烦的地方在于关键路径损坏的话,会干扰整个集群的同步

无主节点

无主节点的方式,放弃主节点,允许客户端直接写入所有的结点。

客户端写入的时候,向多个副本写入数据。读取的时候,从多个副本读取。

  1. 读修复:假设某个节点下线后重新上线,其中的数据落后其他副本。则读取的时候,客户端会使用其他副本的数据,并更新当前落后节点的数据
  2. 反熵过程:客户端读取的时候,把其他副本中存在的数据,写入一个或者多个不存在数据的副本

假设 w 是一次性写入的副本个数,r 是一次性读取的副本的个数,n 是总的节点的个数,那么需要满足:w + r > n
w + r > n 通常可以配置,可以计算能容忍的坏节点的个数。

w + r 风格的局限性:

  1. 同时写入的情况,无法确认先后顺序
  2. 读写同时发生时,读的数据可能仍然是就值,因为写操作可能只是发生了一部分
  3. 某些副本写失败,整体操作认为失败,但是仍然有部分节点是成功的,此时读脏数据

数据密集型应用系统设计--数据复制相关推荐

  1. 数据密集型应用系统设计--数据存储与检索

    数据结构 追加型数据库和哈希索引 数据库最简单的形式,是追加型的方式: 写入数据直接追加到文件尾部,O(1)复杂度 读取数据从文件头遍历,获取最新的数据 这种数据库,没有删除操作,所有的数据都是追加性 ...

  2. 数据密集型应用系统设计--数据分区

    数据分区与数据复制 分区的目的一般是提高可扩展性.容错性和集群吞吐,同一个分区会在多个节点中都有副本. 容错性:一个节点挂掉,则这个节点上的分区,在其他节点上都有副本,可以查询其他的节点 可扩展性:新 ...

  3. Designing Data-Intensive Application《数据密集型应用系统设计》笔记

    Designing Data-Intensive Application 中译<设计数据密集型应用>又名<数据密集型应用系统设计>,我看的是冯若航在gitbook开源的翻译版本 ...

  4. 《数据密集型应用系统设计》读书笔记——第一部分 数据系统基础

    第一部分 数据系统基础 第1章 可靠.可扩展与可维护的应用系统 当今许多新型应用都属于数据密集型,而不是计算密集型.对于这些类型应用,CPU的处理能力往往不是第一限制性因素,关键在于数据量.数据的复杂 ...

  5. 豆瓣评分 9.7 的神书:《数据密集型应用系统设计》

    我最近在读一本好书<数据密集型应用系统设计>(也被叫做 DDIA).这真是本相见恨晚的神书. 这是怎样一本神书?豆瓣评分高达 9.7 分! 什么是「数据密集型应用系统」? 当数据(数据量. ...

  6. 数据密集型应用系统设计-第七章分布式系统的麻烦-笔记

    这阵子在看数据密集型应用系统设计书籍,自己把书籍比较重要的内容整理出来,基本一天一更,请感兴趣的朋友多多关注! 整个系列会在这几天都发布出来,可以关注一下 链接: 数据密集型应用系统设计-笔记. 文章 ...

  7. 数据密集型应用系统设计 [Designing Data-Intensive Applications]

    作者:[美] Martin Kleppmann(马丁·科勒普曼) 著,赵军平 吕云松 耿煜 李三平 译 出版社: 中国电力出版社 出版时间:2018-09-01 数据密集型应用系统设计 [Design ...

  8. 《数据密集型应用系统设计》读书笔记——数据系统基础

    因为个人兴趣,想学学分布式方面的知识,然后找到了这本<数据密集型应用系统设计>,确实非常的不错,无论对于以前的工程还是现在的科研都有启迪和感悟,所以就写份读书笔记记录一下,里面提到的知识非 ...

  9. 数据密集型应用系统设计——笔记

    本篇章内容为阅读<数据密集型应用系统设计>一书的读书笔记. 作为个人成长学习使用,同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放,芳香四溢,在风中舞蹈! 写在前 ...

最新文章

  1. 能在不同的深度学习框架之间转换模型?微软的MMdnn做到了
  2. 用Leangoo看板工具做办公室采购流程管理
  3. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()
  4. python代码示例图形-纯干货:手把手教你用Python做数据可视化(附代码)
  5. 全球及中国奢华高档服装行业发展规划及投资价值评估报告2021年版
  6. 对于初学者而言!如何处理 Python 入门难以进步的现象?
  7. 解决MySQL事务未提交导致死锁报错 避免死锁的方法
  8. pycharm快敏捷键
  9. 20个公司绝对不会告诉你的潜规则
  10. MySQL批处理SQL语句
  11. 查找子字符串----KMP算法深入剖析
  12. Security+ 学习笔记34 硬件安全
  13. STM8S与IAR程序常用错误
  14. cf进入服务器未响应,win7系统玩cf未响应的解决方法
  15. Selenium Web自动化测试框架搭建
  16. 代码没问题但运行不出来
  17. 【R_绘图】绘图字体设为Times New Roman
  18. 《牛奶可乐经济学》读书笔记
  19. 最短路问题的线性规划模型
  20. Android拍照,照片会自己旋转

热门文章

  1. java控制硬件_厨师都开始用Python和Java了,现在C语言还值得我们学习吗?
  2. Puzzle——模拟
  3. 程序在Linux下后台运行,进程查看及终止
  4. Jupyter Notebook——如何显示目录的导航栏(安装 Jupyter Notebook extension)
  5. PyTorch nn.GRU 使用详解
  6. OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
  7. stm32单片机OLED显示图片 位图转换 Image2Lcd使用
  8. 使用VS自带的打包工具,制作winform安装项目
  9. CleanCodeHandbook Chapter 3: Linked List(20-24)
  10. Java:源文件名、公共类名、main()方法之间关系