这篇文章是ddia第一部分数据系统基础中第一章和第二章的阅读笔记。
1. Reliable, Scalable, and Maintainable Applications
应用系统包含的模块:
- 数据库:用以存储数据,这样应用就可以再次访问;
- 高速缓存:缓存那些复杂或操作代价昂贵的结果,以加快下一次访问;
- 索引:用户可以按关键字搜索数据并支持各种过滤;
- 流式处理:持续发送消息至另一个进行,处理采用异步处理;
- 批处理:定期处理大量的累积数据。
单个组件无法满足所有数据处理与存储需求,所以需要将任务分解,每个组件负责高效完成其中一部分,然后通过应用层代码驱动有机衔接起来。
容错总是指特定类型的故障,这样的系统才更有实际意义。
故障与失效:
- 故障:组件偏离其正常规格;
- 失效:系统作为一个整体停止,无法向用户提供所需的服务。
扇出(fan-out):在事务处理系统中,用来描述为了服务一个输入请求而需要做的请求总数,像扇子一样逐渐变多。
实践中的百分位数:
- 近似算法来计算百分位数:
- 正向衰减
- t-digest
- HdrHistogram
- 采用直方图的方式来聚合响应时间。
把无状态服务分布然后扩展至多台机器相对比较容易,而有状态服务从单个节点扩展到分布式多机环境的复杂性会大大增加。
消除意外复杂性最好手段之一是抽象。
2. Data Models and Query Languages
这里介绍三种数据模型:关系模型、文档模型和图模型。
关系模型就是SQL,对应关系型数据库。关系模型的一个问题就是阻抗失衡(impedance mismatch),数据表结构发生变化,代码中的关系映射也需要变化,且不一定完全匹配。
文档模型就是NoSQL,比如MongoDB,使用json文档来存储数据,更适合存储一对多的树形层级数据。
关系模型为了存储一对多的数据,需要使用多个表,这样读取信息的时候需要多次查询;而文档模型具有更好的局部性,只需要一次查询就可以了。
MySQL 5.7 添加了json。
任何对人类有意义的东西都有可能在将来某个时刻发生变化,没有直接意义的就可以永远不需要变化。
数据库规范化的核心思想就是:消除重复。如果复制了多份重复数据,那么该模式通常就违背了规范化。
关系模型的一个核心要点是,只需要构建一次查询优化器,然后使用该数据库的所有应用程序都可以从中受益。
模式:读时模式(数据的结构是隐式的,只有在读取的时候才解释),写时模式(关系数据库的传统方法,模式是显式的,写入时必须遵守)。
数据查询语言:
命令式 | 声明式 |
---|---|
告诉计算机以特定的顺序执行 | 只需指定所需的数据模式 |
数据有固定的顺序 | 数据无固定的顺序 |
很难并行化 | 适用于并行执行 |
如果数据大多是一对多关系(树结构数据)或者记录之间没有关系,那么文档模型是最合适的。
图模型更为强大的用途在于,提供了单个数据存储区中保存完全不同类型对象的一致性方式。
图有利于演化:向应用程序添加功能时,图可以容易地扩展以适应数据结构的不断变化。
文档数据库和图数据库有一个共同点,就是它们通常不会对存储的数据强加某个模式,这可以使应用程序更容易适应不断变化的需求。