Michael_Tong
近期目标:按时吃药,努力做个正常人。

前几天我的一个同事在对计划采购的存储进行测试,期间聊到了raid5的话题,我和他的意见产生了分歧。他的说法是raid5不能挂太多盘是因为如果挂太多盘写惩罚会非常严重导致性能下降。而我的观点则是对于raid5来说,磁盘越多性能越好,不能挂太多盘是因为容错性下降的原因。

 

首先,先明确raid5的写惩罚是怎么一回事。我们都知道raid5的特点是N+1的冗余方式,N越大,冗余度越低,而且我们也都知道raid5会把校验信息打散在各个磁盘。这么做的目的当然不是为了好玩,而是为了避免出现校验盘争用的现象。

raid3采用的校验盘放在一起,当两个命令同时对磁盘进行操作的时候,就需要同时操作校验条带。如果这两个操作不属于同一个条带。那么这两个操作就不能同时进行,也就是出现了校验盘争用的现象导致了校验盘瓶颈。

 

现在问题来了,raid5是如何写入数据的,这个问题直接决定了写惩罚的原理。

raid5的写入情况分成3种:

1.要写入的数据布满整个条带。这种情况可以把要写入的数据的校验信息算好,直接把整个条带写入磁盘。

2.要写入的数据大于半个条带。这种情况可把这个条带上不需要修改的数据读出来,和要写入的数据一起计算校验,并写入磁盘。rcw:read-construct-write,这个是重构一个stripe_head

3.要写入的数据小于半个条带。这种情况需要把要修改的旧数据和原始的校验数据读出来,并连同新数据一起计算校验值。rmw:read-modified-write,这个是覆盖写的方式 

4.同样开支采用rcw方式

5.EC纠删码仅使用rcw方式进行,在"小写"的时候所有速度慢

计算公式是 新校验= 老数据 XOR 新数据 XOR 老校验

证明比较简单:

假设原来的校验c=i[0] xor i[1] xor i[2]....xor i[n]

我要把i[0]修改为i1[0],那么c1=i1[0] xor i[1]....xor i[n]

因为 1 xor 0=1  0 xor 0=0 因此 i xor 0=i 

得出 c1=i1[0] xor i[1]...xor i[n] xor 0

我们把0换成i[0] xor i[0],c1=i1[0] xor i[1]..xor i[n] xor (i[0] xor i[0])

因为xor 满足结合律,所以c1=x1[0] xor i[0] xor (i[0] xor i[1]...xor i[n])=x1[0] xor x[0] xor c

这个计算公式得到的结论是,在我写入一个segment的时候,不管这个raid有多少块盘组成,我只需要操作两个盘。一个是校验盘,一个是要写入的磁盘。对于这两块盘操作是并发的,可以同时进行。而写惩罚的意义,就在于我需要先把数据读出来,再写入。

正因为如此,在有n块盘的时候,想在不同条带下同时写入数据的并发成为可能。当然前提是每个随机数据并不要太大,占据大部分条带。对于典型的随机读写数据来说,4k是一个比较常见的大小,而raid5的条带深度往往大于4k。因此可以保证每个随机读写都占据了一个segment。在这种情况下可以想象,最大的并发数量是n/2,即每个数据的数据和校验同另外一个数据和校验的segment所处的磁盘都不同。而增加磁盘就相当于增大并发的峰值或者增大并发的概率。这个是单凭直觉就能想到的。因此不管原来有多少块盘,增加磁盘的数量对于随机写来说始终是有利的。

对于大块连续写入,因为都是整个条带写入,n值的升高更能提高写入效率,而不需要考虑概率的影响。

posted on 2018-02-23 16:34  Michael_Tong唐唐  阅读(4358)  评论(2编辑  收藏  举报