《数据密集型应用系统设计》读书笔记整理(1)-- 可靠、可扩展与可维护的应用系统


互联网做得太出色了,以至于很多人把它看作某种像太平洋一样的自然资源,而非人造的。你还记得上一个达到如此规模而又这样健壮的技术是什么?
——Alan Kay, Dr. Dobb杂志采访(2012)

概述

应用系统一般包含以下模块:数据库、高速缓存、索引、流式处理、批处理

数据系统的目标:

  • 可靠性(Reliability),当出现意外情况如硬件、软件故障、人为失误等,系统应可以继续正常运转:虽然性能可能有所降低,但确保功能正确。
  • 可扩展性(Scalability),随着规模的增长,例如数据量、流量或复杂性,系统应以合理的方式来匹配这种增长。
  • 可维护性(Maintainability),随着时间的推移,许多新的人员参与到系统开发和运维,以维护现有功能或适配新场景等,系统都应高效运转。

可靠性:

硬件故障:

  • 磁盘崩溃、内存故障、网络中断、停电等

应对方法:可通过磁盘配置RAID,备用电源、发电机等进行应对,或者通过软件容错的方式

软件错误:

  • 系统依赖于某些服务,但该服务突然变慢,甚至无响应或有异常的响应。
  • 级联故障,某个组件的小故障触发另一个组件故障,进而引发更多的系统问题。

应对方法:从细节方面考虑,检查依赖的假设条件,全面的测试,进程隔离,进程崩溃后自动重启,监控并分析系统的行为表现等。

人为失误:

  • 运维人员的配置失误等

应对方法:

  • 提供运维工具,将复杂的操作收敛,但限制不能过多,两者需要平衡。
  • 分离最容易出错的地方。例如提供一个和生产环境相同的沙盒环境供体验。
  • 充分的测试。
  • 当人为失误时,能提供快速的回滚机制。
  • 设置详细和清晰的监控子系统,包括性能指标和错误率,可检测是否存在假设不成立或违反约束条件等。
  • 推行管理流程并培训。

可扩展性

可扩展性用来描述系统应对负载增加的能力,即负载参数增加时,如何保持良好性能。

负载

负载可以用称为负载参数的若干数字来描述,参数的选择取决于系统的体系结构。例如Web服务器每秒请求数,数据写入比例,聊天室同时在线人数,缓存命中率等。

性能

当考虑到负载增加的时候,我们需要关注性能指标。

一般情况下在线系统更看重服务的响应时间。应该考察响应时间的百分位数,例如中位数p50,更大的百分位数p95、p99、p999等,分别表示有95%、99%、99.9%的请求响应时间快于阈值。采用较高的百分位数很重要,因为它直接影响用户的总体服务体验。

应对方法

扩展分为水平扩展和垂直扩展。

将无状态服务扩展至多台机器相对比较容易,而有状态服务从单个节点扩展到分布式多机环境复杂度会增加。

扩展能力好的架构通常会做出某些假设,然后有针对性地优化设计。

可维护性

软件系统的三个设计原则:

  • 可运维性,方便运营团队保持系统平稳运行
  • 简单性,简化系统复杂性,使新人可以轻松理解系统。通过良好的抽象降低复杂度。
  • 可演化性,后续工程师可以轻松地对系统进行改进,即易于改变

参考文献:
[1] (美)Martin Kleppmann. 数据密集型应用系统设计(赵军平,吕云松,耿煜,李三平 译)[M]. 北京:中国电力出版社,2018.

Published

Author

Levin

Category

Web Arch

Tags

web arch book report
Disqus loading now...