Part 1: CHAPTER 1 Reliable, Scalable, and Maintainable Applications

?

  • how we think of reliaility, scalability, maintainability?
  • how to achieve reliaility, scalability, maintainability?

Thinking about data system

  • 数据系统的特点是什么?
    一方面,传统的数据系统都为了解决某个特定领域和场景的问题,而现在,这种界限在变得模糊,比如将 kudu 用作消息队列; 另一方面,为满足更多的需求,数据系统在变得复杂,需要组合多种组件来完成系统构建;

  • 需要着重考虑和解决什么问题?
    数据系统设计需要考虑人,技术等诸多因素,我们可以抽象出 3 个比较重要的关注点: Reliability, Scalability, Maintainability

Reliability(可靠/用性)

Reliability 指的是当有 fault 发生,系统仍可以正常执行的能力,这称为 fault-tolerant 或者 resilient。fault(异常,会导致failure) 不同于 failure(失败,不可用), fault 无法完全避免,所以需要构建容错机制,来 cure fault,prevent failure。Reliability 十分重要,对于 hardware faults, software errors and human errors 有不同的应对方法

hardware faults

它的特点如下,一般使用硬件冗余来解决问题,然而大规模的数据应用加剧了这个问题,需要引入软件容错

  • MTTF = 10~50 年,规模大了以后,硬件故障概率很高
  • 随机发生和机器之间独立发生(random and independent)

software errors

  • 特点:
    • 并非独立,难以预测
    • There is no quick solution to the problem of systematic faults in software
  • solve:
    • 加强系统测试
    • 进程隔离
    • 重视监控,measuring,gurantee 等

human errors

  • 特点: 人的行为会导致很多错误,但是对人的行为管控严格的系统又缺乏灵活性,这需要做出权衡
  • solve: 权限管控/灵活性(权衡), 快速恢复错误, 单元测试/集成测试, 监控指标, 良好的管理实践与充分的培训

Scalability

Scalability means having strategies for keeping performance good, even when load increases.

describing Load and performance(描述问题)

为了描述 scalability,我们需要描述系统的 load 和 performance,具体的 load 指标取决一个系统。描述 load 和 performance 之间的关系需要阐明 2 个问题:

  • 保持资源不变的情况下,提高 load, 对系统有何影响?
  • load 提高后,如果要保持 performance, 如何增加资源?

对于 performance 的描述,平均值并不准确,这无法反映用户的实际体验,应该使用分布比率(percentile)来进行衡量,如 P50

approaches for coping with load(解决问题)

how do we maintain good performance even when our load parameters increase by some amount?

将有状态服务扩展到多个节点上是困难的,但是趋势如此。load 增长,需要改变系统架构: scale-up(vertical使用大型机) or scale-out(horizontal加机器) 或者 2 者进行结合,架构的扩展性设计基于应用的 load parameters, 但是也有一些通用的原则和设计,之后会进行讨论

Maintainability

软件的最大成本在于后学维护,可维护性系统的 3 个设计原则:

  • Operability: 容易运维,这需要系统有良好的监控系统,完善的文档等来保证
  • Simplicity: 系统易于理解和使用,这需要系统设计具备良好的抽象性
  • Evolvability: 扩展性良好,基于前 2 点,可以使用 TDD 和 Refactoring 进行指导