《数据密集型应用系统设计》笔记二之数据系统基础
《数据密集型应用系统设计》笔记二之数据系统基础
第 1 章 可靠、可扩展与可维护的应用系统
认识数据系统
很多应用系统都包含以下数据处理系统:
- 数据库:用以存储数据,这样之后应用可以再次面问。
- 高速缓存: 缓存那些复杂或操作代价昂贵的结果,以加快下一次访问。
- 索引: 用户可以按关键字搜索数据井支持各种过掳。
- 流式处理:持续发送消息至另一个进程,处理采用异步方式。
- 批处理: 定期处理大量的累积数据。
设计数据系统或数据服务时,需要考虑很多因素,其中最重要的三个问题:
- 可靠性(Reliability):当出现意外情况如硬件、软件故障、人为失误等,系统应可以继续正常运转:虽然性能可能有所降低,但确保功能正确。
- 可扩展性(Scalability):随着规模的增长,例如数据量、流量或复杂性,系统应以合理的方式来匹配这种增长。
- 可维护性(Maintainability):随着时间的推移,许多新的人员参与到系统开发和运维, 以维护现有功能或适配新场景等,系统都应高效运转。
可靠性
可靠性意味着:即时发生了某些错误,系统仍然可以继续正常工作。
系统可应对错误则称为容错(fault tolerant)或者弹性(resilient)。
常见的故障类型:
- 硬件故障:通常是随机的,如:硬盘崩溃、内存故障、电网停电、断网等。常见应对策略:使用集群去冗余。
- 软件故障:各种难以预料的 bug。
- 人为故障:如操作不当。
可扩展性
可扩展性是指负载增加时, 有效保持系统性能的相关技术策略。
吞吐量:每秒可处理的记录数
响应时间:中位数指标比平均响应时间更适合描述等待时间。
如何应对负载:垂直扩展(升级硬件)和水平扩展(集群、分布式)
可维护性
- 可运维性:方便运营团队来保持系统平稳运行。
- 简单性:简化系统复杂性,使新工程师能够轻松理解系统。
- 可演化性:后续工程师能够轻松地对系统进行改进,井根据需求变化将其适配到非典型场景,也称为可延伸性、易修改性或可塑性。
主要措施:
- 良好的抽象可以帮助降低复杂性, 井使系统更易于修改和适配新场景。
- 良好的可操作性意味着对系统健康状况有良好的可观测性和有效的管理方战。
第 2 章 数据模型与查询语言
复杂的应用程序可能会有更多的中间层,每层都通过提供一个简洁的数据模型来隐藏下层的复杂性。
如果数据大多是一对多关系(树结构数据)或者记录之间没有关系,那么文档模型是最合适的。
关系模型能够处理简单的多对多关系,但是随着数据之间的关联越来越复杂,将数据建模转化为图模型会更加自然。
第 3 章 数据存储与检索
从最基本的层面看,数据库只需做两件事情:存储和检索。
数据库核心:数据结构
为了高效地查找数据库中特定键的值, 需要新的数据结构: 索引。
存储系统的设计权衡:适当的索引可以加速读取查询,但每个索引都会减慢写速度。数据库通常不会对所有内容进行索引。
索引类型:
- 哈希索引
- B+ 树
- LSM 树
- 等等
扩展阅读:检索技术核心 20 讲
事务处理与分析处理
列式存储
如果表中有数以万亿行、PB 大小的数据,则适合用于存储在列式存储中。
第 4 章 数据编码与演化
本章节主要介绍各种序列化、反序列化方式。略