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和重构。

第二章:数据模型与查询语言