1
头图
宇宙之一粟读书笔记之《数据密集型应用系统设计》,本笔记的内容来自《数据密集型应用系统设计》,该书豆瓣评分高达 9.7。

什么是数据密集型应用

数据密集型应用,英文名 Data-Intensive Application。

数据密集型应用(data-intensive applications) 正在通过使用这些技术进步来推动可能性的边界。一个应用被称为 数据密集型 的,如果 数据是其主要挑战(数据量,数据复杂度或数据变化速度)—— 与之相对的是 计算密集型,即处理器速度是其瓶颈。数据密集型计算是一类并行计算应用程序,使用数据并行方法处理大量数据。

在大多数软件系统中很重要的三个问题是:

可靠性:即使面对意外情况如硬件、软件故障、人为失误等,系统也应正确工作,虽然系统的性能可能有所降低,但还是能执行正确的功能。

可扩展性:随着系统规模的增长(数据,流量量或复杂性),应有合理的方法来匹配该增长。

可维护性:随着时间的推移,许多新的人员参与到系统的开发与运维,人们应该能够依然有效维护该系统。

数据密集型应用特性

为了实现数据密集型计算的高性能,有必要最大程度地减少数据的移动。这可以通过 reduce 算法在数据居住的节点上执行算法来减少系统开销并提高性能。

数据密集型计算系统采用独立于机器的方法,其中运行时系统控制程序的调度、执行、负载平衡、通信和移动。

数据密集型计算非常关注数据的可靠性和可用性。传统的大规模系统可能容易受到硬件故障、通信错误和软件错误的影响,而数据密集型计算旨在克服这些挑战。

数据密集型计算是为可扩展性而设计的,因此它可以容纳任何数量的数据,因此可以满足时间关键要求。硬件和软件架构的可扩展性是数据密集型计算的最大优势之一。

Figure 79

可靠性

软件的典型的可靠性包括:

  • 应用程序执行用户所期望的功能
  • 可以容忍用户出现错误或不正确的软件使用方法
  • 性能能够应对典型场景、合理负载压力和数据量
  • 系统可防止任何未经授权的访问和滥用

故障通常被定义为组件偏离其正常规格, 而失效意味系统作为一个整体停止, 无法向用户提供所需的服务。 况且不太可能将故障概率降低到零, 因此通常设计容错机制来避免从故障引发系统失效。

硬件错误

硬件错误总是很容易想到:硬盘崩溃、内存故障、停电甚至是人为拔掉网线。

一般来说,处理硬件故障的标准方法是为硬件组件添加冗余,以便如果硬件发生故障,则随时可以更换。例如:

  • 对磁盘的 RAID 配置
  • 服务器配备双电源
  • 热插拔 CPU
  • 数据中心添加备用电源、发电机等

随着数据量和应用程序的计算需求的增加,人们偏向于使用软件故障容错技术来容忍硬件错误。这些软件容忍系统的一个优点是:对于单个服务器系统,如果需要重新启动机器(例如,应用操作系统安全补丁),则需要计划停机时间。但是,对于可以忍受机器故障的系统,可以一次修补一个节点然后重启(无需停机整个系统 - 滚动升级)。

这种方式使得系统更具有操作便利性。

软件错误

与硬件错误相比,软件错误之间更加具有关联性。这意味着,一个节点中的故障导致系统出现更多的故障。牵一发而动全身,例如:

  • 由于软件错误,导致当输入特定值时应用服务器总是崩溃
  • 一个应用进程使用了某个共享资源如 CPU、内存、磁盘或网络带宽,但却不幸失控跑飞了
  • 系统依赖于某些服务,但该服务突然变慢。甚至无响应或者开始返回异常的响应
  • 级联故障,其中某个组件的小故障触发另一个组件故障,进而引发更多的系统问题

解决方法(软件故障有时没有快速的解决方法,只能多考虑软件设计的细节):

  • 认真检查依赖的假设条件与系统之间交互
  • 进行全面的测试,测试覆盖率争取达到 100%
  • 进程隔离,允许进程崩溃并自动重启
  • 监控并分析生产环节的种种数据

人为错误

设计和构建软件系统总是由人完成的,但人类是不可靠的。尽管人类不可靠,我们如何使系统可靠?通过多种方法的组合,例如:

  • 巧妙的软件设计:通过精心设计的抽象,API 和管理界面来最大程度地限制错误机会的方式设计系统。
  • 开发、测试、生产环境分离:分离最容易出错的地方、容易引发故障的接口。提供一个功能齐全但非生产用的沙箱环境(测试系统),使人们可以放心的尝试 、 体验, 包括导入真实的数据, 万一出现问题, 不会影响真实用户。
  • 充分的测试:从单元测试到全系统集成测试、手动测试到自动测试。
  • 快速的恢复机制:当出现人为失误,可以快速回复,以最大程度减少故障的影响。例如:快速回滚配置改动,滚动发布新代码,提供校验数据的工作
  • 设置详细而清晰的监控子系统:包括性能指标和错误率

总结

可靠性不单单是针对核电站和空中交管软件之类的系统很重要,日常的很多应用也需要可靠的工作。商业软件的错误可能会导致效率下降,甚至带来法律风险,电子商务网站故障比如出现超卖,既影响网站营收,带来巨大损失。

总之,开发和软件设计人员应该秉持对用户负责的态度,设计一个可靠的应用非常关键。

但有时也会出现其它的情况,牺牲一些可靠性来降低开发成本或运营开销,对此,需要权衡。


宇宙之一粟
82 声望9 粉丝

混迹于江湖,江湖却没有我的影子