什么是数据密集型应用的可靠性
宇宙之一粟读书笔记之《数据密集型应用系统设计》,本笔记的内容来自《数据密集型应用系统设计》,该书豆瓣评分高达 9.7。
什么是数据密集型应用
数据密集型应用,英文名 Data-Intensive Application。
数据密集型应用(data-intensive applications) 正在通过使用这些技术进步来推动可能性的边界。一个应用被称为 数据密集型 的,如果 数据是其主要挑战(数据量,数据复杂度或数据变化速度)—— 与之相对的是 计算密集型,即处理器速度是其瓶颈。数据密集型计算是一类并行计算应用程序,使用数据并行方法处理大量数据。
在大多数软件系统中很重要的三个问题是:
可靠性:即使面对意外情况如硬件、软件故障、人为失误等,系统也应正确工作,虽然系统的性能可能有所降低,但还是能执行正确的功能。
可扩展性:随着系统规模的增长(数据,流量量或复杂性),应有合理的方法来匹配该增长。
可维护性:随着时间的推移,许多新的人员参与到系统的开发与运维,人们应该能够依然有效维护该系统。
数据密集型应用特性
为了实现数据密集型计算的高性能,有必要最大程度地减少数据的移动。这可以通过 reduce 算法在数据居住的节点上执行算法来减少系统开销并提高性能。
数据密集型计算系统采用独立于机器的方法,其中运行时系统控制程序的调度、执行、负载平衡、通信和移动。
数据密集型计算非常关注数据的可靠性和可用性。传统的大规模系统可能容易受到硬件故障、通信错误和软件错误的影响,而数据密集型计算旨在克服这些挑战。
数据密集型计算是为可扩展性而设计的,因此它可以容纳任何数量的数据,因此可以满足时间关键要求。硬件和软件架构的可扩展性是数据密集型计算的最大优势之一。
可靠性
软件的典型的可靠性包括:
-
应用程序执行用户所期望的功能
-
可以容忍用户出现错误或不正确的软件使用方法
-
性能能够应对典型场景、合理负载压力和数据量
-
系统可防止任何未经授权的访问和滥用
故障通常被定义为组件偏离其正常规格, 而失效意味系统作为一个整体停止, 无法向用户提供所需的服务。 况且不太可能将故障概率降低到零, 因此通常设计容错机制来避免从故障引发系统失效。
硬件错误
硬件错误总是很容易想到:硬盘崩溃、内存故障、停电甚至是人为拔掉网线。
一般来说,处理硬件故障的标准方法是为硬件组件添加冗余,以便如果硬件发生故障,则随时可以更换。例如:
-
对磁盘的 RAID 配置
-
服务器配备双电源
-
热插拔 CPU
-
数据中心添加备用电源、发电机等
随着数据量和应用程序的计算需求的增加,人们偏向于使用软件故障容错技术来容忍硬件错误。这些软件容忍系统的一个优点是:对于单个服务器系统,如果需要重新启动机器(例如,应用操作系统安全补丁),则需要计划停机时间。但是,对于可以忍受机器故障的系统,可以一次修补一个节点然后重启(无需停机整个系统 - 滚动升级)。
这种方式使得系统更具有操作便利性。
软件错误
与硬件错误相比,软件错误之间更加具有关联性。这意味着,一个节点中的故障导致系统出现更多的故障。牵一发而动全身,例如:
-
由于软件错误,导致当输入特定值时应用服务器总是崩溃
-
一个应用进程使用了某个共享资源如 CPU、内存、磁盘或网络带宽,但却不幸失控跑飞了
-
系统依赖于某些服务,但该服务突然变慢。甚至无响应或者开始返回异常的响应
-
级联故障,其中某个组件的小故障触发另一个组件故障,进而引发更多的系统问题
解决方法(软件故障有时没有快速的解决方法,只能多考虑软件设计的细节):
-
认真检查依赖的假设条件与系统之间交互
-
进行全面的测试,测试覆盖率争取达到 100%
-
进程隔离,允许进程崩溃并自动重启
-
监控并分析生产环节的种种数据
人为错误
设计和构建软件系统总是由人完成的,但人类是不可靠的。尽管人类不可靠,我们如何使系统可靠?通过多种方法的组合,例如:
-
巧妙的软件设计:通过精心设计的抽象,API 和管理界面来最大程度地限制错误机会的方式设计系统。
-
开发、测试、生产环境分离:分离最容易出错的地方、容易引发故障的接口。提供一个功能齐全但非生产用的沙箱环境(测试系统),使人们可以放心的尝试 、 体验, 包括导入真实的数据, 万一出现问题, 不会影响真实用户。
-
充分的测试:从单元测试到全系统集成测试、手动测试到自动测试。
-
快速的恢复机制:当出现人为失误,可以快速回复,以最大程度减少故障的影响。例如:快速回滚配置改动,滚动发布新代码,提供校验数据的工作
-
设置详细而清晰的监控子系统:包括性能指标和错误率
总结
可靠性不单单是针对核电站和空中交管软件之类的系统很重要,日常的很多应用也需要可靠的工作。商业软件的错误可能会导致效率下降,甚至带来法律风险,电子商务网站故障比如出现超卖,既影响网站营收,带来巨大损失。
总之,开发和软件设计人员应该秉持对用户负责的态度,设计一个可靠的应用非常关键。
但有时也会出现其它的情况,牺牲一些可靠性来降低开发成本或运营开销,对此,需要权衡。
- 点赞
- 收藏
- 关注作者
评论(0)