?
- 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 进行指导