光盘不是绝对可靠的,可能会发生故障和损坏。磁盘故障是灾难性的。如果存储介质损坏,如果没有备份是100%丢失数据,则比rm -rf更严重。那么磁盘故障是如此之大?
间歇性失败
媒体损坏
写作失败
磁盘故障
面对这些失败的策略和方法是什么?我们来看看这一章。
间歇性失败
当我们尝试读取磁盘块时,可能是该块的内容未正确发送到磁盘控制器。这是间歇性错误。控制器将以某种方式判断磁盘块的质量。读取数据不正确,控制器将尝试再次读取启动请求,直到数据被正确读取或者它将发送N个请求然后它将停止。
以类似的方式,我们尝试编写一个扇区,可写入的内容不是我们原本想写的内容,唯一的方法是读取光盘的内容并将其与磁盘控制器的内容进行比较。但是,与磁盘控制器相比,您可以读取写入的扇区并检查状态是否“良好”。如果状态是“坏”,重写,这个状态是如何产生的?这是校验和的概念。
检查总和
在我们说校验和之前,让我们玩一个小游戏:
桌子上放着七块白色和黑色的碎片,魔术师看不到蒙着眼睛的碎片。在看了7件之后,魔术师的学徒在右侧和其他部件上添加了一块。此时有8件,魔术师仍被蒙上眼睛。此时,观看者可以翻转其中一个或不翻转一个。观众和学徒没有说一句话,魔术师也不知道观众是否翻过了碎片。
现在,魔术师脱下绷带,观察八件,然后可以知道这件作品是否已经转动,观众的行为是否可见。那么,魔术师怎么看?
校验和:在磁盘的每个扇区中有几个附加位,称为校验和。读取数据时,如果校验和与数据位不匹配,则判断读取错误。但是,如果校验和正确,则数据可能不正确。这种可能性与控制数字的长度负相关。控制数字越长,判断错误的概率就越低。
校验和基于扇区中所有位的奇偶校验。如果该位组中存在奇数个1,则数据位具有奇校验并且将奇偶校验加1。类似地,如果偶数为1,则数据位具有均匀的奇偶校验并且添加具有零值的奇数位。
如果我们使用一个字节(8位)来确定奇偶校验并且检测到错误的概率是50%,则错误概率是1/2 ^ 8.如果使用4个字节,则错误率为1/2 ^ 32.未检测到40亿次中的一次。一般情况下,在数据库中,或FNV CRC用于校验。在PostgreSQL,FNV-1A使用。让我们来看看PG是如何实现的。
PostgreSQL的校验和
Postgres没有默认启用校验和。你可以用-k选项初始化数据库启动。
-k,--data-校验和校验数据采用页面
所使用的算法是FNV-1A。接下来的地址是该算法的详细说明::http://www.isthe.com/chongo/tech/comp/fnv/
核心代码是:的src /包含/存储/checksum_impl.h
:功能输入pg_checksum_block
官方介绍:
PG实施是从正式实施不同。官方的实现是:
在PG乘前,由17位和XOR向右移动。
计算结果存储在PageHeaderData-页的标头>
Pd_checksum
数据应该从刷子shared_buffer将被计算并阻挡从磁盘读出。如果你只更改数据页的内存,不需要计算校验和。
有兴趣在gdb可以去看看。
返回到之前的比赛,魔术师只有之前与学员达成一致,甚至有白色或黑色的,问题就解决了,这也是一种实现平价的。
媒体损坏
该盘还具有较长的使用寿命。当盘已损坏,这种损坏发生的物理和数据不能被完全恢复。在上文中,我们提出了如何有效地检测故障或失效是指读,写,但没有解释如何解决这个问题。
在磁盘损坏问题领域,可以有两个或更多磁盘来存储数据。例如,如果我们编写X内容,通常会将扇区配对。我们将用X写成的扇区称为(左侧副本)Xl和(右侧副本)Xr。 read函数可以读取Xl或Xr并返回结果w,然后w是X的实际内容。只有当我们执行完整性校验和Xl和扇区Xr时。 (其实,这是一种情况了一点,是写在磁盘的不同部门数据的2份,然后从一个读给你想要的内容)。
写策略是相同的,例如,写Xl,检查返回状态是否“好”,如果不是,则需要继续写入。经过几次,如果你仍然没有成功,你可以表明该部门是坏的。您可以用Xr替换损坏的Xl。相反,Xr和X1是相同的逻辑,并且可以重复X1的动作。阅读策略是交互式的,或者读取Xl和Xr,预设大量数据,如果你试图超过这个数据,你可以确定X是难以辨认的。
RAID
上述内容实际上是RAID(独立磁盘的冗余阵列)。盘下降率通常通过平均到期时间来测量。如果光盘的平均到期时间是10年,则光盘的1/10将每年失效。为避免此故障,在使用数据磁盘时使用此策略。或者,当冗余磁盘发生故障时,可以使用其他磁盘来恢复故障磁盘,以免丢失数据。 RAID分为多个级别,让我们看看不同级别的计算和使用。
RAID-1
RAID-1方案使用两个磁盘按扇区复制,一个用于数据磁盘,一个用于冗余或可互换磁盘。相当于有2个磁盘空间来存储数据(丢失的空间),任何故障都可以在没有损坏的情况下进行修复,除非2个磁盘同时出现故障。
举一个例子:假设磁盘寿命为10年,则意味着每年的损坏率为10%。如果磁盘是重复的,我们可以在失败时用另一个好磁盘替换它。因此,至少2个导致错误的数据磁盘丢失,可以说数据无法恢复。假设更换时间为3小时,即当天的1/8,或1年的1/2920,那么10年的故障率为1/29200,并且2个磁盘中的一个平均出现故障5岁然后,丢失数据的概率大约是5 * 29200=14600年。
RAID-4(奇偶校验块)
假设有N个数据磁盘和冗余磁盘,RAID是磁盘块的奇偶校验。在冗余磁盘中,第i个块由所有数据磁盘的第i个奇偶校验位组成,即所有第i个磁盘的j位,包括数据磁盘和磁盘冗余,它们之间必须有偶数1,我们总是选择冗余磁盘位,以便条件为真。
假设我们有4个磁盘,3个数据磁盘和一个冗余磁盘。假设一个块有一个字节,8位。
磁盘1: 11110000
磁盘2: 10101010
磁盘3: 00111000
冗余磁盘
磁盘4: 01100010
位置1,2,4,5和7中有两个1,位置3,4和4中有4个位置6和8。
使用冗余磁盘的位,以便数据磁盘的奇偶校验条件为真。
阅读:
阅读任何数据光盘没有区别。
写
当我们编写一个新的数据磁盘块时,我们不仅需要更改该数据块,而且还必须更改冗余磁盘的相应块以维护数据磁盘的奇偶校验。一种天真的方法是读取N个数据磁盘的相应块,取其抽头2并重写冗余磁盘,然后这将是N/1磁盘I/O.有一个更好的办法只专注于新版本和旧版本的i-块被写入,如下所示:
1.读取要更改的数据光盘的旧值。
2,读取冗余磁盘的相应块
3,写一个新的数据盘
4.重新计算和写入冗余磁盘块。
因此,只有4个I/O操作
触摸2代数解释
假设有三个数据磁盘跟随第一块如下:
磁盘1:1110000
光盘2:10101010
板块,3:00,111,000
冗余磁盘:01100010
假设磁盘块从以前的值2 10101010至11001100.变化寻求盘2和新价值的触摸。
01100110这个结果告诉我们,冗余磁盘的第一个块的位置,第2,第3,第6和7中的值应当改变。然后冗余磁盘为:0000100,如下:
磁盘1:1110000
板2:11001100
板块,3:00,111,000
冗余磁盘:0000100
因此每列仍然具有偶数1
故障恢复
如果冗余磁盘损坏,请直接更改新磁盘并重新计算奇偶校验。如果数据磁盘损坏,它也是一个新磁盘。根据其他光盘无法重新计算您的数据。我们来看一个例子:
磁盘1:1110000
磁盘2:????????
板块,3:00,111,000
板4:01100010
我们从每列获取模块2,我们可以将磁盘2导出为:
磁盘1: 11110000
XOR
磁盘2: 00111000
=: 11001000
XOR
01100010
=10101010
RAID-5
在RAID-4策略中,除非两个磁盘同时损坏,否则可以有效地保护数据。但是,存在一个缺点,即它需要访问冗余磁盘以进行读写。从前面的故障恢复示例中可以发现,恢复数据磁盘和冗余磁盘的策略是相同的,从另一个磁盘获取模块2。通过这种方式,我们不必将一个磁盘冗余,而将另一个磁盘作为数据磁盘。相反,我们可以将每个磁盘视为写入块的冗余磁盘。这种改进称为RAID-5。
假设我们有4张光盘,0-3。第一盘片号码为0时,它被用作冗余磁盘编号4,8,12,等等,因为当除以4,余数为0的盘1被编号为编号为1的冗余块,5 ,9等磁盘2是2个,6个,10个块的冗余,磁盘3是3,7,11等块的冗余。
如果每个磁盘的负载阅读和写作是一样的,如果所有块都被写入相同的可能性,那么对于一个剧本,每个盘具有1/4的概率,仍然有1/3的可能性该块的冗余。迪斯科。因此,写入中涉及的四个盘中的每一个都是1/4 + 3/4 * 1/3=1/2
多次处理磁盘故障(RAID-6)前一个是阻止磁盘。如果它阻止多个磁盘,它仍然无法处理。几个磁盘块具有纠正错误代码的原则,只要我们有足够的冗余磁盘,就可以让我们处理几个磁盘的封锁。这种策略带来了最高的RAID级别 - RAID-6。该策略基于用于纠错的汉明码。
让我们看一个例子:一个磁盘编号为1-7的7盘系统,前4个是数据盘,5-7是冗余盘。由数据磁盘和冗余磁盘组成的3 * 7矩阵,如下所示:
如图所示,请记住:
1.除了0列之外,所有可能的三个零和一列都在此矩阵中。
2,冗余磁盘有1个
3,数据盘至少有两个1
通过这个矩阵,你可以知道:
1.光盘5是光盘1,2,3和3的相应位置的触摸
磁盘6是磁盘1,2和4的相应位的模块2。
磁盘7是磁盘1,3和4的相应位的模块2。
通过此规则,我们可以从两个同时的磁盘锁中恢复。
阅读
我们从任何数据光盘读取数据,我们忽略冗余磁盘
写
如果你写,你需要考虑冗余磁盘。写一个块,需要计算抽头新老块2,并且这些比特被添加到模块2的总和,以满足条件的所有冗余磁盘的相应块。
看一个例子:
第二盘改变为00001111,新的值和模块2的旧值是:10100101,对于行1和行2中的光盘5和6具有1。
因此,我们必须取其第一个块和计算值10100101来执行触摸2,也就是说,我们必须拒绝2个块中的位置1,3,6和8。
磁盘5:
10100101
XOR
01100010
=
11000111
磁盘6:
10100101
XOR
00011011
=
10111110
然后结果如下:
故障恢复RAID-6
假设a和b失败的磁盘,可能能够在下一个矩阵中找到不同的列和行r b,假设a为0且b为1。
然后我们可以通过取所有行r的磁盘的相应位模块2来计算b,b除外。计算b后,我们必须重新计算所有其他磁盘。解决方案是用1触摸2取线的另一个磁盘。
如果磁盘2和磁盘5同时损坏,请参见示例,如下所示:
我们发现第2列中有两个不同的磁盘,磁盘2是5 0,然后是1,4,6磁盘来恢复磁盘2,如下所示:
磁盘2由:计算
磁盘1: 11110000
XOR
磁盘4: 01000001
=10110001
XOR
磁盘6: 10111110
=00001111
可以使用磁盘1,2,3恢复磁盘5,如下所示:磁盘1: 11110000
XOR
磁盘2: 00001111
=11111111
XOR
磁盘3: 00111000
=11000111
因此,磁盘2和磁盘5都已恢复,结果如下:
对于RAID 6中,盘的数目可以是任何功率-1,例如2 ^ k-1个,k是冗余磁盘,和2 ^ KK-1中剩余的数据光盘和所有磁盘冗余几乎是数据光盘。对数增长,可以构造成矩阵来表示。
本书只介绍了这种类型的RAID,但现在有更多的RAID,例如:
RAID-0:数据删除
磁盘复制RAID-1:
RAID-0 + 1: RAID-0和RAID-1的组合
带汉明检查的RAID-2:
具有并行奇偶校验传输的RAID-3:
RAID-4:具有独立的奇偶校验磁盘结构
RAID-5:分布式奇偶校验
RAID-6:具有2种分布式存储奇偶校验
RAID-7:优化了高速传输磁盘结构
RAID-10:高度可靠和高效的磁盘结构
高速数据传输磁盘RAID-53:的结构
摘要:主要对损伤和磁盘恢复,包括如何检测损坏以及如何恢复,则校验检测的良好手段和冗余磁盘提供当存储介质被破坏强的数据保护和分析已经实施了几种冗余策略。在接下来的章节中,我们看到了数据是如何在盘上有组织的,包括固定长度的数据和变量修改元组的存储(插入,删除和新的),交叉块和相关内容存储器的存储列,我们使用C语言本身编写一个示例程序。