系统的性能并不是唯一指标,尤其是现在,系统的移动性、功耗也成为了都成为了最重要,甚至在手机等移动设备上是超过性能的指标。对于一些极端的设备,性能可能是最次的考察指标,比如飞机上的黑匣子最重要的是稳定性,南极科考站的系统最重要的是低温情况下的运作情况。对于我们一般人而言,最重要的可能是系统的容错性和安全性。
系统的容错主要是两种方面,一个是数据的容错,这是指系统能够自动纠正可能含有错误的数据;一个是控制的容错,这是指系统在控制出现错误的时候,能够按照正常的方式运行而不会崩溃。要处理这些错误,势必是要付出代价的,或者是通过冗余的方式在发生错误的时候进行恢复,或者增加额外的控制方法来应对系统发生的错误。
数据通信中,是最常见发生错误的部分。但第一个简单的问题就是,如何知道数据传输发生错误了?
假设从设备A到设备B,发送的信息是XYZ的话:
设备A知道A发送的是什么
设备B知道B收到的是什么
但是设备A不知道B收到的是什么
设备B不知道A发送的是什么。
虽然像绕口令,但是大概明确了这个问题为什么是个需要解决的问题。一个简单的方法是:
设备A发送给B之后,
B返回给A他收到的内容,
A根据收到的内容来判断是否和发送的内容一致,
如果一致的话,告诉B这是一致的。
这固然是可以的方法,但是他将同样的内容发送了两次,并且进行了三次数据传递。如果原本一次数据传递发生错误的概率是a%,那么由于一次“被确认的数据传递”需要三次普通的数据传递,这个“被确认的数据传递”的只要其中一次传递发生错误,就会整体的错误,所以不仅数据传输的效率变低了,连数据传输的可靠性也变低了。
另外一种解决方法是,在数据传输的过程中,增加一些信息来校验前面的数据中是否发生了错误。比如最简单的奇偶校验,对于每一个字节的8个bit,计算这个字节中1的数量,奇数个1的话就在后面添上一位校验码1,偶数个1的话就在后面添上一位校验码0。这样做的效果是,传输的数据增加了12.5%,因为每8位数据要添加一位校验;有50%的概率发现错误,因为当偶数个数据位发生错误时,奇偶校验失效(这句话不正确,实际上是奇偶校验码和数据位错误数一致时)。通过设计更好的校验方法,能有更高的纠错能力。
知道是否有错误之后,我们有两个选择,一个是直接丢弃这部分数据,另一个是试图修复这部分数据。如果只考虑根据手中的数据来进行数据纠错,那么必须要使用更多的冗余信息来对数据进行纠错。比如海明码通过对数据的多重校验,来找到具体哪一位发生了错误,当然这会增加更多的数据冗余,并且只有有限的数据修复能力。
对于实时数据传输来说,也许重新请求传输数据是一种更好的方法。如果是数据存储系统,就有更多的选择。比如很多人使用的Ghost镜像,就是在系统发生错误的时候快速恢复系统的冗余,原理很简单,把所有东西都做备份。硬件上可以采用多块硬盘互相备份的方式,来进行数据的回复,比如RAID系统保障了系统内一块或几块硬盘毁坏,数据不会丢失,由于采用了封装的设计,计算机系统对RAID操作就和对于一块硬盘操作的方式一样。
如果从更大的维度上看,类似于Google这样的公司在全球各地设计了数据中心。这就将容错提升到了灾备的级别,即便有一个数据中心因为地震或者各种灾难毁坏了,其他数据中心也会继续工作,用户的数据不会丢失。当然这样的冗余成本也是巨大的。
除了硬件上的容错机制之外,软件上也会有对于操作的容错,比如通过数据库的日志来恢复数据库的数据。此外就是一些软件设计上的容错,比如支付宝在支付的时候需要经过若干步骤,就是为了在错误的下单后能够及早发现和纠正。这些容错的手段,或者是通过冗余的信息使得操作能够恢复到某个时间点,或者是通过冗余的流程来纠正错误的操作。
计算机系统设计容错性的原则实际上依然是依赖于分层与封装。容错机制都是为了让每一层和每一个模块确保自己所存储或者传递的信息是正确的,也基本都是发生在该层或者该模块。比如网络通信中,这些校验码都是在物理传输层面进行的,这样使用这一层的通信层就可以依赖完全正确的物理传输进行传递;这一层会进行相互对话来确保A到B,B到A的通信是畅通的,这样更高的应用层就可以依赖通信层互通的链接来传递更多的数据。
网友评论