数据密集型应用系统设计--数据复制
简介
引入数据复制的原因:
- 数据距离用户更近,让用户访问延迟降低
- 提高容错机制,某个节点坏掉后,其备份节点仍然能提供服务
- 负载扩展到多台机器,提高吞吐量
复制技术的真正难点在于如何处理持续变更的数据。
主节点与从节点
主从复制:
- 指定某个副本作为主副本,客户端全部写入主副本,更新主副本本地存储。
- 主副本把数据发送给从副本,从副本严格按照主副本发来的操作顺序,操作本地存储的数据
- 客户端可以从所有的副本中读取数据
同步复制: 主节点发送给从节点数据后,需要等从节点回复
异步复制: 主节点发送给从节点数据后,不必等从节点回复
同步复制,如果由于某些原因,导致主节点一直没有收到从节点的回复,那么后续的复制操作会阻塞。不过,同步复制逻辑简单,主节点发生故障后,任何一个从节点都可以当主节点。
异步复制,IO 非常高效,但是从节点会存在数据滞后的问题,主节点挂掉后,数据丢失。
半同步复制:有一个从节点保持和主节点同步操作,其余的从节点才用异步操作。相当于有个备份的主节点
配置新的从节点: 主节点定时 dump 数据快照,在下一次 dump 数据快照之前,保留更改的操作日志。新的从节点加入后,先发送数据快照,然后再发送更改日志即可。像 redis 之类的备份操作,都是这么做的。
实现复制日志:
- 基于语句的复制:复制
INSERT DEL
等更改语句,然后把对应的语句发送给从节点。实现简单,但是缺陷在于RNAD NOW
等与环境有关的命令没有意义。 - 基于 WAL 预写日志:对于 SSTable 或者 LSMT 的方式,保留 追加的 write 日志,然后发送给从节点即可。适用于追加模式的数据库。
- 基于行的逻辑日志复制:类似于 MySQL 的 binlog,复制与存储分离。
复制滞后
复制滞后的问题,一般是暂时的,异步复制最终会一致,称之为『最终一致性』
**读自己的写:**写入主副本,但是读的从副本还没同步完数据
**单调读:**用户获取的数据的时间戳顺序不对。比如 A、B、C 3个对等机器,用户的请求路由到了3个机器上,A 中存在 x 用户的评论,但是 B C 中没有,A 返回了结果,B、C 也返回了结果,但是 B、C 的结果覆盖了 A 的结果,导致用户看到的评论消失了。
**前缀一致性:**用户获取的数据的时间戳是乱序的
多主节点
多个主节点,每个主节点同时是其他主节点的从节点。这些主节点,有自己的私有从节点。
场景:
- 多个数据中心同步数据
- 用户多个设备,比如一个用户有mac、iphone 和 ipad 这样的场景。这些设备可以离线
- 协作编辑
多主节点最难解决的是写入冲突的问题,一般来说最佳方案是避免冲突,其余方案这里暂时不涉及。
多主节点的拓扑结构:
- 环状拓扑
- 星式拓扑
- p2p 模式
1和2的模式,最麻烦的地方在于关键路径损坏的话,会干扰整个集群的同步
无主节点
无主节点的方式,放弃主节点,允许客户端直接写入所有的结点。
客户端写入的时候,向多个副本写入数据。读取的时候,从多个副本读取。
- 读修复:假设某个节点下线后重新上线,其中的数据落后其他副本。则读取的时候,客户端会使用其他副本的数据,并更新当前落后节点的数据
- 反熵过程:客户端读取的时候,把其他副本中存在的数据,写入一个或者多个不存在数据的副本
假设 w 是一次性写入的副本个数,r 是一次性读取的副本的个数,n 是总的节点的个数,那么需要满足:w + r > n
w + r > n 通常可以配置,可以计算能容忍的坏节点的个数。
w + r 风格的局限性:
- 同时写入的情况,无法确认先后顺序
- 读写同时发生时,读的数据可能仍然是就值,因为写操作可能只是发生了一部分
- 某些副本写失败,整体操作认为失败,但是仍然有部分节点是成功的,此时读脏数据
数据密集型应用系统设计--数据复制相关推荐
- 数据密集型应用系统设计--数据存储与检索
数据结构 追加型数据库和哈希索引 数据库最简单的形式,是追加型的方式: 写入数据直接追加到文件尾部,O(1)复杂度 读取数据从文件头遍历,获取最新的数据 这种数据库,没有删除操作,所有的数据都是追加性 ...
- 数据密集型应用系统设计--数据分区
数据分区与数据复制 分区的目的一般是提高可扩展性.容错性和集群吞吐,同一个分区会在多个节点中都有副本. 容错性:一个节点挂掉,则这个节点上的分区,在其他节点上都有副本,可以查询其他的节点 可扩展性:新 ...
- Designing Data-Intensive Application《数据密集型应用系统设计》笔记
Designing Data-Intensive Application 中译<设计数据密集型应用>又名<数据密集型应用系统设计>,我看的是冯若航在gitbook开源的翻译版本 ...
- 《数据密集型应用系统设计》读书笔记——第一部分 数据系统基础
第一部分 数据系统基础 第1章 可靠.可扩展与可维护的应用系统 当今许多新型应用都属于数据密集型,而不是计算密集型.对于这些类型应用,CPU的处理能力往往不是第一限制性因素,关键在于数据量.数据的复杂 ...
- 豆瓣评分 9.7 的神书:《数据密集型应用系统设计》
我最近在读一本好书<数据密集型应用系统设计>(也被叫做 DDIA).这真是本相见恨晚的神书. 这是怎样一本神书?豆瓣评分高达 9.7 分! 什么是「数据密集型应用系统」? 当数据(数据量. ...
- 数据密集型应用系统设计-第七章分布式系统的麻烦-笔记
这阵子在看数据密集型应用系统设计书籍,自己把书籍比较重要的内容整理出来,基本一天一更,请感兴趣的朋友多多关注! 整个系列会在这几天都发布出来,可以关注一下 链接: 数据密集型应用系统设计-笔记. 文章 ...
- 数据密集型应用系统设计 [Designing Data-Intensive Applications]
作者:[美] Martin Kleppmann(马丁·科勒普曼) 著,赵军平 吕云松 耿煜 李三平 译 出版社: 中国电力出版社 出版时间:2018-09-01 数据密集型应用系统设计 [Design ...
- 《数据密集型应用系统设计》读书笔记——数据系统基础
因为个人兴趣,想学学分布式方面的知识,然后找到了这本<数据密集型应用系统设计>,确实非常的不错,无论对于以前的工程还是现在的科研都有启迪和感悟,所以就写份读书笔记记录一下,里面提到的知识非 ...
- 数据密集型应用系统设计——笔记
本篇章内容为阅读<数据密集型应用系统设计>一书的读书笔记. 作为个人成长学习使用,同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放,芳香四溢,在风中舞蹈! 写在前 ...
最新文章
- 能在不同的深度学习框架之间转换模型?微软的MMdnn做到了
- 用Leangoo看板工具做办公室采购流程管理
- iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()
- python代码示例图形-纯干货:手把手教你用Python做数据可视化(附代码)
- 全球及中国奢华高档服装行业发展规划及投资价值评估报告2021年版
- 对于初学者而言!如何处理 Python 入门难以进步的现象?
- 解决MySQL事务未提交导致死锁报错 避免死锁的方法
- pycharm快敏捷键
- 20个公司绝对不会告诉你的潜规则
- MySQL批处理SQL语句
- 查找子字符串----KMP算法深入剖析
- Security+ 学习笔记34 硬件安全
- STM8S与IAR程序常用错误
- cf进入服务器未响应,win7系统玩cf未响应的解决方法
- Selenium Web自动化测试框架搭建
- 代码没问题但运行不出来
- 【R_绘图】绘图字体设为Times New Roman
- 《牛奶可乐经济学》读书笔记
- 最短路问题的线性规划模型
- Android拍照,照片会自己旋转
热门文章
- java控制硬件_厨师都开始用Python和Java了,现在C语言还值得我们学习吗?
- Puzzle——模拟
- 程序在Linux下后台运行,进程查看及终止
- Jupyter Notebook——如何显示目录的导航栏(安装 Jupyter Notebook extension)
- PyTorch nn.GRU 使用详解
- OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
- stm32单片机OLED显示图片 位图转换 Image2Lcd使用
- 使用VS自带的打包工具,制作winform安装项目
- CleanCodeHandbook Chapter 3: Linked List(20-24)
- Java:源文件名、公共类名、main()方法之间关系