RAID
术语
- 扇区:是磁盘中最小的存储单元,向磁盘读写数据时是以扇区为最小单元进行存储
- block:block,是由N个扇区组成一个块;
- 在磁盘相同偏移处横向逻辑分割,就形成了stripee;
- 一个stripee所占用的单块磁盘的区域,就是一个segement; 一个segement中的扇区或datablock 是连续的;一个segement中包含的data block或扇区的个数或者字节容量,叫做stripee depth;
- 一个stripee横跨过的扇区或块的个数或者字节容量,就是条带长度,即Stripee length。
如图上面,一个segement由4个data block,那么stripee depth就是4;
读写IO,针对的是扇区;
读IO,就是发送指令,从磁盘上读取某段序列号连续的扇区的内容; 指令会告知磁盘从哪个位置的扇区开始;然后给出从这个扇区开始往后的连续扇区个数;如指令 ”读取 初始扇区100 长度128 “
有个概念特别要清楚,我这里也是迷糊了很久: 每个IO,要读写的扇区,肯定是连续的; 如果要读取不连续的2个扇区段,那必须得分成2个IO;
随机IO,连续IO
因为每个IO,读写肯定是连续的扇区段; 要读写不连续的扇区段,那就需要多个IO; 这就引出了连续和随机IO的区别;
连续和随机IO,是指本次IO给出的初始扇区地址和上次IO的结束扇区地址,是不是完全连续的或相差不多的;
如果是一个连续的IO,磁头不需要换道,那么读写时间是很快的;
如果是个随机IO,如果扇区相差不大,不需要换道,其实速度还是可以的; 但大部分随机IO,因为扇区是不连续的,很大可能是需要磁头不停的换道,所以会导致效率降低;
顺序IO和并发IO
这是一个特别容易混淆的概念;
磁盘控制器如果可以同时对一个RAID系统中的多块磁盘,”同时“发送IO指令;
特别要注意:这里的”同时“是个宏观概念 ; 也就时如果所有磁盘都在一个总线或环路上,那么这里的”同时“就是指向一块磁盘发送一条指令后,不必等待它回应,接着向另一块磁盘发送IO指令; 这里的”同时“,其实也是有先后顺序,只是比排序的方式快很多,也就是宏观上看作时 ”同时“,所以这边并不称为”并发“;
个人理解,文件系统下发的IO,横跨条带的多个segement,那么控制器会把每块盘要写入或读取的数据都计算好,把这个IO拆分成多份,”同时“的对多个磁盘的发送IO指令,写入磁盘的segement; 这个”同时“就是上面提到的宏观的同时,不是并发;
如果直接发向磁盘的IO,只是包含了文件系统下发的一个IO数据,此时就为顺序IO;就是控制器缓存中的文件系统下发的IO队列,只能一个个来; 个人理解,这种情况就是 大IO的场景,横跨条带中的多个磁盘中segement, 占用多个磁盘”同时写入“,磁盘都在忙,所以其他IO无法写入,一次只能一个IO,做不到并发;
如果直接发向磁盘的这些IO,包含文件系统下发的多个IO,就是并发IO; 个人理解,这里应该就是小IO,不超过条带深度,那么一个IO就会在一个磁盘中进行,其他磁盘空闲,那么就可以同时处理其他IO;
RAID 对性能的影响和提升
IO读写的详细过程是怎样的?
1、程序先发出指令
如某个时候,主机控制器发出指令: 读取 初始扇区100 长度128
2、计算出对应的物理扇区号
RAID控制器做逻辑条带化的时候,制定了公式,如何根据上面的指令,计算出逻辑扇区对应的物理磁盘的扇区号;
所以RAID控制器接受受道这个指令之后,会立刻进行计算,根据这个公式,就能算出100号逻辑扇区,对应的物理磁盘的扇区号;然后还会依次算出 初始扇区后逻辑上连续的128个扇区,所在的物理磁盘的扇区号; 这些物理扇区号可能不在同一个磁盘上;
3、操作物理磁盘
得到物理磁盘的扇区号之后,会分别对这些扇区的磁盘再次发送指令;然后就真实的去读取对应数据了;
4、磁盘反馈数据
磁盘接受到指令,各自将数据提交给RAID控制器,经过控制器再Cache中的组合,再提交给主机控制器;
分析:
128个扇区,也就是 512B*128=64KB;
上面的过程中,如果128个扇区都在同一个segement,也就是说 条带深度 大于64KB,也就意味着,只需要在一块磁盘上读取就行; 这和单块磁盘性能一样,而且由于RAID控制器参与,甚至比单盘磁带的性能还差一些;
那如果减小条带深度,那么同样的128扇区的数据,就会存放到更多的磁盘的segement;(而且如果条带深度减小,在磁盘数量不变的情况下,条带长度中字节数总量也会变小,也就是条带长度会变小);
这里有个特别要注意的地方:
条带中有多个segement,每个磁盘提供一个segement组成条带;如果一个IO很大,需要跨条带中多个磁盘中的segement,控制器不是先放满第一个segement,再去放满第二个segement; 对segement写入数据,这个过程其实是同时进行的,因为控制器会把每块盘要写入或读取的数据都计算好;
个人理解,这种”同时“是一个宏观上的; 因为计算机总线是共享的,一个时刻只能对一个外设进行IO;那么如果磁盘不在相同的总线中,这种并行写入就更趋于”同时“,也就是说粒度更小; 所以这里不是理解成”并发“,只是宏观上的”同时“,比按顺序写入segement更有效率而已;
这里就出现了一个矛盾的地方:
RAID 要提升性能,那么条带深度就要越小越好; 能达到同时写入多块磁盘;
但是条带深度太小,就会导致并发几率降低; 为什么说是并发机率呢? 因为如果条带深度太小,1个IO很大概率会占用多个磁盘,而每个磁盘同一时刻只能处理一个读写任务,其他IO只能等待这个IO完成后才能继续使用物理磁盘;
这里就有一个均衡:
1、如果随机小IO多,那么就适当加大条带深度; 随机IO的时间主要在寻道上,而不是写入时的时间花费,所以把IO限制在一个磁盘,那么其他磁盘可以做到并行写入;
2、如果连续大IO多,就减少条带深度; 顺序大IO,主要时间在写入上,而且连续的IO,基本不用换道,所以要增大IO写入效率,尽量让多个磁盘同时处理;
RAID 0 性能对单块盘比较:
读写,并发IO,随机IO、连续IO: 小IO写入时,并发提升N倍 ; (注意的是, 个人理解 :如果大IO小于segement,其实也是提升N倍;如果遇到大IO是一次IO需要写入多个盘,相对之后提到的小IO,此处没有并发性,没有单独讨论的必要;)
读写,顺序IO,随机IO:不能并发,此时一个IO可以同时读取N个磁盘内容; 一次IO寻道时间相对单盘不变,虽然可同时写入多个磁盘,当相比寻道时间可忽略,所以提升很小;
读写,顺序IO,连续IO: 只经过一次寻道,寻道的影响很小,因为可以同时写入多块磁盘,所以提升N倍;
RAID 1 性能对单块盘比较:
读取,并发模式; 不管是随机IO还是连续IO,N个IO,每个IO占用一个磁盘,相当于提升了N倍;
读取,顺序IO,随机IO: 由于不能并发,此时一个IO可以同时读取N个磁盘内容,但是随机IO一次IO寻道时间相对单盘不变,虽然可以读取多个磁盘,当相比寻道时间可以忽略,所以提升很小;
读取,顺序IO,连续IO: 在这种模式下,寻道时间的影响降至最低,同时可以读取多块磁盘数据,所以提升N倍;
写入,并发IO,随机IO: 因为是镜像写入,每个磁盘都需要写入,所以没有所谓的并发; 相反,因为要同时写两份,性能取决于最差的磁盘,性能可能还降低;
写入,并发IO,连续IO:有一种情况,是控制器的优化算法,将多个小IO,合并成一个大IO;那就是提升了N倍
写入,顺序IO,随机IO或连续IO: 基本没有提升;因为此时寻道时间不变,传输时间不变,iops不变
RAID 5 性能对单块盘比较:
RAID 5,其实最适合小IO; 并发情况下,性能都比单盘有提升;
RAID 0
将两块以上的硬盘合并成一块,数据连续地分割在每块盘上。
1.通过把多个磁盘组织在一起作为一个逻辑卷提供磁盘跨越功能;
2.通过把数据分成多个数据块(Block)并行写入/读出多个磁盘以提高访问磁盘的速度;
条带化之后的多块硬盘,数据是被并行的写入所有磁盘,多管齐下,而不是横向写满一个条带,再写下一个条带;
从理论上讲,三块硬盘的并行操作使同一时间内磁盘读写速度提升了3倍。 但由于总线带宽等多种因素的影响,实际的提升速率肯定会低于理论值,但是,大量数据并行传输与串行传输比较,提速效果显著显然毋庸置疑。
优缺点:
读写性能是所有RAID级别中最高的。
RAID 0的缺点是不提供数据冗余,因此一旦用户数据损坏,损坏的数据将无法得到恢复。RAID0运行时只要其中任一块硬盘出现问题就会导致整个数据的故障。一般不建议企业用户单独使用。
那么就出现了一个疑问,数据是如何拆分成多个数据块的?
个人理解,数据最终写入磁盘之前,都会被CPU翻译为0和1的bit, 控制器接收到要写入的bit,可以存放在缓存;
每个RAID中,有设定分条深度,也就是每个segement中包含的扇区数量;那么控制器会根据分条深度来决定拆分成多大,根据分条长度,来决定一次拆分出多少份;这些就可以实现并行写入了;
RAID 1
raid 0 ,虽然容量和性能提升了,但是不安全,所以为了安全就出现了raid 1,镜像;
1个写IO,需要2个写,写惩罚是2;速度取决于最慢的磁盘,因为要同步;
但是读取时,增加了并发性; 可以同时从2块磁盘上读取;
优缺点:
RAID1通过硬盘数据镜像实现数据的冗余,保护数据安全,在两块盘上产生互为备份的数据,当原始数据繁忙时,可直接从镜像备份中读取数据,因此RAID1可以提供读取性能。
RAID1是硬盘中单位成本最高的,但提供了很高的数据安全性和可用性,当一个硬盘失效时,系统可以自动切换到镜像硬盘上读/写,并且不需要重组失效的数据。
RAID 5
RAID 5 ,是需要一块校验盘;这样在保证像RAID 1 一样有并发性的同时,也能保证安全性;
RAID 5 的1次写,需要4个读写操作,写惩罚是4 ; 读出老数据,读出老的校验数据,然后写入新数据和新校验数据;
但有一个特别要注意的地方,每个写IO下来时,都必须重新写入校验,也就是同一个分条内,同一时刻,只能是一个读写IO和校验在进行,不可能同时2个IO写入分条;这就有以下的情况:
1、如果是2块盘,做RAID 5,因为有校验盘,那其实就只有1块盘能正常写入数据;实现不了并发, 没有意义;
2、如果是3块盘,做RAID 5,也无法做到并发;
- 比如,1个IO下来,这没有并发的概念;
- 那么 2个IO(D1,D2)写入3块盘的RAID 5时,比如D1写入时,同时开始读取旧的校验,之后还要写入新的校验; 校验位是占用的,以为这D2此时是无法写入的; 那么也就是没有并发;
3、如果是4块盘,做RAID 5 ,可以做大的最大的并发是2个IO;
为什么是2个,不是3个呢?
- 还是之前提到的,1个IO写入时,这个分条的校验盘是占用的,此时这个分条无法写入第二个IO;
- 写入2个IO时,一个分条肯定还是1个IO读写; 但是第二个分条上,还是有2个盘时空闲,意味着第二个分条此时也可以写入一个IO; 这也解释了为什么校验盘是有规律的斜向存放的,而且这种并发是基于“恰好”的,所以raid5提供的是盲并发。
- 写入3个IO时,又回到了之前的情况,分条的4个磁盘全都占用,无法做到并发;
校验盘是有规律的斜向存放的?
1、是上面提到的,为了实现并发,校验盘放在一个磁盘上,一个IO写入时,校验盘一直被占用,无法实现并发;
2、如果校验盘放在一个磁盘上,每次其他磁盘写入IO,都必须更新校验盘,校验盘会特别繁忙,造成热点数据盘,也容易损坏;
为什么要增加并发,需要增加条带宽度而不是条带长度?
条带长度:一个stripee横跨过的扇区或块的个数或者字节容量,就是条带长度,即Stripee length。
条带深度:一个segment包含的date block 或者扇区的个数或者字节容量,叫做stripee depth。
如果条带宽度太小,或IO sieze比较大,那么所有磁盘同一时刻只能被一个IO占用,也做不到并发了,只能一个IO一个IO来处理,这就导致一个IO要很多磁盘参与,得不偿失;
所以分析也可以知道,要实现并发IO,就需要保证又空闲的磁盘未被IO占用,以便于其他的IO可以去空闲的磁盘进行访问,所以唯一的方法就是增加条带深度;为什么说是条带深度呢?
是因为,如果条带深度够大,也就是一个磁盘上的segemet够大,那么一个IO过来,如果小于这个条带深度,那这个IO就只会在这个segement上写入,这个IO就会被完全”禁锢“在一个磁盘上;此时就只会占用写入的磁盘和校验盘,2块磁盘; 那么其他的磁盘就会空闲出来;
这些是RAID 5 设计时,条带宽度比较大的原因; 所以RAID 5 在随机读方面性能比较好,因为可以并发;但在写时,因为写惩罚为3,所以随机和顺序写的性能都不太好;
RAID 6
两块校验盘,比RAID 5 更安全,但是写性能当然也更差了;
RAID一次写,需要6个操作,写惩罚是6; 读出老数据,读出老的校验数据1,读出老校验数据2;然后写入新数据和新校验数据1和新校验数据2; 和RAID 5 相比,区别是2次读取,2次写入;