【DDIA笔记】一、可靠、可扩展与可维护的应用系统

242 阅读3分钟

1. 数据系统的核心目标

  • 可靠:当出现意外情况(如硬件、软件故障、人为失误等),系统应该可以继续正常运转
  • 可扩展:系统可以合理地应对规模增长(数据量、流量或负载性)
  • 可维护:新参与的人员可以快速参与维护现有功能或适配新的场景。

2. 错误(fault)与失效(failure)的区别

  • 错误或故障,通常表示组件偏离其正常规格

    • 容错(fault-tolerant)/弹性(resilient):容忍特定类型的故障。通常需要设计容错机制来避免从故障引发系统失效。
  • 失效,表示系统作为一个整体停止,无法向用户提供所需的服务。

3. 可以被消除的故障类型

  • 硬件故障的应对方法:

    • 硬件冗余
    • 软件容错
  • 软件故障的应对方法:

    • 全面测试
    • 进程隔离
    • 进程崩溃自动重启
    • 监控、告警
  • 人为失误的应对方法:

    • 以最小出错的方式设计系统
    • 分离出易出错的地方、容易引发故障的接口
    • 充分的测试
    • 提供快速恢复机制,尽量减少故障的影响
    • 设置详细而清晰的监控子系统,包括性能和错误率等。遥测(Telemetry)。
    • 推行管理流程并加以培训。

4. 可扩展性

可扩展性用来描述系统应对负载增加的能力

如何描述负载?

负载可以用称为负载参数的若干数字描述,而具体参数的选择取决于系统的体系结构,它可能是:

  • Web服务器的QPS
  • 数据库中写入的比例
  • 在线用户数量
  • 缓冲命中率

如何描述性能?

随着负载的增加,会发生什么。有两种考虑方式:

  • 负载增加,但系统资源保存不变,系统性能会发生什么变化?
  • 负载增加,如果要保持性能不变,需要增加多少资源?

一般使用如下指标来描述系统的性能:

  • 吞吐量:每秒可处理的请求数

  • 延迟:请求花费在处理上的时间

  • 响应时间:客户端发送请求,到收到响应的时间

    • 响应时间 = 服务时间 + 网络延迟 + 排队延迟

对于不同的系统,侧重点也有所不同。

通常使用百分位数(percntiles)来描述、定义服务质量目标(Service Level Objectives,SLO)和服务质量协议(Service Level Agreemetns,SLA):

  • 50% (p50)
  • 95%(p95)
  • 99%(p99)
  • 99.9%(p99.9)

应对负载增加的方法

❓ 负载增加时,如何保持良好的性能?
  • 垂直扩展:升级到更强大的机器

    • 高端机器昂贵,且扩展水平有限
  • 水平扩展:将负载分布到多个更小的机器

其他要考虑的问题:

  • 手动扩展还是自动扩展(弹性系统)?
  • 服务是有状态的还是无状态的?

5. 可维护性

在软件设计之初就应考虑,尽可能减少维护期间的麻烦。因此,需要关注软件系统的三个设计原则:

  • 可运维性:方便运营团队来保持系统平稳运行
  • 简单性:简化系统复杂性,使新工程师能够轻松理解系统。
  • 可演化性:后续工程师能够轻松地对系统进行改造、扩展等