前四章详细讲了增强数据密集型应用系统所需的一些基本原则,有一定经验的可以跳过,直接读第五章。不然真的浪费时间呀= =
简单记一些总结
第一章:数据系统基础
软件系统最重要的三大问题
可靠性
发生了某些错误,系统依然可以继续正常工作
故障包括:
- 硬件故障
- 软件错误
- 人为失误
可扩展性
负载增加,如何有效保持系统性能,就是可扩展性。
可扩展的系统,在增加处理能力的同时,还可以在高负载情况下,持续保持系统的高可靠性
可维护性
本质是为了让运维和运营团队更轻松。
- 良好的抽象来降低复杂性
- 系统要易于修改和适配新场景
- 良好的可操作性,有助于对系统状况的观测和有效的管理
第二章:数据模型与查询语言
该章比较多种不同的数据模型和查询语言,讨论各自的适用场景
关系模型与文档模型
数据查询语言
图状数据模型
第三章:数据存储与检索
该章对存储引擎,即数据库是如何安排磁盘结构,从而提高检索效率
存储引擎分为两大类:
针对事务处理(OLTP)优化的架构
- 面向用户,所以可能收到大量请求。为了处理负载,应用程序通常在每个查询中只涉及少量的记录
- 应用程序基于某种键来请求记录,而引擎使用索引来查找所请求键的数据
- 磁盘寻道时间往往是瓶颈
针对分析(OLAP)的优化架构
- 不是直接面对最终用户,数据仓库和类似的分析系统相对并不太广为人知,主要由业务分析师使用
- 处理的查询请求数目远低于OLTP系统,但每个查询通常要求苛刻,需要在短时间内扫描数百万条记录
- 磁盘带宽通常是瓶颈,而面向列的存储对于这种工作负载成为流行的解决方案
两个主流的存储引擎
- 日志结构流派
- 只允许追加更新文件和删除过时文件
- BitCask、SSTables、LSM-tree、LevelDB、Cassandra、HBase、Lucene
- 原地更新流派
- 将磁盘视为可以覆盖的一组固定大小的页
- B-tree是这一哲学的最典型代表,它用于所有主要的关系数据库,以及大量的非关系数据库。
日志结构的存储引擎是一个相对较新的方案,关键思想是系统的将磁盘上随机访问写入转为顺序写入,由于磁盘驱动器和SSD的性能特性,可以实现更高的写入吞吐量
第四章:数据编码与演化
数据编码
需向后、向前兼容,例如滚动升级
滚动升级
服务滚动升级时,每次将新版本的服务逐步部署到几个节点,而不是同时部署到所有节点
- 允许在不停机的情况下发布新版本的服务
- 降低部署风险:允许错误版本在影响大量用户之前检测并回滚
- 必须假设,不同节点运行不同版本的代码
- 所以数据需要向后兼容(新代码可以读取旧数据)、向前兼容 (旧代码可以读取新数据)
数据流模式
- 数据库,其中写入数据库的进程对数据进行编码,而读取数据库的进程对数据进 行解码。
- RPC和REST API,其中客户端对请求进行编码,服务器对请求进行解码并对响应进行编码,客户端最终对响应进行解码。
- 异步消息传递(使用消息代理或Actor),节点之间通过互相发送消息进行通信,消息由发送者编码并由接收者解码。