比如:
1.raid5,条带大小为128k,如果写入的文件很小如2K,那存放和占有的容量怎么确定,剩余条带怎么处理?
2.磁盘在格式化的时候有个单位分配大小,这个好像就是文件存放的最小单位,和raid里块的区别
raid向操作系统提供的是卷,是连续的扇区(或者叫LBA)空间地址,而卷向文件系统所展示的是分区,相对于卷,分区就是将大片连续的地址再次切开。文件系统用扇区组成所谓的‘簇’,或者叫cluster,或者叫分配单元,文件系统存放数据只以簇为单位,而不会出现‘读入或者写出半个簇’这些命令。而卷之下的各层够可以以单个扇区为单位了,扇区是存储系统最小的io单位。现在就可以开始了解io行为了。
这时要写入2k的‘文件’,首先要调用文件系统进行写入,如果文件系统的簇大小被设定为2k,则文件系统会在分区内分配2k的空间来存放文件实体数据,也就是4个扇区的连续地址(硬盘中一个簇最少有4个扇区),此外,还需要更新inode(unix)或者MFT表(win)等所谓的‘元数据/metadata’,也需要额外的空间,iNode(unix)或者MFT的对应某个文件的metadata本身可以存放一定数量的文件实体数据的,一般是64字节,小于这个数值,文件直接存放在iNode中,大于这个数据,iNode中会被加入二级和三级扩充映射指针指向文件实体数据被存放扇区地址,用于寻址操作。
假如文件系统选择了扇区1024-1027号这个4个连续的扇区作为这个2k文件的存放空间,则文件系统写入这个文件的时候,卷接受都这个指令之后,会将这段三区号码传递给raid驱动,raid驱动接受之后会将号码传送给raid芯片进行地址翻译(硬raid卡)或者直接在驱动层面进行地质翻译(软raid卡),地址翻译这里的意思是将这段连续的地址映射到实际的物理硬盘地址,因为raid提供给上层的是虚拟磁盘lun,一个lun可以分布在多个物理磁盘上。地址翻译的过程一定要查询stripe也就是条带映射表,当初你怎么分的,此时就会影响翻译之后实际的硬盘扇区地址,。再回来说你的raid5的128kb条带,
128KB条带=磁盘数量乘以每个磁盘上组成这个条带的segment大小,
也就是说一个条带吧排列的多个磁盘横向切成了一条一条的,硬盘本身相当于竖条,而横条和竖条切开形成小格子就是segment,也叫条带深度,stripedepth。
比如8个盘的raid5系统,其中一块用于存放parity,128kb除以8邓毅16kb,也就是说segment=条带深度=16KB=每个磁盘上贡献一个条带所使用的空间。
再说2k文件的写入,这个情况下,地址翻译会将2k的地址翻译为‘磁盘m上的n到磁盘m上的n+3号扇区’,当然也可以是‘磁盘x上的y到磁盘a上的b’,总之地址落在物理硬盘上的哪个区域,条带中央/条带边缘/单个物理硬盘/多个物理硬盘,文件系统是不知道的,由raid层面决定。这种不知道称为‘盲’,现在大多数文件系统都是‘盲’,但是也有不盲或者半盲的。我们在raid层面来设计条带,分步等,实际上都是盲操作,效果不会很大,包括raid5本身的并发io特点,也是盲并发。所谓并发,某个io要写入2k的数据,如果地址翻译结果为这个4个扇区落在一个segment里,则这个io只会占用一个数据盘,外加需要占用pariyt区域,此时如果还有一个io需要写入2k的数据,而这次的4个扇区落在了另一块数据盘上,而他需要的parity(校验)数据恰好与前一个io及其所需要的parity区域不在同一个盘上,则这两个io可以并行操作,4块磁盘同时读写。由于这种并发是基于‘恰好’的,所以raid5提供的是盲并发,要实现步盲的并发只能靠上层文件系统