数据库系统实现
障,控制器会以一种办法来判断这个磁盘块的好坏,如果读的数据是坏的,控制器会尝试再次读取发起请求,直到读取的数据正确位置,或者发送N次请求,然后再停止。 同样,我们尝试写入一个扇区,可能写入的内容不是原本想要写入的内容,唯一的办法就是磁盘把写入的内容读取出来跟磁盘控制器的内容再比较一下。然而,跟磁盘控制器比较,其实还可以读取写入的扇区,并且查看状态是否为"好",如果状态是"坏"那么就重写,这个状态如何产生的呢?这就引出了是checksum概念。 校验和(checksum) 在说checksum之前,我们来玩个小游戏: 桌子上摆放了7个黑白棋子,魔术师蒙着眼睛看不见棋子。魔术师徒弟在看完7个棋子之后在右边添加个棋子,和其他棋子并排,这个时候有8个棋子,魔术师依旧蒙着眼睛。这个时候观众可将其中的一个棋子翻转,或者不翻转任何一枚。观众和徒弟一言不发,魔术师并不知道观众是否翻转棋子。 现在魔术师摘下眼罩,观察8枚棋子,然后可以说出是否翻转了棋子,识破观众的行为。那么魔术师是如何识破的呢? 校验和:在磁盘的每个扇区都有几个附加位,这个被称为校验和。在数据读取的时候,如果校验和跟数据位不符合,那么就判断读取错误。不过校验和正确,也有可能数据是错误的,这个的可能性跟校验位的长度成负相关。校验位越长,判断错误的概率越小。 校验和是基于扇区内所有位的奇偶性(parity),如果二进制的集合中有奇数个1,那么数据位有奇数奇偶性并增加值为1的奇偶位。同理,如果有偶数个1,那么数据位有偶数奇偶性并且增加值为0的奇数位。 假如我们用一个字节(8bits)来判断奇偶,并且检测出错误的可能性为50%,那么出错的概率为,1/2^8,如果用4个字节呢,则出错率为1/2^32。相对于40亿次中只有一次错误没被检测出来。
一般的在数据库中用的是CRC或者是FNV算来进行checksum的,在PostgreSQL中用得上 FNV-1a,我们来看看PG是如何实现的。 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |