认识数据系统

我们需要认识到,当今许多新兴应用都属于数据密集型(data-intensive) 而不是计算密集型(compute-intensive)。对应这些类型的应用,CPU的处理能力往往不是第一限制性因素,关键在于数据量,数据的复杂度及数据的快速多变性。

一种数据系统架构:包含多个不同的组件
image.png

可靠性

当出现意外情况,如硬件,软件故障,人为失误等,系统应该可以继续正常运转:虽然性能可能降低,但确保功能正确。以下列出几种常见的类型及解决方案概要。

硬件故障

冗余硬盘,服务器配置双电源,热插拔CPU,数据中心添加备用电源,发电机

软件错误

认真检查依赖的假设条件与系统之间的交互,全面测试,进程隔离,允许进程崩溃并自动重启,反复评估,监控

人为失误

设计和构建软件都是由人来完成,也是有人来运维,即使有时意图是好的,但人却无法做到万无一失。 假定人是不可靠的,那么如何保证系统的可靠性呢?可以尝试结合以下多种方法:

  • 以最小出错的方式来设计系统。列入精心设计抽象层,API及其管理界面,使“做正确的事”变得轻松容易,但搞坏或异常操作变得复杂。
  • 想办法分离最容易出错的地方,容易引发故障的接口。特别是提供一个功能齐全但非生产用的沙箱环境,人们可以放心的尝试,体验,包括导入真实的数据,万一出现问题,不会影响真实的用户。
  • 充分的测试:从各单元测试到全系统集成测试以及手动测试,对于覆盖正常操作中很少出现的边界条件尤为重要。
  • 当出现人为失误时,提供快速的恢复机制以尽量减少故障影响。例如快速回滚配置改动,滚动发布新代码
  • 设置详细而清晰的监控系统,包括性能指标与错误率。
  • 推行管理流程并加以培训。

    可扩展性

    随着规模的增长,例如数据量,流量,复杂性。系统应以合理的方式来匹配这种增长。
    系统负载能力。描述负载(QPS,缓存命中率,活跃用户数量),描述性能(吞吐、TP、SLA)

可维护性

随着时间的推移,虚的新的人员参与到系统开发和运维,已维护现有功能或适配新场景新需求等,系统都应该高效运转。
关注软件系统的三个设计原则:

  • 可运维性:运维更轻松

  • 简单性:简化复杂度

  • 可演化性:可延伸性、易修改性、可塑性-易于改变