mirror of
https://github.com/Vonng/ddia.git
synced 2024-12-06 15:20:12 +08:00
bold format
This commit is contained in:
parent
5a9f4a9315
commit
4408677a5f
11
README.md
11
README.md
@ -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
10
ch1.md
@ -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
3
ch2.md
@ -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
27
ch3.md
@ -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方面,我们能看到两派主流的存储引擎:
|
||||||
|
|
||||||
***日志结构学派***
|
***日志结构学派***
|
||||||
|
|
||||||
只允许附加到文件和删除过时的文件,但不会更新已经写入的文件。 Bitcask,SSTables,LSM树,LevelDB,Cassandra,HBase,Lucene等都属于这个组。
|
只允许附加到文件和删除过时的文件,但不会更新已经写入的文件。 Bitcask,SSTables,LSM树,LevelDB,Cassandra,HBase,Lucene等都属于这个类别。
|
||||||
|
|
||||||
***就地更新学派***
|
***就地更新学派***
|
||||||
|
|
||||||
将磁盘视为一组可以覆盖的固定大小的页面。 B树是这种哲学的最大的例子,被用在所有主要的关系数据库中,还有许多非关系数据库。
|
将磁盘视为一组可以覆写的固定大小的页面。 B树是这种哲学的典范,用在所有主要的关系数据库中和许多非关系型数据库。
|
||||||
|
|
||||||
日志结构的存储引擎是相对较新的发展。他们的主要想法是,他们系统地将随机访问写入顺序写入磁盘,由于硬盘驱动器和固态硬盘的性能特点,可以实现更高的写入吞吐量。在完成OLTP方面,我们通过一些更复杂的索引结构和为保留所有数据而优化的数据库做了一个简短的介绍。
|
日志结构的存储引擎是相对较新的发展。他们的主要想法是,他们系统地将随机访问写入顺序写入磁盘,由于硬盘驱动器和固态硬盘的性能特点,可以实现更高的写入吞吐量。在完成OLTP方面,我们通过一些更复杂的索引结构和为保留所有数据而优化的数据库做了一个简短的介绍。
|
||||||
|
|
||||||
@ -757,7 +757,6 @@ WHERE product_sk = 31 AND store_sk = 3
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
------
|
------
|
||||||
|
|
||||||
| 上一章 | 目录 | 下一章 |
|
| 上一章 | 目录 | 下一章 |
|
||||||
|
3
ch4.md
3
ch4.md
@ -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
6
ch5.md
@ -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 |
@ -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/),” akka‐dia.org, November 21, 2007.
|
1. Ulrich Drepper: “[What Every Programmer Should Know About Memory](https://people.freebsd.org/~lstewart/articles/cpumemory.pdf),” akka‐dia.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.
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
|
|
||||||
本书中描述的许多技术都被涵盖在 **大数据(Big Data)** 这个时髦词的范畴中。然而“大数据”这个术语被滥用,缺乏明确定义,以至于在严肃的工程讨论中没有用处。这本书使用歧义更小的术语,如“单节点”之于”分布式系统“,或”在线/交互式系统“之于”离线/批处理系统“。
|
本书中描述的许多技术都被涵盖在 **大数据(Big Data)** 这个时髦词的范畴中。然而“大数据”这个术语被滥用,缺乏明确定义,以至于在严肃的工程讨论中没有用处。这本书使用歧义更小的术语,如“单节点”之于”分布式系统“,或”在线/交互式系统“之于”离线/批处理系统“。
|
||||||
|
|
||||||
本书对自由和开源软件(FOSS)有一定偏好,因为阅读,修改和执行源码是了解一样东西详细工作原理的好方法。开放的平台也可以降低供应商垄断的风险。然而在适当的情况下,我们也会讨论专利软件(闭源软件,软件即服务 SaaS,或一些在文献中描述过但未公开发行的公司内部软件)。
|
本书对 **自由和开源软件(FOSS)** 有一定偏好,因为阅读,修改和执行源码是了解某事物详细工作原理的好方法。开放的平台也可以降低供应商垄断的风险。然而在适当的情况下,我们也会讨论专利软件(闭源软件,软件即服务 SaaS,或一些在文献中描述过但未公开发行的公司内部软件)。
|
||||||
|
|
||||||
## 本书纲要
|
## 本书纲要
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user