前几天我的一个同事在对计划采购的存储进行测试,期间聊到了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. PyCharm Debug调试程序

    步骤一:在代码区要进行调试的代码行左侧单击鼠标左键,添加调试断点符号 步骤二:右键单击源文件或代码区内部,弹出菜单,选择[Debug ***] 或在右上角工具栏区单击[debug]按钮,快捷键[shi ...

  2. fork调用实验-缓冲区相关

    先看下面一段代码: #include <unistd.h> #include <stdio.h> ; char buf[] = "a write to stdout\ ...

  3. linux配置禁用启用IPv6

    IPv6被认为是IPv4的替代产品,它用来解决现有IPv4地址空间即将耗尽的问题.但目前,开启IPv6可能会导致一些问题.因此有时我们需要关闭IPv6.下面是IPv6的关闭方法应该适用于所有主流的Li ...

  4. OK335xS-Android pack-ubi-256M.sh hacking

    #/******************************************************************************* # * OK335xS-Androi ...

  5. Cannot find config.m4. Make sure that you run '/usr/local/php/bin/phpize' in the top level source directory of the module的 解决方法

    cp /php-7.1.22/ext/openssl/config0.m4 /usr/local/php/bin/config.m4

  6. .hex文件和.bin文件的区别

    博客转之于:  http://mini.eastday.com/a/160627003502858.html HEX文件和BIN文件是我们经常碰到的2种文件格式.下面简单介绍一下这2种文件格式的区别: ...

  7. Hadoop全分布模式操作

    http://blog.csdn.net/wangloveall/article/details/20767161 摘要:介绍Hadoop全分布模式操作,实现真正意义上的集群架构. 关键词:Hadoo ...

  8. Android USB gadget框架学习笔记

    一 Gadget框架结构 kernel/drivers/usb/gadget,这个目录是android下usbgadget的主要目录. Gadget功能组织单元:主要文件android.c,usb g ...

  9. sql server 表变量存储临时查询数据

    对于使用sql server 编写存储过程或者类似的sql 查询的时候我们使用表变量进行临时数据的存储,可以方便我们进行下来的数据处理 表变量的使用类似如下: declare @userinfo ta ...

  10. j2ee使用struts实现用户的登陆及注冊

    用户名: 密码: <%-- 使用struts标签 --%> <%-- --%>