Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
ddia
提交
9672e6f3
D
ddia
项目概览
OpenDocCN
/
ddia
通知
6
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
ddia
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
9672e6f3
编写于
2月 08, 2018
作者:
V
Vonng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix format
上级
d05529b7
变更
9
展开全部
隐藏空白更改
内联
并排
Showing
9 changed file
with
290 addition
and
259 deletion
+290
-259
README.md
README.md
+0
-5
ddia/README.md
ddia/README.md
+46
-69
ddia/ch10.md
ddia/ch10.md
+3
-3
ddia/ch11.md
ddia/ch11.md
+1
-1
ddia/ch12.md
ddia/ch12.md
+1
-1
ddia/ch2.md
ddia/ch2.md
+10
-6
ddia/ch5.md
ddia/ch5.md
+176
-154
ddia/ch6.md
ddia/ch6.md
+2
-10
ddia/ch9.md
ddia/ch9.md
+51
-10
未找到文件。
README.md
浏览文件 @
9672e6f3
...
...
@@ -83,8 +83,3 @@ PostgreSQL是世界上最先进的开源关系型数据库!
*
[
Introduction to PostGIS
](
http://workshops.boundlessgeo.com/postgis-intro/index.html
)
## License
闷声发大财才是坠吼地。
\ No newline at end of file
ddia/README.md
浏览文件 @
9672e6f3
...
...
@@ -3,6 +3,9 @@
*
作者: Martin Kleppmann
*
原书名称:《Designing Data-Intensive Application》
*
译者:冯若航 (fengruohang@outlook.com , http://vonng.com/about)
*
建议本地使用
[
Typora
](
https://www.typora.io
)
以获取最佳阅读体验。
## 前言
...
...
@@ -19,79 +22,35 @@
## 目录
### [序言](preface.md) [机翻]
### 第一部分: [数据系统的基石](part-i.md)
1.
[
可靠性、可扩展性、可维护性
](
ch1.md
)
[
初翻30%
]
*
关于数据系统的思考
*
可靠性
*
可扩展性
*
可维护性
2.
[
数据模型与查询语言
](
ch2.md
)
[
初翻
]
*
关系模型与文档模型
*
数据查询语言
*
图数据模型
3.
[
存储与检索
](
ch3.md
)
[
初翻
]
*
支撑数据库的数据结构
*
分析还是事务处理?
*
列存储
4.
[
编码与演化
](
ch4.md
)
[
初翻
]
*
编码数据的格式
*
数据流的模型
### 第二部分: [分布式数据](part-ii.md)
5.
[
复制
](
ch5.md
)
[
机翻
]
*
主从
*
复制延迟带来的问题
*
多主复制
*
无主复制
6.
[
分片
](
ch6.md
)
[
机翻
]
*
分片与复制
*
键值对数据的分片
*
分片与次级索引
*
分片再平衡
*
请求路由
7.
[
事务
](
ch7.md
)
[
机翻
]
*
事务的棘手概念
*
ACID的含义
*
弱隔离级别
*
序列化能力
8.
[
分布式系统的麻烦
](
ch8.md
)
[
待翻
]
*
故障与部分失效
*
不可靠的网络
*
不可靠的时钟
*
知识、真相与谎言
9.
[
一致性与共识
](
ch9.md
)
[
待翻
]
*
一致性保证
*
线性一致性
*
顺序保证
*
分布式事务与共识
### 第三部分:[衍生数据](part-iii.md)
10.
[
批处理
](
ch10.md
)
[
未翻
]
*
使用Unix工具的批处理
*
MapReduce和分布式文件系统
*
后MapReduce时代
11.
[
流处理
](
ch11.md
)
[
未翻
]
*
传递事件流
*
流与数据库
*
流处理
12.
[
数据系统的未来
](
ch12.md
)
[
未翻
]
*
数据集成
*
拆分数据库
*
目标是正确性
*
做正确的事情
### [序言](preface.md)
### [数据系统的基石](part-i.md)
1.
[
可靠性、可扩展性、可维护性
](
ch1.md
)
2.
[
数据模型与查询语言
](
ch2.md
)
3.
[
存储与检索
](
ch3.md
)
4.
[
编码与演化
](
ch4.md
)
### [分布式数据](part-ii.md)
5.
[
复制
](
ch5.md
)
6.
[
分片
](
ch6.md
)
7.
[
事务
](
ch7.md
)
8.
[
分布式系统的麻烦
](
ch8.md
)
9.
[
一致性与共识
](
ch9.md
)
### [衍生数据](part-iii.md)
10.
[
批处理
](
ch10.md
)
11.
[
流处理
](
ch11.md
)
12.
[
数据系统的未来
](
ch12.md
)
## 翻译计划
机翻:
程序翻译,基本保留原书的组织结构,也是阅读原文,学习本书的过程
。
机翻:
股沟翻译,整理图片、引用、备注与基本的排版,不对照着原文基本没法看
。
初翻:人工修复格式错误和显著翻译错误,重新组织语言,保障基本的可读性。
...
...
@@ -99,7 +58,25 @@
翻译完全看心情,但通常每周至少会完成一章的初翻。
阅读建议使用Typora,可以获得最好的阅览体验。
| 章节 | 文件 | 计划 | 进度 |
| ------ | ------ | ---- | ---- |
| 序 |
[
preface.md
](
preface.md
)
| | 机翻 |
| 第一部分:数据系统基础 ——概览 |
[
part-i.md
](
part-i.md
)
| | 精翻 20% |
| 第一章:可靠性、可扩展性、可维护性 |
[
ch1.md
](
ch1.md
)
| | 初翻 |
| 第二章:数据模型与查询语言 |
[
ch2.md
](
ch2.md
)
| | 初翻 |
| 第三章:存储与检索 |
[
ch3.md
](
ch3.md
)
| | 初翻 |
| 第四章:编码与演化 |
[
ch4.md
](
ch4.md
)
| | 初翻 |
| 第二部分:分布式数据——概览 |
[
part-ii.md
](
part-ii.md
)
| | 初翻 |
| 第五章:复制 |
[
ch5.md
](
ch5.md
)
| | 初翻 60% |
| 第六章:分片 |
[
ch6.md
](
ch6.md
)
| | 机翻 |
| 第七章:事务 |
[
ch7.md
](
ch7.md
)
| | 机翻 |
| 第八章:分布式系统的麻烦 |
[
ch8.md
](
ch8.md
)
| | - |
| 第九章:一致性与共识 |
[
ch9.md
](
ch9.md
)
| | - |
| 第三部分:前言 |
[
part-iii.md
](
part-iii.md
)
| | 机翻 |
| 第十章:批处理 |
[
ch10.md
](
ch10.md
)
| | - |
| 第十一章:流处理 |
[
ch11.md
](
ch11.md
)
| | - |
| 第十二章:数据系统的未来 |
[
ch12.md
](
ch12.md
)
| | - |
...
...
ddia/ch10.md
浏览文件 @
9672e6f3
...
...
@@ -2,9 +2,9 @@
![](
img/ch10.png
)
带有太强个人色彩的系统无法成功。当第一版健壮的设计完成时,真正的考验才开始:许多不同观点的人会以他们自己的方式来测试
。
——高德纳
> 带有太强个人色彩的系统无法成功。当第一版健壮的设计完成时,不同的人们以自己的方式来测试,真正的考验才开始
。
>
>
——高德纳
---------------
...
...
ddia/ch11.md
浏览文件 @
9672e6f3
...
...
@@ -2,7 +2,7 @@
![](
img/ch11.png
)
> 有效的复杂系统总是从简单的系统演化而来。 反之亦然:从零
开始
设计的复杂系统没一个能有效工作的。
> 有效的复杂系统总是从简单的系统演化而来。 反之亦然:从零设计的复杂系统没一个能有效工作的。
>
> ——约翰·加尔,Systemantics(1975)
...
...
ddia/ch12.md
浏览文件 @
9672e6f3
...
...
@@ -2,7 +2,7 @@
![](
img/ch12.png
)
> 如果船长的
最高目标是保护他的船
,他应该永远待在港口。
> 如果船长的
终极目标是保护船只
,他应该永远待在港口。
>
> ——圣托马斯·阿奎那《神学大全》(1265-1274)
...
...
ddia/ch2.md
浏览文件 @
9672e6f3
...
...
@@ -48,7 +48,7 @@
### NoSQL的诞生
现在,在2010年代,NoSQL是推翻关系模式主导地位的最新尝试。 “NoSQL”这个名字是不幸的,因为它实际上并没有涉及到任何特定的技术,它最初只是作为一个吸引人的Twitter标签在2009年的开源,分布式,非关系数据库上聚会。无论如何,这个术语触动了一个神经,并迅速通过网络启动社区和更远的地方传播开来。一些有趣的数据库系统现在与#NoSQL
#
标签相关联,并被追溯性地重新解释为不仅是SQL [4]。
现在,在2010年代,NoSQL是推翻关系模式主导地位的最新尝试。 “NoSQL”这个名字是不幸的,因为它实际上并没有涉及到任何特定的技术,它最初只是作为一个吸引人的Twitter标签在2009年的开源,分布式,非关系数据库上聚会。无论如何,这个术语触动了一个神经,并迅速通过网络启动社区和更远的地方传播开来。一些有趣的数据库系统现在与#NoSQL
#
标签相关联,并被追溯性地重新解释为不仅是SQL [4]。
采用NoSQL数据库有几个驱动力,其中包括:
...
...
@@ -57,11 +57,13 @@
*
关系模型不能很好地支持一些特殊的查询操作
*
对关系模型限制性感到受挫,对更多动态性与表现力的渴望
不同的应用程序有不同的要求,一个用例的最佳技术选择可能不同于另一个用例的最佳选择。因此,在可预见的未来,关系数据库似乎可能会继续与各种非关系数据库一起使用 - 这种想法有时也被称为
混合持久化(Polyglot Persistences)
不同的应用程序有不同的要求,一个用例的最佳技术选择可能不同于另一个用例的最佳选择。因此,在可预见的未来,关系数据库似乎可能会继续与各种非关系数据库一起使用 - 这种想法有时也被称为
**混合持久化(Polyglot Persistences)**
### 对象关系不匹配
现在大多数应用程序开发都是在面向对象的编程语言中完成的,这导致了对SQL数据模型的普遍批评:如果数据存储在关系表中,那么应用程序代码中的对象之间需要一个笨拙的转换层,表,行和列的数据库模型。模型之间的不连贯有时被称为阻抗不匹配(impedance mismatch 从电子学借用一个术语。每个电路的输入和输出都有一定的阻抗(交流电阻)。当您将一个电路的输出连接到另一个电路的输入时,如果两个电路的输出和输入阻抗匹配,则连接上的功率传输将被最大化。阻抗不匹配可能导致信号反射和其他问题。)
现在大多数应用程序开发都是在面向对象的编程语言中完成的,这导致了对SQL数据模型的普遍批评:如果数据存储在关系表中,那么应用程序代码中的对象之间需要一个笨拙的转换层,表,行和列的数据库模型。模型之间的不连贯有时被称为
**阻抗不匹配(impedance mismatch)**
[^i]。
[
^i
]:
从电子学借用一个术语。每个电路的输入和输出都有一定的阻抗(交流电阻)。当您将一个电路的输出连接到另一个电路的输入时,如果两个电路的输出和输入阻抗匹配,则连接上的功率传输将被最大化。阻抗不匹配可能导致信号反射和其他问题
像ActiveRecord和Hibernate这样的对象关系映射(ORM)框架减少了这个翻译层需要的样板代码的数量,但是它们不能完全隐藏这两个模型之间的差异。
...
...
@@ -194,7 +196,9 @@ CODASYL中的查询是通过遍历记录列表和访问路径后,通过在数
#### 关系模型
相比之下,关系模型做的就是将所有的数据放在open中:一个关系(table)只是一个元组(行)的集合,就是这样。没有迷宫似的嵌套结构,如果你想看看数据,没有复杂的访问路径。您可以读取表中的任何或所有行,选择符合任意条件的行。您可以通过指定某些列作为关键字并匹配这些关键字来读取特定行。您可以在任何表中插入一个新的行,而不必担心与其他表的外键关系(外键约束允许对修改做限制,对于关系模型这并不是必选项。 即使有约束,在查询时执行外键连接,而在CODASYL中,连接在插入时高效完成。)
相比之下,关系模型做的就是将所有的数据放在open中:一个关系(table)只是一个元组(行)的集合,就是这样。没有迷宫似的嵌套结构,如果你想看看数据,没有复杂的访问路径。您可以读取表中的任何或所有行,选择符合任意条件的行。您可以通过指定某些列作为关键字并匹配这些关键字来读取特定行。您可以在任何表中插入一个新的行,而不必担心与其他表的外键关系[^iii]。
[
^iii
]:
外键约束允许对修改做限制,对于关系模型这并不是必选项。
即使有约束,在查询时执行外键连接,而在CODASYL中,连接在插入时高效完成。
在关系数据库中,查询优化器自动决定查询的哪些部分以哪个顺序执行,以及使用哪些索引。这些选择实际上是“访问路径”,但最大的区别在于它们是由查询优化器自动生成的,而不是由程序员生成,所以我们很少需要考虑它们。
...
...
@@ -524,7 +528,7 @@ db.observations.aggregate([
![](
img/fig2-5.png
)
##### 图2-5 图数据结构示例(框代表顶点,箭头代表边)
**图2-5 图数据结构示例(框代表顶点,箭头代表边)**
有几种不同但相关的方法来构建和查询图表中的数据。 在本节中,我们将讨论属性图模型(由Neo4j,Titan和InfiniteGraph实现)和三存储(triple-store)模型(由Datomic,AllegroGraph等实现)。 我们将看图的三种声明性查询语言:Cypher,SPARQL和Datalog。 除此之外,还有像Gremlin [36]这样的图形查询语言和像Pregel这样的图形处理框架(见第10章)。
...
...
@@ -866,7 +870,7 @@ Cypher和SPARQL使用SELECT立即跳转,但是Datalog一次只需要一小步
![](
img/fig2-6.png
)
图2-6. 使用示例2-11中的Datalog规则确定爱达荷州在北美。
**图2-6 使用示例2-11中的Datalog规则确定爱达荷州在北美。**
现在规则3可以找到出生在某个地方BornIn的人,并住在某个地方LivingIn。通过查询BornIn ='United States'和LivingIn ='Europe',并将此人作为变量Who,我们要求Datalog系统找出变量Who可以出现哪些值。因此,最后我们得到了与早先的Cypher和SPARQL查询相同的答案。
...
...
ddia/ch5.md
浏览文件 @
9672e6f3
此差异已折叠。
点击以展开。
ddia/ch6.md
浏览文件 @
9672e6f3
...
...
@@ -2,7 +2,7 @@
![](
img/ch6.png
)
>
显而易见,我们必须从电脑指令序列与限制约束中跳出来。 我们应当叙述定义、元数据、关系,而不是
过程。
>
我们必须跳出电脑指令序列的窠臼。 叙述定义、描述元数据、梳理关系,而不是编写
过程。
>
> —— Grace Murray Hopper,未来的计算机及其管理(1962)
>
...
...
@@ -15,15 +15,11 @@
[
^i
]:
正如本章所讨论的,分区是一种有意将大型数据库分解成小型数据库的方式。它与网络分区(net
splits)无关,这是节点之间网络中的一种故障类型。我们将在第8章讨论这些错误。
> ##### 术语澄清
>
> 我们在这里称之为
分区`partition`的东西,在MongoDB,Elasticsearch和Solr Cloud中被称为**分片(shard)**;在HBase中称之为**区域(Region)**,Bigtable中的 `tablet`,Cassandra和Riak中的`vnode`以及Couchbase中的`vBucket`。但是,分区(partition)是最为重要的术语,所以我们
坚持使用它。
> 我们在这里称之为
**分区(partition)**的东西,在MongoDB,Elasticsearch和Solr Cloud中被称为**分片(shard)**;在HBase中称之为**区域(Region)**,Bigtable中的 **表块(tablet)**,Cassandra和Riak中**虚节点(vnode)**以及Couchbase中的**虚桶(vBucket)**。但是**分区(partition)**是最重要的术语,所以这里
坚持使用它。
>
通常情况下,分区是这样定义的,即每条数据(每条记录,每行或每个文档)只属于一个分区。有很多方法可以实现这一点,本章将深入讨论。实际上,每个分区都是自己的小型数据库,尽管数据库可能支持同时触及多个分区的操作。
要分区数据的主要原因是可扩展性。不同的分区可以放在不共享的集群中的不同节点上(请参阅
[
第二部分
](
part-ii.md
)
关于无共享架构的定义)。因此,大数据集可以分布在多个磁盘上,并且查询负载可以分布在多个处理器上。
...
...
@@ -34,16 +30,12 @@
在本章中,我们将首先介绍分割大型数据集的不同方法,并观察数据索引如何与分区交互。然后,我们将讨论重新平衡,如果您想要添加或删除群集中的节点,则必须进行重新平衡。最后,我们将概述数据库如何将请求路由到正确的分区并执行查询。
## 分片与复制
![](
img/fig6-1.png
)
**图6-1 组合使用复制和分区:每个节点充当某些分区的领导者,其他分区充当追随者。**
## 键值数据的分片
假设你有大量的数据,你想分割它。你如何决定在哪些节点上存储哪些记录?
...
...
ddia/ch9.md
浏览文件 @
9672e6f3
...
...
@@ -7,16 +7,48 @@
---------------
[TOC]
## 一致性保证
## 线性一致性
### 什么使得系统线性一致?
### 依赖线性一致性
### 实现线性一致的系统
### 线性一致性的代价
## 顺序保证
### 顺序与因果
### 序列号顺序
### 全局序列广播
## 分布式事务与共识
### 原子提交与二阶段提交
### 实践中的分布式事务
### 容错的共识
### 成员与协调服务
## 本章小结
...
...
@@ -476,31 +508,40 @@
![](
img/fig9-1.png
)
##### 图9-1
图9-1
![](
img/fig9-2.png
)
##### 图9-2
图9-2
![](
img/fig9-3.png
)
##### 图9-3
图9-3
![](
img/fig9-4.png
)
##### 图9-4
图9-4
![](
img/fig9-5.png
)
##### 图9-5
图9-5
![](
img/fig9-6.png
)
##### 图9-6
图9-6
![](
img/fig9-7.png
)
##### 图9-7
图9-7
![](
img/fig9-8.png
)
##### 图9-8
图9-8
![](
img/fig9-9.png
)
##### 图9-9
图9-9
![](
img/fig9-10.png
)
##### 图9-10
图9-10
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录