bold format

This commit is contained in:
Vonng 2020-01-02 13:17:10 +08:00
parent 5a9f4a9315
commit 4408677a5f
9 changed files with 92 additions and 96 deletions

View File

@ -3,8 +3,8 @@
- 作者: [Martin Kleppmann](https://martin.kleppmann.com) - 作者: [Martin Kleppmann](https://martin.kleppmann.com)
- 原书名称:[《Designing Data-Intensive Application》](http://shop.oreilly.com/product/0636920032175.do) - 原书名称:[《Designing Data-Intensive Application》](http://shop.oreilly.com/product/0636920032175.do)
- 译者:[冯若航]( http://vonng.com/about) fengruohang@outlook.com - 译者:[冯若航]( http://vonng.com/about) fengruohang@outlook.com
- Gitbook地址[ddia-cn](https://www.gitbook.com/book/vonng/ddia-cn)(需要科学上网) - Gitbook地址[ddia-cn](https://www.gitbook.com/book/vonng/ddia-cn)
- 建议使用[Typora](https://www.typora.io)或Gitbook以获取最佳阅读体验。 - 使用[Typora](https://www.typora.io)或Gitbook以获取最佳阅读体验。
@ -27,15 +27,13 @@
##
## 前言 ## 前言
> 在我们的社会中,技术是一种强大的力量。数据、软件、通信可以用于坏的方面:不公平的阶级固化,损害公民权利,保护既得利益集团。但也可以用于好的方面:让底层人民发出自己的声音,让每个人都拥有机会,避免灾难。本书献给所有将技术用于善途的人们。 > 在我们的社会中,技术是一种强大的力量。数据、软件、通信可以用于坏的方面:不公平的阶级固化,损害公民权利,保护既得利益集团。但也可以用于好的方面:让底层人民发出自己的声音,让每个人都拥有机会,避免灾难。本书献给所有将技术用于善途的人们。
--------- ---------
> 计算是一种流行文化,流行文化鄙视历史。 流行文化关乎个体身份和参与感,但与合作无关。流行文化活在当下,也与过去和未来无关。 我认为大部分(为了钱)编写代码的人就是这样的, 他们不知道自己的文化来自哪里。 > 计算是一种流行文化,流行文化鄙视历史。 流行文化关乎个体身份和参与感,但与合作无关。流行文化活在当下,也与过去和未来无关。 我认为大部分(为了钱)编写代码的人就是这样的, 他们不知道自己的文化来自哪里。
> >
> ——阿兰·凯接受Dobb博士的杂志采访时2012年 > ——阿兰·凯接受Dobb博士的杂志采访时2012年
@ -92,6 +90,9 @@
4. 第一部分前言ch2校正 by @jiajiadebug 4. 第一部分前言ch2校正 by @jiajiadebug
5. 词汇表、后记关于野猪的部分 by @[Chowss](https://github.com/Vonng/ddia/commits?author=Chowss) 5. 词汇表、后记关于野猪的部分 by @[Chowss](https://github.com/Vonng/ddia/commits?author=Chowss)
https://github.com/Vonng/ddia/pulls)
感谢所有作出贡献,提出意见的朋友们:[Issues](https://github.com/Vonng/ddia/issues)[Pull Requests](https://github.com/Vonng/ddia/pulls)

10
ch1.md
View File

@ -10,17 +10,17 @@
[TOC] [TOC]
现今很多应用程序都是 **数据密集型data-intensive** 的,而非 **计算密集型compute-intensive** 的。因此CPU很少成为这类应用的瓶颈更大的问题通常来自数据量、数据复杂性、以及数据的变更速度。 现今很多应用程序都是 **数据密集型data-intensive** 的,而非 **计算密集型compute-intensive** 的。因此CPU很少成为这类应用的瓶颈更大的问题通常来自数据量、数据复杂性、以及数据的变更速度。
数据密集型应用通常由标准组件构建而成,标准组件提供了很多通用的功能;例如,许多应用程序都需要: 数据密集型应用通常由标准组件构建而成,标准组件提供了很多通用的功能;例如,许多应用程序都需要:
- 存储数据,以便自己或其他应用程序之后能再次找到 ***数据库database*** - 存储数据,以便自己或其他应用程序之后能再次找到 ***数据库database***
- 记住开销昂贵操作的结果,加快读取速度(***缓存cache*** - 记住开销昂贵操作的结果,加快读取速度(***缓存cache***
- 允许用户按关键字搜索数据,或以各种方式对数据进行过滤(***搜索索引search indexes*** - 允许用户按关键字搜索数据,或以各种方式对数据进行过滤(***搜索索引search indexes***
- 向其他进程发送消息,进行异步处理(***流处理stream processing*** - 向其他进程发送消息,进行异步处理(***流处理stream processing***
- 定期处理累积的大批量数据(***批处理batch processing*** - 定期处理累积的大批量数据(***批处理batch processing***
如果这些功能听上去平淡无奇,那是因为这些 **数据系统data system** 是非常成功的抽象:我们一直不假思索地使用它们并习以为常。绝大多数工程师不会幻想从零开始编写存储引擎,因为在开发应用时,数据库已经是足够完美的工具了。 如果这些功能听上去平淡无奇,那是因为这些 **数据系统data system** 是非常成功的抽象:我们一直不假思索地使用它们并习以为常。绝大多数工程师不会幻想从零开始编写存储引擎,因为在开发应用时,数据库已经是足够完美的工具了。
但现实没有这么简单。不同的应用有着不同的需求,因而数据库系统也是百花齐放,有着各式各样的特性。实现缓存有很多种手段,创建搜索索引也有好几种方法,诸如此类。因此在开发应用前,我们依然有必要先弄清楚最适合手头工作的工具和方法。而且当单个工具解决不了你的问题时,组合使用这些工具可能还是有些难度的。 但现实没有这么简单。不同的应用有着不同的需求,因而数据库系统也是百花齐放,有着各式各样的特性。实现缓存有很多种手段,创建搜索索引也有好几种方法,诸如此类。因此在开发应用前,我们依然有必要先弄清楚最适合手头工作的工具和方法。而且当单个工具解决不了你的问题时,组合使用这些工具可能还是有些难度的。
@ -96,7 +96,7 @@
当想到系统失效的原因时,**硬件故障hardware faults**总会第一个进入脑海。硬盘崩溃、内存出错、机房断电、有人拔错网线……任何与大型数据中心打过交道的人都会告诉你:一旦你拥有很多机器,这些事情**总**会发生! 当想到系统失效的原因时,**硬件故障hardware faults**总会第一个进入脑海。硬盘崩溃、内存出错、机房断电、有人拔错网线……任何与大型数据中心打过交道的人都会告诉你:一旦你拥有很多机器,这些事情**总**会发生!
据报道称,硬盘的**平均无故障时间MTTF, mean time to failure**约为10到50年【5】【6】。因此从数学期望上讲在拥有10000个磁盘的存储集群上平均每天会有1个磁盘出故障。 据报道称,硬盘的 **平均无故障时间MTTF mean time to failure** 约为10到50年【5】【6】。因此从数学期望上讲在拥有10000个磁盘的存储集群上平均每天会有1个磁盘出故障。
为了减少系统的故障率第一反应通常都是增加单个硬件的冗余度例如磁盘可以组建RAID服务器可能有双路电源和热插拔CPU数据中心可能有电池和柴油发电机作为后备电源某个组件挂掉时冗余组件可以立刻接管。这种方法虽然不能完全防止由硬件问题导致的系统失效但它简单易懂通常也足以让机器不间断运行很多年。 为了减少系统的故障率第一反应通常都是增加单个硬件的冗余度例如磁盘可以组建RAID服务器可能有双路电源和热插拔CPU数据中心可能有电池和柴油发电机作为后备电源某个组件挂掉时冗余组件可以立刻接管。这种方法虽然不能完全防止由硬件问题导致的系统失效但它简单易懂通常也足以让机器不间断运行很多年。
@ -217,7 +217,6 @@
> #### 延迟和响应时间 > #### 延迟和响应时间
> >
> **延迟latency****响应时间response time** 经常用作同义词,但实际上它们并不一样。响应时间是客户所看到的,除了实际处理请求的时间( **服务时间service time** )之外,还包括网络延迟和排队延迟。延迟是某个请求等待处理的**持续时长**,在此期间它处于 **休眠latent** 状态并等待服务【17】。 > **延迟latency****响应时间response time** 经常用作同义词,但实际上它们并不一样。响应时间是客户所看到的,除了实际处理请求的时间( **服务时间service time** )之外,还包括网络延迟和排队延迟。延迟是某个请求等待处理的**持续时长**,在此期间它处于 **休眠latent** 状态并等待服务【17】。
>
即使不断重复发送同样的请求,每次得到的响应时间也都会略有不同。现实世界的系统会处理各式各样的请求,响应时间可能会有很大差异。因此我们需要将响应时间视为一个可以测量的数值**分布distribution**,而不是单个数值。 即使不断重复发送同样的请求,每次得到的响应时间也都会略有不同。现实世界的系统会处理各式各样的请求,响应时间可能会有很大差异。因此我们需要将响应时间视为一个可以测量的数值**分布distribution**,而不是单个数值。
@ -456,7 +455,6 @@
------ ------
| 上一章 | 目录 | 下一章 | | 上一章 | 目录 | 下一章 |

3
ch2.md
View File

@ -63,7 +63,7 @@
[^i]: 一个从电子学借用的术语。每个电路的输入和输出都有一定的阻抗(交流电阻)。当你将一个电路的输出连接到另一个电路的输入时,如果两个电路的输出和输入阻抗匹配,则连接上的功率传输将被最大化。阻抗不匹配会导致信号反射及其他问题。 [^i]: 一个从电子学借用的术语。每个电路的输入和输出都有一定的阻抗(交流电阻)。当你将一个电路的输出连接到另一个电路的输入时,如果两个电路的输出和输入阻抗匹配,则连接上的功率传输将被最大化。阻抗不匹配会导致信号反射及其他问题。
像ActiveRecord和Hibernate这样的**对象关系映射object-relational mapping, ORM**框架可以减少这个转换层所需的样板代码的数量,但是它们不能完全隐藏这两个模型之间的差异。 像ActiveRecord和Hibernate这样的 **对象关系映射(ORM object-relational mapping** 框架可以减少这个转换层所需的样板代码的数量,但是它们不能完全隐藏这两个模型之间的差异。
![](img/fig2-1.png) ![](img/fig2-1.png)
@ -1037,7 +1037,6 @@ Cypher和SPARQL使用SELECT立即跳转但是Datalog一次只进行一小步
1. Fons Rademakers: “[ROOT for Big Data Analysis](http://indico.cern.ch/getFile.py/access?contribId=13&resId=0&materialId=slides&confId=246453),” at *Workshop on the Future of Big Data Management*, 1. Fons Rademakers: “[ROOT for Big Data Analysis](http://indico.cern.ch/getFile.py/access?contribId=13&resId=0&materialId=slides&confId=246453),” at *Workshop on the Future of Big Data Management*,
London, UK, June 2013. London, UK, June 2013.
------ ------
| 上一章 | 目录 | 下一章 | | 上一章 | 目录 | 下一章 |

27
ch3.md
View File

@ -374,9 +374,9 @@ SELECT * FROM restaurants WHERE latitude > 51.4946 AND latitude < 51.5079
但是,数据库也开始越来越多地用于数据分析,这些数据分析具有非常不同的访问模式。通常,分析查询需要扫描大量记录,每个记录只读取几列,并计算汇总统计信息(如计数,总和或平均值),而不是将原始数据返回给用户。例如,如果您的数据是一个销售交易表,那么分析查询可能是: 但是,数据库也开始越来越多地用于数据分析,这些数据分析具有非常不同的访问模式。通常,分析查询需要扫描大量记录,每个记录只读取几列,并计算汇总统计信息(如计数,总和或平均值),而不是将原始数据返回给用户。例如,如果您的数据是一个销售交易表,那么分析查询可能是:
* 一月份我们每个商店的总收入是多少? * 一月份每个商店的总收入是多少?
* 我们在最近的推广活动中销售多少香蕉? * 在最近的推广活动中卖了多少香蕉?
* 哪种品牌的婴儿食品最常与X品牌的尿布一起购买? * 哪个牌子的婴儿食品最常与X品牌的尿布同时购买?
这些查询通常由业务分析师编写,并提供给帮助公司管理层做出更好决策(商业智能)的报告。为了区分这种使用数据库的事务处理模式,它被称为**在线分析处理OLAP, OnLine Analytice Processing**。【47】。OLTP和OLAP之间的区别并不总是清晰的但是一些典型的特征在[表3-1]()中列出。 这些查询通常由业务分析师编写,并提供给帮助公司管理层做出更好决策(商业智能)的报告。为了区分这种使用数据库的事务处理模式,它被称为**在线分析处理OLAP, OnLine Analytice Processing**。【47】。OLTP和OLAP之间的区别并不总是清晰的但是一些典型的特征在[表3-1]()中列出。
@ -394,11 +394,11 @@ SELECT * FROM restaurants WHERE latitude > 51.4946 AND latitude < 51.5079
### 数据仓库 ### 数据仓库
一个企业可能有几十个不同的交易处理系统:系统为面向客户的网站提供动力,控制实体商店的**销售点checkout**系统,跟踪仓库中的库存,规划车辆路线,管理供应商,管理员工等。这些系统中的每一个都是复杂的,需要一个人员去维护,所以系统最终都是自动运行的。 一个企业可能有几十个不同的交易处理系统:面向终端客户的网站,控制实体商店的收银系统,跟踪仓库库存,规划车辆路线,供应链管理,员工管理等。这些系统中每一个都很复杂,需要专人维护,所以系统最终都是自动运行的。
这些OLTP系统通常具有高度的可用性并以低延迟处理事务因为这些系统往往对业务运作至关重要。因此数据库管理员密切关注他们的OLTP数据库他们通常不愿意让业务分析人员在OLTP数据库上运行临时分析查询因为这些查询通常很昂贵,扫描大部分数据集,这会损害同时执行的事务的性能。 这些OLTP系统往往对业务运作至关重要,因而通常会要求 **高可用****低延迟**。所以DBA会密切关注他们的OLTP数据库他们通常不愿意让业务分析人员在OLTP数据库上运行临时分析查询因为这些查询通常开销巨大,会扫描大部分数据集,这会损害同时执行的事务的性能。
相比之下,数据仓库是一个独立的数据库,分析人员可以查询他们心中的内容,而不影响OLTP操作【48】。数据仓库包含公司所有各种OLTP系统中的只读数据副本。从OLTP数据库中提取数据使用定期的数据转储或连续的更新流转换成适合分析的模式清理并加载到数据仓库中。将数据存入仓库的过程称为“**抽取-转换-加载ETL**”,如[图3-8](img/fig3-8)所示。 相比之下,数据仓库是一个独立的数据库,分析人员可以查询他们想要的内容而不影响OLTP操作【48】。数据仓库包含公司各种OLTP系统中所有的只读数据副本。从OLTP数据库中提取数据使用定期的数据转储或连续的更新流转换成适合分析的模式清理并加载到数据仓库中。将数据存入仓库的过程称为“**抽取-转换-加载ETL**”,如[图3-8](img/fig3-8)所示。
![](img/fig3-8.png) ![](img/fig3-8.png)
@ -406,7 +406,7 @@ SELECT * FROM restaurants WHERE latitude > 51.4946 AND latitude < 51.5079
几乎所有的大型企业都有数据仓库但在小型企业中几乎闻所未闻。这可能是因为大多数小公司没有这么多不同的OLTP系统大多数小公司只有少量的数据 —— 可以在传统的SQL数据库中查询甚至可以在电子表格中分析。在一家大公司里要做一些在一家小公司很简单的事情需要很多繁重的工作。 几乎所有的大型企业都有数据仓库但在小型企业中几乎闻所未闻。这可能是因为大多数小公司没有这么多不同的OLTP系统大多数小公司只有少量的数据 —— 可以在传统的SQL数据库中查询甚至可以在电子表格中分析。在一家大公司里要做一些在一家小公司很简单的事情需要很多繁重的工作。
使用单独的数据仓库而不是直接查询OLTP系统进行分析的一大优势是数据仓库可针对分析访问模式进行优化。事实证明本章前半部分讨论的索引算法对于OLTP来说工作得很好但对于回答分析查询并不是很好。在本章的其余部分中我们将看看为分析而优化的存储引擎。 使用单独的数据仓库而不是直接查询OLTP系统进行分析的一大优势是数据仓库可针对分析访问模式进行优化。事实证明本章前半部分讨论的索引算法对于OLTP来说工作得很好但对于回答分析查询并不是很好。在本章的其余部分中我们将研究为分析而优化的存储引擎。
#### OLTP数据库和数据仓库之间的分歧 #### OLTP数据库和数据仓库之间的分歧
@ -588,20 +588,20 @@ WHERE product_sk = 31 AND store_sk = 3
在本章中,我们试图深入了解数据库如何处理存储和检索。将数据存储在数据库中会发生什么,以及稍后再次查询数据时数据库会做什么? 在本章中,我们试图深入了解数据库如何处理存储和检索。将数据存储在数据库中会发生什么,以及稍后再次查询数据时数据库会做什么?
在高层次上,我们看到存储引擎分为两大类:优化**事务处理OLTP**和**优化分析OLAP**的类别。这些用例的访问模式之间有很大的区别: 在高层次上,我们看到存储引擎分为两大类:优化 **事务处理OLTP****在线分析OLAP** 。这些用例的访问模式之间有很大的区别:
* OLTP系统通常面向用户这意味着他们可能会看到大量的请求。为了处理负载,应用程序通常只触及每个查询中的少量记录。应用程序使用某种键来请求记录,存储引擎使用索引来查找所请求的键的数据。磁盘寻道时间往往是这里的瓶颈。 * OLTP系统通常面向用户这意味着系统可能会收到大量的请求。为了处理负载,应用程序通常只访问每个查询中的少部分记录。应用程序使用某种键来请求记录,存储引擎使用索引来查找所请求的键的数据。磁盘寻道时间往往是这里的瓶颈。
* 数据仓库和类似的分析系统不太知名因为它们主要由业务分析人员使用而不是由最终用户使用。它们处理比OLTP系统少得多的查询量但是每个查询通常要求很高,需要在短时间内扫描数百万条记录。磁盘带宽(不是查找时间)往往是瓶颈,列式存储是这种工作负载越来越流行的解决方案。 * 数据仓库和类似的分析系统会低调一些因为它们主要由业务分析人员使用而不是由最终用户使用。它们的查询量要比OLTP系统少得多但通常每个查询开销高昂,需要在短时间内扫描数百万条记录。磁盘带宽(不是查找时间)往往是瓶颈,列式存储是这种工作负载越来越流行的解决方案。
在OLTP方面我们看到了来自两大主流学派的存储引擎: 在OLTP方面我们能看到两派主流的存储引擎:
***日志结构学派*** ***日志结构学派***
只允许附加到文件和删除过时的文件,但不会更新已经写入的文件。 BitcaskSSTablesLSM树LevelDBCassandraHBaseLucene等都属于这个 只允许附加到文件和删除过时的文件,但不会更新已经写入的文件。 BitcaskSSTablesLSM树LevelDBCassandraHBaseLucene等都属于这个类别
***就地更新学派*** ***就地更新学派***
将磁盘视为一组可以覆盖的固定大小的页面。 B树是这种哲学的最大的例子被用在所有主要的关系数据库中还有许多非关系数据库。 将磁盘视为一组可以覆写的固定大小的页面。 B树是这种哲学的典范用在所有主要的关系数据库中和许多非关系型数据库。
日志结构的存储引擎是相对较新的发展。他们的主要想法是他们系统地将随机访问写入顺序写入磁盘由于硬盘驱动器和固态硬盘的性能特点可以实现更高的写入吞吐量。在完成OLTP方面我们通过一些更复杂的索引结构和为保留所有数据而优化的数据库做了一个简短的介绍。 日志结构的存储引擎是相对较新的发展。他们的主要想法是他们系统地将随机访问写入顺序写入磁盘由于硬盘驱动器和固态硬盘的性能特点可以实现更高的写入吞吐量。在完成OLTP方面我们通过一些更复杂的索引结构和为保留所有数据而优化的数据库做了一个简短的介绍。
@ -757,7 +757,6 @@ WHERE product_sk = 31 AND store_sk = 3
------ ------
| 上一章 | 目录 | 下一章 | | 上一章 | 目录 | 下一章 |

3
ch4.md
View File

@ -391,7 +391,7 @@ Web浏览器不是唯一的客户端类型。例如在移动设备或桌面
**当服务使用HTTP作为底层通信协议时可称之为Web服务**。这可能是一个小错误因为Web服务不仅在Web上使用而且在几个不同的环境中使用。例如 **当服务使用HTTP作为底层通信协议时可称之为Web服务**。这可能是一个小错误因为Web服务不仅在Web上使用而且在几个不同的环境中使用。例如
1. 运行在用户设备上的客户端应用程序例如移动设备上的本地应用程序或使用Ajax的JavaScript web应用程序通过HTTP向服务发出请求。这些请求通常通过公共互联网进行。 1. 运行在用户设备上的客户端应用程序例如移动设备上的本地应用程序或使用Ajax的JavaScript web应用程序通过HTTP向服务发出请求。这些请求通常通过公共互联网进行。
2. 一种服务向同一组织拥有的另一项服务提出请求,这些服务通常位于同一数据中心内,作为面向服务/微型架构的一部分。 (支持这种用例的软件有时被称为**中间件middleware**。 2. 一种服务向同一组织拥有的另一项服务提出请求,这些服务通常位于同一数据中心内,作为面向服务/微型架构的一部分。 (支持这种用例的软件有时被称为 **中间件middleware**
3. 一种服务通过互联网向不同组织所拥有的服务提出请求。这用于不同组织后端系统之间的数据交换。此类别包括由在线服务如信用卡处理系统提供的公共API或用于共享访问用户数据的OAuth。 3. 一种服务通过互联网向不同组织所拥有的服务提出请求。这用于不同组织后端系统之间的数据交换。此类别包括由在线服务如信用卡处理系统提供的公共API或用于共享访问用户数据的OAuth。
有两种流行的Web服务方法REST和SOAP。他们在哲学方面几乎是截然相反的往往是各自支持者之间的激烈辩论即使在每个阵营内也有很多争论。 例如,**HATEOAS超媒体作为应用程序状态的引擎**经常引发讨论【35】。 有两种流行的Web服务方法REST和SOAP。他们在哲学方面几乎是截然相反的往往是各自支持者之间的激烈辩论即使在每个阵营内也有很多争论。 例如,**HATEOAS超媒体作为应用程序状态的引擎**经常引发讨论【35】。
@ -633,7 +633,6 @@ Actor模型是单个进程中并发的编程模型。逻辑被封装在角色中
1. Fred Hebert: “[Postscript: Maps](http://learnyousomeerlang.com/maps),” *learnyousomeerlang.com*, April 9, 2014. 1. Fred Hebert: “[Postscript: Maps](http://learnyousomeerlang.com/maps),” *learnyousomeerlang.com*, April 9, 2014.
------ ------
| 上一章 | 目录 | 下一章 | | 上一章 | 目录 | 下一章 |

6
ch5.md
View File

@ -30,8 +30,8 @@
每一次向数据库的写入操作都需要传播到所有副本上,否则副本就会包含不一样的数据。最常见的解决方案被称为 **基于领导者的复制leader-based replication** (也称**主动/被动active/passive** 或 **主/从master/slave**复制),如[图5-1](#fig5-1.png)所示。它的工作原理如下: 每一次向数据库的写入操作都需要传播到所有副本上,否则副本就会包含不一样的数据。最常见的解决方案被称为 **基于领导者的复制leader-based replication** (也称**主动/被动active/passive** 或 **主/从master/slave**复制),如[图5-1](#fig5-1.png)所示。它的工作原理如下:
1. 副本之一被指定为**领导者leader**,也称为 **主库master** **首要primary**。当客户端要向数据库写入时,它必须将请求发送给**领导者**,领导者会将新数据写入其本地存储。 1. 副本之一被指定为 **领导者leader**,也称为 **主库master|primary** 。当客户端要向数据库写入时,它必须将请求发送给**领导者**,领导者会将新数据写入其本地存储。
2. 其他副本被称为**追随者followers**,亦称为**只读副本read replicas****从库slaves****次要 sencondaries****热备hot-standby**[^i]。每当领导者将新数据写入本地存储时,它也会将数据变更发送给所有的追随者,称之为**复制日志replication log**记录或**变更流change stream**。每个跟随者从领导者拉取日志,并相应更新其本地数据库副本,方法是按照领导者处理的相同顺序应用所有写入。 2. 其他副本被称为**追随者followers**,亦称为**只读副本read replicas****从库slaves****备库 sencondaries****热备hot-standby**[^i]。每当领导者将新数据写入本地存储时,它也会将数据变更发送给所有的追随者,称之为**复制日志replication log**记录或**变更流change stream**。每个跟随者从领导者拉取日志,并相应更新其本地数据库副本,方法是按照领导者处理的相同顺序应用所有写入。
3. 当客户想要从数据库中读取数据时,它可以向领导者或追随者查询。 但只有领导者才能接受写操作(从客户端的角度来看从库都是只读的)。 3. 当客户想要从数据库中读取数据时,它可以向领导者或追随者查询。 但只有领导者才能接受写操作(从客户端的角度来看从库都是只读的)。
[^i]: 不同的人对 **热hot****温warn** **冷cold** 备份服务器有不同的定义。 例如在PostgreSQL中**热备hot standby**指的是能接受客户端读请求的副本。而**温备warm standby**只是追随领导者,但不处理客户端的任何查询。 就本书而言,这些差异并不重要。 [^i]: 不同的人对 **热hot****温warn** **冷cold** 备份服务器有不同的定义。 例如在PostgreSQL中**热备hot standby**指的是能接受客户端读请求的副本。而**温备warm standby**只是追随领导者,但不处理客户端的任何查询。 就本书而言,这些差异并不重要。
@ -169,7 +169,7 @@
由于逻辑日志与存储引擎内部分离,因此可以更容易地保持向后兼容,从而使领导者和跟随者能够运行不同版本的数据库软件甚至不同的存储引擎。 由于逻辑日志与存储引擎内部分离,因此可以更容易地保持向后兼容,从而使领导者和跟随者能够运行不同版本的数据库软件甚至不同的存储引擎。
对于外部应用程序来说逻辑日志格式也更容易解析。如果要将数据库的内容发送到外部系统如数据这一点很有用例如复制到数据仓库进行离线分析或建立自定义索引和缓存【18】。 这种技术被称为**捕获数据变更change data capture**第11章将重新讲到它。 对于外部应用程序来说逻辑日志格式也更容易解析。如果要将数据库的内容发送到外部系统如数据这一点很有用例如复制到数据仓库进行离线分析或建立自定义索引和缓存【18】。 这种技术被称为 **数据变更捕获change data capture**第11章将重新讲到它。
#### 基于触发器的复制 #### 基于触发器的复制

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

View File

@ -85,7 +85,7 @@
## 参考文献 ## 参考文献
1. Ulrich Drepper: “[What Every Programmer Should Know About Memory](http://www.benstopford.com/2009/11/24/understanding-the-shared-nothing-architecture/),” akkadia.org, November 21, 2007. 1. Ulrich Drepper: “[What Every Programmer Should Know About Memory](https://people.freebsd.org/~lstewart/articles/cpumemory.pdf),” akkadia.org, November 21, 2007.
2. Ben Stopford: “[Shared Nothing vs. Shared Disk Architectures: An Independent View](http://www.benstopford.com/2009/11/24/understanding-the-shared-nothing-architecture/),” benstopford.com, November 24, 2009. 2. Ben Stopford: “[Shared Nothing vs. Shared Disk Architectures: An Independent View](http://www.benstopford.com/2009/11/24/understanding-the-shared-nothing-architecture/),” benstopford.com, November 24, 2009.

View File

@ -56,7 +56,7 @@
本书中描述的许多技术都被涵盖在 **大数据Big Data** 这个时髦词的范畴中。然而“大数据”这个术语被滥用,缺乏明确定义,以至于在严肃的工程讨论中没有用处。这本书使用歧义更小的术语,如“单节点”之于”分布式系统“,或”在线/交互式系统“之于”离线/批处理系统“。 本书中描述的许多技术都被涵盖在 **大数据Big Data** 这个时髦词的范畴中。然而“大数据”这个术语被滥用,缺乏明确定义,以至于在严肃的工程讨论中没有用处。这本书使用歧义更小的术语,如“单节点”之于”分布式系统“,或”在线/交互式系统“之于”离线/批处理系统“。
本书对自由和开源软件FOSS有一定偏好因为阅读修改和执行源码是了解一样东西详细工作原理的好方法。开放的平台也可以降低供应商垄断的风险。然而在适当的情况下,我们也会讨论专利软件(闭源软件,软件即服务 SaaS或一些在文献中描述过但未公开发行的公司内部软件 本书对 **自由和开源软件FOSS** 有一定偏好,因为阅读,修改和执行源码是了解某事物详细工作原理的好方法。开放的平台也可以降低供应商垄断的风险。然而在适当的情况下,我们也会讨论专利软件(闭源软件,软件即服务 SaaS或一些在文献中描述过但未公开发行的公司内部软件
## 本书纲要 ## 本书纲要