前几天我的一个同事在对计划采购的存储进行测试,期间聊到了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值的升高更能提高写入效率,而不需要考虑概率的影响。

关于raid5的一系列问题的更多相关文章

  1. RAID5和RAID10,哪种RAID更适合你(上)

    [IT168 专稿]存储是目前IT产业发展的一大热点,而RAID技术是构造高性能.海量存储的基础技术,也是构建网络存储的基础技术.专家认为,磁盘阵列的性能优势得益于磁盘运行的并行性,提高设备运行并行度 ...

  2. 阅读:RAID5和RAID10,哪种RAID更适合你

    阅读:RAID5和RAID10,哪种RAID更适合你-------------------------------------------2013/10/06 存储是目前IT产业发展的一大热点,而RA ...

  3. 在CentOS 7上构建RAID5、LVM和SAMBAserver(5)——架设SAMBAserver

    在CentOS 7上构建RAID5.LVM和SAMBAserver(5)--架设SAMBAserver 6. 架设SAMBAserver 6.1. 预备 本节的任务是配置SAMBA服务,共享/home ...

  4. 转载:RAID5和RAID10,哪种RAID更适合你

    转自 http://storage.it168.com/h/2007-06-28/200706281204046_3.shtml 存储是目前IT产业发展的一大热点,而RAID技术是构造高性能.海量存储 ...

  5. 关于Raid0,Raid1,Raid5,Raid10的总结

    RAID0 定义: RAID 0又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能.RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就 ...

  6. Windows Server 2012 磁盘管理之 简单卷、跨区卷、带区卷、镜像卷和RAID-5卷

    今天给客户配置故障转移群集,在Windows Server 2012 R2的系统上,通过iSCSI连接上DELL的SAN存储后,在磁盘管理里面发现可以新建 简单卷.跨区卷.带区卷.镜像卷.RAID-5 ...

  7. 问题2: 安装cocoaPods出现的一系列问题

    在新电脑上安装cocoaPods的时候,出现了一系列的问题,现在记录下来,方便查看 1.出现 Invalid mark letter (press RETURN) 解决方案:输入 :wq 即可 2.  ...

  8. Ubuntu raid5+lvm实验

    首先说一下本次实验的环境:VMware12+Ubuntu (虚拟硬盘+mdadm) 本次实验参照http://allenyu.blog.51cto.com/193668/162067中的流程,下面总结 ...

  9. 万全R630服务器组装RAID5阵列

    随笔, 昨天领导让我给一台服务器做系统,本身作为开发的我有一些挑战.而且领导说的事,怎么着也得努努力试试不是? 下午去机房找到服务器本以为仅仅是装个系统完事,而且据我了解服务器本身有系统,以为拿着系统 ...

随机推荐

  1. NBUT 1223 Friends number 2010辽宁省赛

    Time limit  1000 ms Memory limit   131072 kB Paula and Tai are couple. There are many stories betwee ...

  2. 简单介绍Spring的ContextLoaderListener

    在开发Spring的Web项目中,通常我们都会在web.xml中配置一个Spring的核心监听器,就是把Spring的IOC容器纳入Servlet容器中,配置如下: <listener> ...

  3. POJ 2585:Window Pains(拓扑排序)

    Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2524   Accepted: 1284 Desc ...

  4. hdu2065 "红色病毒"问题 指数型母函数

    关于指数型母函数的题目,通过用公式并展开得到系数做的吧,取最后两位就是对100取模 #include<stdio.h> int QuickPow(int a,long long n,int ...

  5. c++hook全局触控事件

    https://gist.github.com/vbfox/1339671 namespace BlackFox { using System; using System.ComponentModel ...

  6. BZOJ1835,LG2605 [ZJOI2010]基站选址

    题意 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为\(D_i\) 需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为\(C_i\) 如果在距离第i个村 ...

  7. 转 sql 优化

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试, ...

  8. Nginx基础学习

    参考博客: http://www.2cto.com/os/201212/176520.html http://os.51cto.com/art/201111/304611.htm http://www ...

  9. svn分支开发注意事项

    1.切换的时候最好查看本文件的是主干上的还是分支上的, 单击右键,点击属性,可以看到以下图片,其中"URL"就可以 看到是主干还是分支 2.切换到分支 点击切换后就选择要切换到的路 ...

  10. Vue 的自定义事件系统:实现子组件跟父组件通信

    父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件 v-on 写在引用的子组件上, 语句 this.$emit('xxx') ,写在子组件里.