本文的内容来自《数据密集型应用系统设计》,豆瓣评分高达 9.7
数据密集型应用,英文名 Data-Intensive Application。
数据密集型应用(data-intensive applications) 正在通过使用这些技术进步来推动可能性的边界。一个应用被称为 数据密集型 的,如果 数据是其主要挑战(数据量,数据复杂度或数据变化速度)—— 与之相对的是 计算密集型,即处理器速度是其瓶颈。
数据密集型计算是一类并行计算应用程序,使用数据并行方法处理大量数据。
在大多数软件系统中很重要的三个问题是:
可靠性:即使面对意外情况如硬件、软件故障、人为失误等,系统也应正确工作,虽然系统的性能可能有所降低,但还是能执行正确的功能。
可扩展性:随着系统规模的增长(数据,流量量或复杂性),应有合理的方法来匹配该增长。
可维护性:随着时间的推移,许多新的人员参与到系统的开发与运维,人们应该能够依然有效维护该系统。
为了实现数据密集型计算的高性能,有必要最大程度地减少数据的移动。这可以通过 reduce 算法在数据居住的节点上执行算法来减少系统开销并提高性能。
数据密集型计算系统采用独立于机器的方法,其中运行时系统控制程序的调度、执行、负载平衡、通信和移动。
数据密集型计算非常关注数据的可靠性和可用性。传统的大规模系统可能容易受到硬件故障、通信错误和软件错误的影响,而数据密集型计算旨在克服这些挑战。
数据密集型计算是为可扩展性而设计的,因此它可以容纳任何数量的数据,因此可以满足时间关键要求。硬件和软件架构的可扩展性是数据密集型计算的最大优势之一。
软件的典型的可靠性包括:
故障通常被定义为组件偏离其正常规格, 而失效意味系统作为一个整体停止, 无法向用户提供所需的服务。 况且不太可能将故障概率降低到零, 因此通常设计容错机制来避免从故障引发系统失效。
硬件错误总是很容易想到:硬盘崩溃、内存故障、停电甚至是人为拔掉网线。
一般来说,处理硬件故障的标准方法是为硬件组件添加冗余,以便如果硬件发生故障,则随时可以更换。例如:
随着数据量和应用程序的计算需求的增加,人们偏向于使用软件故障容错技术来容忍硬件错误。这些软件容忍系统的一个优点是:对于单个服务器系统,如果需要重新启动机器(例如,应用操作系统安全补丁),则需要计划停机时间。但是,对于可以忍受机器故障的系统,可以一次修补一个节点然后重启(无需停机整个系统 - 滚动升级)。
这种方式使得系统更具有操作便利性。
与硬件错误相比,软件错误之间更加具有关联性。这意味着,一个节点中的故障导致系统出现更多的故障。牵一发而动全身,例如:
解决方法(软件故障有时没有快速的解决方法,只能多考虑软件设计的细节):
设计和构建软件系统总是由人完成的,但人类是不可靠的。尽管人类不可靠,我们如何使系统可靠?通过多种方法的组合,例如:
可靠性不单单是针对核电站和空中交管软件之类的系统很重要,日常的很多应用也需要可靠的工作。
系统设计应该秉持对用户负责的态度,因此可靠性非常关键。