DDIA阅读笔记(一)-数据系统的基石
第一章:可靠性、可伸缩性、可维护性
应用的两个分类:
- data-intensive:问题通常来自数据量、数据复杂性、以及数据的变更速度。
- compute-intensive:瓶颈在于CPU。
可靠性
可以把可靠性粗略理解为 “即使出现问题,也能继续正确工作”。
造成错误的原因叫做 故障(fault),能预料并应对故障的系统特性可称为 容错(fault-tolerant) 或 韧性(resilient)。
fault种类:
- 硬件故障(hardware faults)
- 增加单个硬件的冗余度:磁盘可以组建RAID、服务器使用双路电源和热拔插CPU等。
- 云平台的设计就是优先考虑 灵活性(flexibility)和 弹性(elasticity),而不是单机可靠性。
- 引入软件容错机制。
- 系统性错误(systematic error)
- 软件错误
- 修复问题代码、进程隔离、监控分析
- 人为错误
- 以最小化犯错机会的方式设计系统:精心设计的API
- 与最容易犯错的模块解耦
- 彻底的测试:单元测试、系统测试
- 允许从人为错误中简单快速地恢复:快速回滚配置变更、分批发布新代码。
- 配置详细地监控,比如性能指标和错误率。
可伸缩性
可伸缩性(Scalability) 是用来描述系统应对负载增长能力的术语。
描述性能的指标:
- 吞吐量(throughput):每秒可以处理的记录数量。或者在特定规模数据集上运行作业的总时间。
- 响应时间(response
time):客户端发送请求到接收响应之间的时间。
- 响应时间的高百分位点(尾部延迟)指标非常重要
处理方法:
- 垂直伸缩:转向更强大的机器。
- 水平伸缩:负载分布到多台小机器。
弹性(elastic):在检测到负载增加时自动增加计算资源
可维护性
三个设计原则来避免自己的软件系统变为遗留系统:
- 可操作性
- 简单性
- 可演化性
可操作性
- 监控系统提供可见性
- 将系统与标准化工具集成
- 避免单机部署
- 提供良好的文档
- 提供良好的默认行为(配置参数?)
- 自我修复
- 行为可预测
简单性
消除额外复杂度的最好工具之一是抽象。
抽象帮助我们控制系统复杂度。
可演化性
系统的需求是变化的,使用敏捷工作模式来应对,例如TDD和重构。
第二章:数据模型与查询语言
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!