《数据密集型应用系统设计》阅读笔记

# 数据系统基础

那么什么算是 “数据密集型" (data-intensive)呢? 对于一个应用系统, 如果 “数据“ 是其成败决定性因素, 包括数据的规模 、 数据的复杂度或者数据产 生与变化的速率等, 我们就可以称为 “数据密集型应用系统”;与之对应的是计算密集型,CPU 主频往往是后者最大的制约瓶颈。

  • 可靠性 -> 容忍硬件、软件失效等错误、容忍用户出现不正确的软件使用方法(确保功能正确)
  • 可扩展性 -> 负载、性能、延迟(解决规模增长问题)
  • 可维护性 -> 可运维(平稳运行)、简单性(降低复杂性)、可演化性(可塑性,易改性)

互联网做得太出色了, 以至于很多人把它看作某种像太平洋 一样的自然资源, 而非人造的。 你还记得上一个达到如此规模而又这样健壮的技术是什么?

  1. TimeLine: 当用户查看 TimeLine 时,先查询所有关注的对象,列出这些人的动态,最后按时间倒序排序

  2. TimeLine: 对每个用户的时间线维护一个缓存,当用户发送动态时,查询他的 Follower,将动态插入到每个关注者的 TimeLine 缓存中

  3. 结合1和2,对于关注量大的账户采用方式1,对于关注量正常的采用方式2,用户在查看 TimeLine 时读取自己的 TimeLine 缓存(方案2)和查询受关注 量大的对象,列出这些人的动态,最后合并两个结果集

运行的延迟和响应时长

垂直扩展:升级到更强大的机器 水平扩展:将负载分布到多个更小的机器

简化系统设计并不意味着减少系统功能

语言的边界就是世界的边界

个人觉得也可以说:想象力的边界就是世界的边界。

字节表示方式:(电流、磁场、光脉冲)

# 数据处理系统一般包含

  • 数据库
  • 缓存
  • 索引
  • 异步消息
  • 批处理

应用开发者,同时也是数据系统设计师

在网络模型中,链接的访问路径,不是用外键记录,而更像是编程语言中的指针。访问路径像是遍历链表。

MySQL 在 alert table 时会把现在的整张表复制

图状数据模型

社交网络,顶点是人,边指示那些人彼此认识

广义的日志:一个仅能追加的记录序列集合

由于每次写数据时,需要更新索引,因此任何类型的索引通常都会降低写的速度。

特殊的删除记录(墓碑)

Datalog语言

数据库核心:数据结构

# 分布式数据系统

如果你把东西整理得井井有条,下次就不用查找了。

# 派生数据

# 向后兼容

较新的代码可以读取由旧代码编写的数据。

# 向前兼容

较旧的代码可以读取由新代码编写的数据。

成功的技术应首先处理现实问题,因为现实无法被愚弄。

一个可能出错的事物与 一个不可能出错的事物之间的主要区别是, 当 一个不可能出错的事物出错了, 通常也就意味着不可修复。

# 事务

从理论上来讲,隔离是假装没有发生并发

读倾斜(skew):不可重复读,发生于两个读操作 ReadA、ReadB 中间穿插了一个写操作 WriteC,读取到的 A,B 的值不对。A 的值是写之前的值,而 B 的值已经是写之后的值了

多版本技术实现快照级别隔离可以解决读倾斜的问题,即确保读到同版本的数据。

FOR UPDATE指令指示数据库对返回的所有结果行要加锁。

系统越大,其中局部组件失效的概率就越大

依赖同步的时间

一天可能不总是 86400秒

# 一致性与共识

错误的活着还是正确的挂掉

如果船长的最高目标是保住他的船,那么他只能永远待在港口