下载本文的 PDF 版本 PDF

应对人为错误

错误时有发生。如何应对。

Aaron B. Brown,IBM 研究院

人为操作员错误是当今 IT 环境中最隐蔽的故障和数据丢失来源之一。在 2001 年初,微软的 Web 属性因配置名称解析系统时发生的人为错误而遭受了近 24 小时的中断。同年晚些时候,纳斯达克证券交易所的交易中断了一个小时,原因是技术人员在测试开发系统时犯了一个错误。最近,人为错误被归咎于即时消息网络中断、安全和隐私泄露以及银行系统故障。

尽管这些情景不像其他工程学科中的类似事件那样具有灾难性——例如切尔诺贝利核电站的熔毁或埃克森·瓦尔迪兹号油轮的搁浅——但它们的社会后果可能几乎同样严重,导致金融不稳定、通信中断和企业不稳定。因此,至关重要的是,当今 IT 基础设施的设计者、架构师、实施者和操作员应意识到人为错误问题,并构建容忍和应对不可避免会发生的错误的机制。本文讨论了将“应对技能”嵌入 IT 系统的一些可用选项。

人为错误的必然性

人为错误发生的原因有很多,但最终几乎总是归结为操作员对 IT 环境的心理模型与环境的实际状态之间的不匹配。有时,这种混淆源于设计不良的状态反馈机制,例如 Paul Maglio 和 Eser Kandogan 在本期其他地方讨论的令人困惑的错误消息(请参阅第 50 页的“错误消息:问题是什么?”),但有时这种不匹配仅仅是由于操作员缺乏经验,或者更糟糕的是,由于人类认知处理的怪癖,即使是有经验的操作员也可能顽固地走向错误的结论。1 然而,无论来源如何,心理学告诉我们,在快速变化的 IT 系统特征环境中,心理模型的不匹配以及由此产生的人为错误是不可避免的。

尤其令人不安的是,人们凭借其独特的(通常是无意的)创造力,甚至设法破坏了为可靠性和完整性而设计的系统。以 RAID(廉价 [或独立] 磁盘冗余阵列)系统为例。硬件供应商不得不竭尽全力在高档 RAID 产品中防止人为操作员在磁盘故障后移除错误的磁盘——通常内置硬件互锁装置,以防止移除工作磁盘。低端和软件实现的 RAID 系统没有这种奢侈,并且为此付出了代价。

在我们进行的一些简单实验中,为了调查这个问题的严重性,我们要求五个人执行一项基本的修复任务:在软件 RAID 系统中更换故障磁盘(参见侧边栏“人为错误案例研究”)。所有五位参与实验的人都接受了如何执行修复的培训,并获得了打印的逐步说明。每个人都进行了多次修复过程的试验。我们发现,即使在这个简单的维护任务中,在有完整说明且压力较低的环境中(没有警报,没有愤怒的客户或老板在背后催促),人为操作员也会犯下致命错误,导致数据丢失高达 10%。我们最终得出的结论是,即使是善意的可靠性技术(例如 RAID)在面对人类犯错的能力时也可能变得无能为力。

那么,难道就没希望了吗?作为 IT 系统的设计者、实施者和操作员,我们是否可以采取任何措施来防止人为错误对数据造成永久性损害或导致中断?

应对人为错误

事实上,有几种可能的方法可以应对人为错误,每种方法都有其自身的优点和缺点。我们可以将这些方法分为四个一般类别

• 错误预防

• 空间复制

• 时间复制

• 带重新执行的时间复制

第一类试图防止人为错误的发生,或至少降低其频率。其余三类处理已经发生的错误,通过提供不同形式的可逆性,或从系统状态中消除现有的人为错误影响的能力。最能抵抗人为错误的系统将实施多种这些技术,提供纵深防御,以应对任何挑战其完整性的错误。

错误预防

有两种方法可以防止人为错误影响系统:要么阻止人们犯错误(错误避免),要么阻止错误到达系统(错误拦截)。这两种技术都需要预测可能发生的错误类型;因此,这两种技术都不是非常有效——人们太擅长找到意想不到的方式犯错。

错误避免通常通过用户界面设计或培训来实现。在前一种情况下,用户界面的构建是为了阻止潜在的错误。例如,向导可以引导用户完成预定义的任务,或者可以通过自动化完全消除人为输入。然而,这些方法在实践中往往不是很成功,因为操作员最终会绕过向导或自动化辅助工具来完成用户界面设计者未预料到的任务。

除了在界面上阻止错误之外,另一种方法是培训人类用户不要犯错误。培训通过发展人类对计算机系统的心理模型来工作,从而防止心理模型不匹配,而心理模型不匹配是错误的主要来源。然而,它的有效性仅与其广泛程度有关:培训必须侧重于概念——而不仅仅是程序——以帮助构建最广泛的心理模型,并且必须随着系统的发展而发展,以确保这些心理模型保持最新。最好的培训计划是广泛的、频繁的,并且旨在迫使操作员走出舒适区;技术可以通过将培训期整合到系统的正常运行中来帮助实现这些目标。

当错误避免失败时,另一种方法是让人们犯错,但阻止这些错误到达系统。错误拦截的一个很好的例子可以在许多电子邮件客户端的配置中看到,这些客户端可以配置为批量和延迟发送外发邮件几分钟,从而提供一个恢复窗口,在此期间可以召回、丢弃或编辑错误或草率发送的消息。这种以及类似的基于缓冲的策略特别有效,因为它们利用了人类自我检测错误的能力:心理学家报告说,即使错误无法预测,在错误发生后也能立即检测到 70% 到 86% 的错误。2

不幸的是,错误拦截有其局限性。它仅在人为操作是异步的并且可以安全延迟以提供恢复窗口时才有效。它不适用于系统状态快速变化的情况,这会导致缓冲命令在执行时过时。错误拦截还会通过打破人们在交互场景中期望的即时反馈循环来造成混乱——想象一下,对于在命令行上工作以排除系统中断故障的操作员来说,两分钟的命令执行延迟会造成多大的混乱。

空间复制

当预防不可避免地失败时,必须采取其他技术来帮助应对由此产生的人为错误。空间复制就是这样一种技术,它可以帮助解决严重的、损害状态的错误,以及不破坏状态的更简单的操作错误,例如意外的组件关闭。空间复制背后的基本思想是创建系统或服务的多个副本,所有副本都维护系统关键数据的自身(同步)副本。RAID 是空间复制的一种简单形式,它可以容忍其副本之一(RAID 集中一个磁盘)的单个错误,方法是从其余磁盘重新初始化和重建错误的副本——请注意,通过将 RAID 系统的空间复制因子扩展到包含数据的额外副本,它甚至可以容忍在修复期间移除错误(单个)磁盘的常见但致命的人为错误。

更高级的方案,例如拜占庭容错,3 添加了复杂的投票算法来检测任何行为与大多数行为不符的副本。在这些方案下,如果人为错误影响了副本的一个或少数子集,则可以通过与剩余(大多数)副本集进行比较来检测其影响,并且可以丢弃受影响的副本并从大多数集重建。因此,例如,如果操作员意外关闭甚至损坏了其中一个副本节点,则其余副本可以继续提供服务,而故障节点重新启动并重新同步,从而有效地逆转了错误的影响。

空间复制的弱点是它仅在人为错误影响少数副本时才有效;任何影响大多数的错误都会被接受为系统表面上正确的状态,而少数副本(实际上是无错误的副本)则被视为错误而被忽略。因此,空间复制对于防御关键的全系统操作中的错误毫无用处,例如重新配置、应用程序部署或软件升级:这些操作必须一次对所有节点执行,绕过空间复制的保护。

时间复制

时间复制是空间复制的一种变体,它解决了一些这些限制。与空间复制一样,时间复制涉及维护系统或服务的多个副本,每个副本都具有系统状态的副本。不同之处在于,在时间复制中,副本不同步。相反,当前副本表示系统的实时状态,而一系列历史副本表示系统中不同状态的快照。只有当前副本被积极用于为对系统的请求提供服务,人为操作员干预仅限于该当前副本。图 1a 和 1b 说明了空间复制和时间复制之间的差异。

使用时间复制,当人为错误损坏或以其他方式影响当前副本时,可以从较旧的副本之一恢复系统。由于操作员仅触及当前副本——即使对于应用程序升级等全系统更改也是如此——较旧的副本不受错误影响,并且可以用于从甚至严重的错误(例如销毁当前副本中的所有数据)中恢复。当然,缺点是恢复到较旧的副本意味着自创建该副本以来创建或修改的任何数据都将不可挽回地丢失。这是时间复制的主要弱点。

次要弱点是时间复制仅能应对影响状态的人为错误。如果人为操作员因意外关闭生产服务器而导致中断,则时间复制几乎无能为力;但是,它可以与图 1c 中的空间复制相结合,以提供针对影响状态和操作错误的更广泛的保护。

 

尽管存在局限性,但时间复制在今天被广泛使用。例如,传统的离线系统备份是时间复制的一种形式:备份磁带包含过去某个时间点的系统状态快照,如果人为错误损坏了当前系统,则可以恢复该快照。文件系统快照,例如 Network Appliance filer 维护的快照,或 RAID-1 阵列中的拆分镜像过程,也是可用于人为错误恢复的时间复制形式。

时间复制也可以在应用程序级别使用。例如,企业应用程序提供商可以维护应用程序数据的两个或多个副本,每个副本在时间上比最后一个副本延迟几个小时。这种策略的实现可以采取以下形式:在延迟期间排队所有对数据的更改的副本,然后在稍后将这些更改应用于延迟的副本。对于构建在数据库之上的应用程序,这可以通过使用主副本的数据库日志来定期更新时间延迟的副本来实现。

对于精确数据一致性不太重要的应用程序,时间复制也可以大规模使用,整个数据中心通过类似的数据库日志传送机制充当彼此的时间延迟备份。最后,VM(虚拟机)技术提供了一个有希望的机会,可以比其他方法以更精细的粒度和更低的开销提供时间复制——本质上,可以定期拍摄 VM 快照并快速重新激活,以在人为错误后恢复系统。

带重新执行的时间复制

时间复制的常见实现都不能真正应对人为错误,因为在从错误中恢复时,它们会丢弃大量潜在重要的近期数据。第四种方法通过将时间复制与重新执行相结合来消除该限制。本质上,保留一个单独的历史日志,其中包含自上次进行时间复制以来对系统的所有更改。然后,当人为错误发生时,系统通过切换到旧副本并重新执行日志中的操作来使该副本保持最新状态,从而有效地逆转或撤消人为错误,如图 2 所示。此方法类似于数据库中执行恢复的方式,4 但增加了一个新的变化,即在重新执行过程中从历史记录中编辑掉人为错误。

当然,操纵系统执行的过去历史记录会产生重大后果。值得注意的是,编辑掉错误可能会导致悖论,其中重新执行结束时旧副本的状态与错误副本的用户已经看到的行为不一致。例如,在电子邮件服务器应用程序中,当错误传递的消息被其(非预期)接收者读取时,可能会发生悖论,然后当撤消导致其错误传递的人为错误时,该消息稍后会消失。在拍卖应用程序中,在撤消对竞标算法的错误更改后,最高出价者(或更糟糕的是,中标者)可能会意外更改,这可能会导致悖论。

如何处理悖论的选择本质上是特定于应用程序的。一些应用程序——尤其是那些没有持久的按用户状态的应用程序,例如搜索引擎——可能根本不在乎,并选择让悖论可见。其他应用程序可能会选择不重新执行导致悖论的操作,而是偏好一致性而不是丢失的工作;这些应用程序本质上是在纯粹的时间复制和按操作进行带重新执行的时间复制之间进行选择。但是大多数应用程序,尤其是那些具有人类最终用户的应用程序,可以选择折衷方案,其中所有操作都重新执行(以最大限度地减少丢失的工作),并且任何可见的悖论都以特定于应用程序的方式进行补偿。

值得注意的是,大多数旨在与人交互的应用程序已经具有手动用于处理不当行为和人为驱动过程中的错误的补偿机制;这些现有机制可以被利用来启用带重新执行的时间复制的恢复优势。例如,前面提到的拍卖悖论可以通过使用现有的投标撤回和拍卖结果异议策略来补偿。通常,补偿成本(例如,承担不正确拍卖的成本)与原始不正确行为的成本之间存在权衡。应用程序设计人员必须在确定带重新执行的时间复制方法之前评估悖论的预期概率以及补偿的相对成本和收益。

为了探索在真实应用程序上实施重新执行方法的好处和后果,我们为电子邮件服务器开发了一个原型人为错误撤消机制。5 我们的实现记录所有传入的 IMAP 和 SMTP 流量,记录电子邮件传递以及对用户邮箱所做的更改。当操作员发现人为错误并请求撤消该错误时,我们的实现会将系统状态回滚到历史快照,然后重放记录的邮箱更新流。在重新执行更新时,它会通过将任何外部可见的输出与历史输出记录进行比较来检查悖论。当差异很大时,会通过向受影响的用户传递额外的解释性消息来补偿这些差异。

我们用于电子邮件服务器的撤消实现使人为操作员可以快速逆转对电子邮件服务器的操作系统、应用程序软件和配置状态所做的错误更改——例如,失败的邮件服务器升级或垃圾邮件过滤器错误配置——而不会丢失用户数据,例如传入的电子邮件或邮箱更新。当我们在用户研究中评估原型机制时,我们发现它使人为错误恢复更容易,并且与传统的仅时间复制方案(例如备份)相比,导致的用户数据丢失显着减少。6

虽然带重新执行的时间复制似乎是我们迄今为止看到的最好的方法——它可以应对甚至全系统的人为错误而不会丢失数据——但它确实存在一些弱点。首先,与纯粹的时间复制一样,它对于不影响状态的人为错误(例如意外关闭服务器)无能为力。它也是我们所有恢复方法中最具挑战性的实现方法。它需要仔细的、特定于应用程序的关于悖论的推理,以及相应的补偿机制的实现。在创建和重新执行历史日志时,需要注意保持事件的因果顺序——在分布式上下文中尤其具有挑战性。最后,重新执行在时间方面可能很昂贵,尤其是在负载重的系统上,并且历史日志会消耗大量存储空间。因此,类似撤消的功能最适合与错误预防技术结合使用,在错误预防技术中,它们可以充当昂贵但功能强大且值得信赖的第二道防线。

应对人为错误的指南

人为错误是 IT 系统中的一股重要力量,具有通过故障、中断和数据损坏影响基于 IT 的业务的潜在能力。有几种不同的技术可以应对人为错误,从尝试通过避免和拦截来预防错误,到使用各种形式的复制来事后处理错误。表 1 总结了这些技术中的每一种技术的优点和缺点;可能最强大的是带重新执行的时间复制,但它的代价是实施复杂性和资源开销。

对于试图设计或实施容忍人为错误的计算机系统的架构师来说,在查看表 1 中的不同机制时,最好的建议是以多道防线的角度来思考:系统只有利用此处讨论的多种技术才能有效地应对范围广泛的可能人为错误。

第一道防线是避免:在可能的情况下使用自动化、错误感知界面设计和全面、持续的培训,以防止错误在第一时间发生。为了捕获不可避免会发生的错误,理想的系统添加了一个拦截层,缓冲那些可以容忍额外延迟的操作,以提供从错误中恢复的窗口,甚至在将它们的效果提交到真实硬件之前,在系统的虚拟副本上执行它们。

当这些预防技术失败时,理想的系统接下来会利用基于复制的方法,使用空间复制来处理操作错误,并最终依靠带重新执行的时间复制作为重量级但值得信赖的最后一道防线,以应对影响状态的错误。

不幸的是,当今 IT 的现实情况是,在我们的人为错误“应对技能”变得普遍之前,我们还有很长的路要走:此处讨论的大多数技术都以某种形式存在,但它们远非无处不在,并且从头开始正确实施它们往往很困难。然而,由于人为操作员错误不太可能很快消失,成为 IT 系统可靠性的决定性因素,因此至关重要的是,我们继续推进人为错误容忍方面的技术水平。这应该通过追求和加强此处介绍的方法,以及开发可以有效、高效且以低实施成本应对人为错误的创新方法来完成。

参考文献

1. Reason, J. 1990. 人为错误。剑桥:剑桥大学出版社。

2. 参见参考文献 1。

3. Castro, M. 和 B. Liskov。2002。实用的拜占庭容错和主动恢复。《 计算机系统事务》,20(4): 398–461。

4. Gray, J. 和 A. Reuter。1993。事务处理:概念和技术。旧金山:摩根·考夫曼出版社。

5. Brown, A. B. 和 D. A. Patterson。2003。操作员的撤消:构建可撤消的电子邮件存储。《2003 年 Usenix 年度技术会议论文集》。德克萨斯州圣安东尼奥(6 月)。

6. Brown, A.B. 2003。面向恢复的可靠服务方法:使用全系统撤消修复过去的错误。加州大学伯克利分校博士学位论文,计算机科学部技术报告 UCB//CSD-04-1304(12 月)。

 

人为错误案例研究

为了调查 IT 环境中人为错误的潜力,我们使用 RAID 存储进行了一个简单的实验。我们在三个不同的测试系统上设置了软件 RAID-5 卷,每个系统都具有不同的操作系统:Windows 2000、Red Hat Linux 6.0 和带有 Solstice DiskSuite 4.2 的 Solaris 7 (Intel)。然后,我们招募并培训了五名精通技术的用户来扮演系统管理员的角色。每个人都被随机分配到其中一个测试系统,并负责修复发生的任何磁盘错误。

实验由一系列试验组成。在每次试验中,我们模拟了 RAID 卷中一个磁盘上的简单停止故障,并观察参与者是否能够通过用备用磁盘更换故障磁盘来修复卷。一旦参与者完成修复(或放弃),试验结束,我们在将测试系统恢复到其初始运行状态后继续进行下一次试验。根据故障处理速度,每个人在每个测试系统上完成了六到九次试验。

实验的汇总结果如表 1 所示。

在 Linux 系统上,我们的用户在 31 次试验中的 3 次中犯了致命错误——致命错误率接近 10%!其他系统的致命错误率较低,但所有三个系统的总体错误率都很高——在 8% 到 23% 之间,包括致命错误和非致命错误。特别有趣的是,即使在使用它们的参与者在后来的试验中获得了经验和熟悉度,错误率在两个系统上仍然是非零的,如图 1 所示。

从我们的实验数据得出的明显结论是,人为错误是可靠性的关键障碍,错误不会随着培训或熟悉而消失,并且系统设计会影响错误率(如在三个测试系统之间的差异中所见)。

 

喜欢它,讨厌它?请告诉我们

[email protected] 或 www.acmqueue.com/forums

 

AARON B. BROWN 是 IBM T.J. Watson 研究中心自适应系统部门的研究人员。他的研究兴趣包括了解人类系统管理员在大型 IT 基础设施中的角色和影响、量化和降低 IT 管理复杂性以及基准测试 IT 系统的非传统方面。他还是 IBM 自主计算工作的架构师之一。在加入 IBM 之前,他与他的博士生导师(现任 主席)David A. Patterson 在加州大学伯克利分校共同创立了面向恢复的计算 (ROC) 项目。

© 2004 1542-7730/04/1100 $5.00

acmqueue

最初发表于 Queue 第 2 卷,第 8 期
数字图书馆 中评论本文





更多相关文章

Phil Vachon - 王国之钥
一次不幸的错误操作引发了当前的危机:客户不小心删除了签署新固件更新所需的私钥。他们有一些令人兴奋的新功能要发布,以及通常的一系列可靠性改进。他们的客户越来越不耐烦,但当被问及发布日期时,我的客户不得不拖延。他们如何才能提出一个有意义的日期?他们已经失去了签署新固件版本的能力。


Peter Alvaro, Severine Tymon - 从故障测试中抽象出天才
本文呼吁分布式系统研究社区改进容错测试的最新技术水平。普通用户需要工具来自动化选择定制的故障注入。我们推测,超级用户选择实验的过程可以在软件中有效地建模。本文描述了一个验证此推测的原型,介绍了来自实验室和现场的早期结果,并确定了可以使这一愿景成为现实的新研究方向。


Pat Helland, Simon Weaver, Ed Harris - 太大而不能倒
Web 规模的基础设施意味着大量服务器协同工作,通常是成千上万台服务器共同朝着同一个目标努力。如何管理这些环境的复杂性?如何引入共性和简单性?


Steve Chessin - 注入错误以获得乐趣和利润
一个不幸的事实是,任何带有运动部件的物体最终都会磨损和发生故障,电子电路也不例外。当然,在这种情况下,运动部件是电子。除了电迁移的磨损机制(运动的电子逐渐将金属原子推出位置,导致导线变细,从而增加其电阻并最终产生开路)和树枝状生长(相邻导线之间的电压差导致位移的金属原子相互迁移,就像磁铁会相互吸引一样,最终导致短路)之外,电子电路也容易受到背景辐射的影响。





© 保留所有权利。

© . All rights reserved.