飞道的博客

计算机组成原理之磁盘

240人阅读  评论(0)

一 机械硬盘结构

1.1 硬盘(Hard Disk)

硬盘可以看做是多个盘面有规则的叠加,盘片表面涂有磁性材料。每一个盘面由多个磁道组成。硬盘内所有盘片都固定在一根轴上,这个轴就是主轴,带动着盘面旋转。

1.2 磁头(Head)

硬盘用于存储数据,那么就需要读写,那怎么读写呢?就需要读写的工具-磁头。它的主要作用就是电流信号转化为磁信息存储在硬盘上,通过将磁信息转化为电信号向外传输,进行读取。它是用线圈缠绕在磁芯上制成的(磁芯是指由各种氧化铁混合物组成的一种烧结磁性金属氧化物)。磁头通过感应旋转的盘片上磁场的变化来读取数据,通过改变盘片上的磁场来写入数据。为避免磁头和盘片的磨损,在工作状态时,磁头悬浮在高速转动的盘片上方,而不与盘片直接接触,只有在电源关闭之后,磁头会自动回到在盘片上的固定位置。

1.3磁道(Track)

就是指当磁盘旋转的时候,磁头若保持在一个位置上,每一个磁头会在盘面画出一个圆形轨迹,这些圆形轨迹就是磁道。磁道在磁盘上拥有不同的编号,从外到内一次是0,1,2…n磁道。磁道的作用当然是存储电信号转化而来的磁信息,我们的数据。

1.4扇区(Selector)

外部将要存储到硬盘的数据不会一次性写满整个磁道,读取数据也不需要读取整个磁道数据。磁道被划分为多个弧段,这些弧段称为扇区。扇区是硬盘上存储数据的最基本物理单元,且每一个物理扇区的固定的存储容量是512字节,根据硬盘密度不一样,盘面上的扇区数量也不一样。所以既然扇区是存储数据的最基本单元,就意味着一次硬盘读写操作的最小数据是512字节。
扇面: 每一个磁道的扇区组成的部分就是扇面。

1.5柱面(Cylinder)

硬盘的不同盘面的相同磁道构成的圆柱面,圆柱面的数量和磁道的数量是相等的。

1.6机械臂(Boom|Head Arm)

机械臂又叫做磁头臂,由控制电路控制,移动磁头,使得磁头位于正确的位置

1.7 扇区和块(簇) 比较

扇区是磁盘物理结构上的最基本的存储单位。存储单位是512字节,随着硬盘容量不断扩展,512字节已经不太合理了,有的厂商已经有了4096字节(4k)扇区,比如NTFS文件系统。

块:是操作系统虚拟出来的一个单位,是操作系统中最小的逻辑存储单位。在Linux操作系统中,磁盘文件存储管理的最小单位是block(块),在windows中叫做cluster(簇)。即一组扇区。每一个簇或者块可以包括2,4,8,16,32,64个扇区。一般是扇区的整数倍,这样对于磁盘的IO更好,速度更快。

1.8 为什么有块或者簇

由于扇区数量比较小,数目众多,那么就存在寻址的时候比较困难,所以操作系统将相邻的扇区组合在一起,形成一个块,再对块进行整体操作。

1.9 磁盘块和扇区怎么对应呢?

磁盘控制器,或者叫做硬盘驱动器(Hard Disk Drive),控制磁头进行硬盘寻址和读写数据,映射扇区和磁盘块。常见的硬盘控制器有IDE控制器,SATA控制器,SCSI控制器,SAS控制器,是SCSI的升级版

1.10 CHS结构体系的磁盘

CHS: 就是指柱面数(Cylinders),磁头数(Head),扇区数(Sectors),以及相应的寻址方式。他存在一个问题:每一个磁盘的扇区都一样,外磁道弧长大于内磁道弧长,因而磁记录密度就要比内部磁道密度小,最终导致外部磁道空间浪费。

1.11 ZBR(Zoned Bit Recording)区位记录

ZBR: 是一种物理优化硬盘存储空间的方法,外部磁道多设置一些扇区,这样可以大大减少之前外部磁道扇区浪费的问题。

这样读外圈磁道的速度快,内圈速度慢些

查看Linux下block块大小
tune2fs -l /dev/sda1 | grep --color size

1.12 机械硬盘的性能瓶颈

1.12.1 寻址时间

当从硬盘读取数据,需要磁头定位到该文件的起始扇区。这个过程分为2部分:
#1 寻找磁道时间:磁头定位到对应的磁道
#2 旋转等待时间:然后主轴带动盘片旋转到正确的扇区位置
整个过程就是寻址时间, 所以寻址时间=寻找磁道时间+旋转等待时间
我们试想一下读取一个50M的文件和500个10k的文件,谁的速度更快。通常来讲,就是50M,因为操作系统一般都是以簇或者数据块的形式申请连续的空白扇区进行存储。所以50M的文件可能一次寻址就够了,但是500个10k的文件,每一个文件都需要寻址一次。

这个和磁头数目和硬盘的转速也有关系,5400round/m 和 7200round/m肯定7200的更快一些

1.12.2 是否有缓存

一般来说,只靠硬盘的话,每一秒处理的数据量也不是特别多。如果磁盘上有缓存的话,那么能够预读取临近扇区的数据到硬盘缓存中。这样的依据就是局部性原理:
时间局部性:如果一个信息正在被访问,那么近期很可能他被再次访问
空间局部性:近期将要被使用的信息的存储地址可能和现在正在使用的存储地址是临近的。

1.12.3 读写机制

硬盘的性能也跟读写机制有关系。顺序读写和随机读写性能差异很大。主要就是寻址的时候花费的时间。

所以现在很多存储的系统,比如MySQL,HBase等都有优化存储的手段,即WAL预写日志,而且是顺序写。

二 固态硬盘(Solid State Disk)

固态硬盘,简称SSD。SSD采用固态电子存储芯片阵列制成的硬盘。 是由控制芯片和存储芯片组成,有的还包括缓存芯片。控制单元负责读取写入数据,以及地址映射;存储单元只是负责存储数据,缓存芯片数据交换缓冲。

控制芯片:主要用于读写数据,相当于是固态硬盘的大脑。根据内置的FTL算法,数据压缩与解压缩算法不一样,导致SSD的性能也可能不一样。
存储芯片:SSD的存储芯片根据介质不同主要分为2种:一种是采用闪存(FLASH)芯片作为存储介质;一种是采用DRAM作为存储介质,即Dynamic Random Access Memory缩写,动态随机访问内存。
第一: FLASH 芯片:不受电源控制,但是使用寿命不长,基于闪存的SSD,又分为单层(Single Layer Cell)和多层(Multi Layer Cell,其中单层成本高,容量小,但是速度快;多层成本低,容量大,但是速度慢。
第二: DRAM芯片:寿命很长,速度很快,但是受电源控制,如果断电数据不受保护。
缓存芯片:SSD上的缓存一般都是1或者2颗DRAM颗粒构成。起到数据交换缓冲作用。其实跟机械硬盘的缓存作用差不多。
FTL(Flash Translation Layer): 闪存地址转换
主要作用就是记录物理地址和逻辑地址的转换关系,他的核心就是一张物理地址和逻辑地址的映射表。这样才方便读写数据。

三 文件系统结构

Linux文件系统有三部分组成:文件名,inode和block组成
我们知道我们文件数据都是存放在block中的,但是文件还包括其他一些元数据信息,比如创建者,创建时间,文件大小,block位置,权限等。这种存储文件元数据的信息的区域叫做indoe,即索引节点。
查看文件元数据信息:stat 文件名

所以硬盘一般在格式化的时候,会将硬盘分成2各区域:一个是存放文件数据区域;一个是存放inode区域。
df -i可以查看inode数量详细信息,等价于df -inodes

四 RAID详解

RAID: 是Redundant Arrays of Independent Disk的缩写,即独立磁盘冗余阵列。也就是通过一些技术将多个磁盘组合成一个磁盘组,逻辑上看就是一个较大的磁盘设备。除了存储的功能,还可以根据不同RAID级别提供数据冗余备份的功能。

4.1 mdadm命令,用于管理RAID工具

-C 或者 --create:建立一个新阵列
-A: 机会磁盘阵列
-D 或者 --detail:打印阵列设备详细信息
-s或者–scan:扫描配置文件或者/proc/mdstat得到阵列缺失信息
-S: 停止磁盘阵列
-f:将设备状态定位故障
-a 或者 --add:添加设备到阵列
-v:显示详细信息
-r: 移除设备
-l 或者 --level: 设定磁盘阵列的级别
-n 或者–raid-devices: 指定阵列成员(分区/磁盘)的数量
-x或者–spare-devicds: 指定阵列备用盘数量
-c或者–chunk: 设定阵列的chunk大小,默认为4k
-G或者–grow: 改变阵型大小或者形态

热备份盘(hot spare or hot standby driver): 为了加强容错的功能以及使系统在磁盘故障的情况下能够迅速的重建数据,以维持系统的性能,一般的磁盘阵列系统都可以使用热备份功能。

chunk: RAID存储数据的时候每一个数据段的大小。4k,64k等
如果chunk过大可能数据读写都限于一块磁盘上,如果过小,可能引发大量的读写操作,不能发挥并发性能,占用过多的控制器总线带宽。所以应该选择合适的chunk大小。

4.2 RAID-0(等量模式,stripe)

核心思想:
这种模式首先会将磁盘分割成等量的chunk(区块),比如4KB,64KB等。然后当文件要写入RAID时,该文件也会依据chunk大小切分好,然后再依次序将文件数据放入磁盘里。
是所有阵列级别中实现思路最简单的,而且也是读写性能最好的。那么RAID-0的容量就是各个磁盘组合而成的容量之和。

如上图所示,你的数据为100M要写入磁盘阵列,那么而每一个磁盘被分配25M。但是一旦某一个磁盘损坏了,那么文件数据也就损坏了,那么整个文件就没法读了。

RAID-0的特性:
#1 至少要有2块磁盘
#2 总容量是所有磁盘的总和,即磁盘容量利用率是100%
#3 数据等量分布或者也叫条带式分布,每一个磁盘上的数据量几乎差不多
#4 没有数据冗余或者备份,当一块磁盘损坏,那么整个RAID就几乎不可用
#5 读写性能最好,尤其是当磁盘都是相同型号和容量的时候。

4.2.1 创建RAID-0

用相同的磁盘创建2个主分区,模拟2块磁盘。
fdisk /dev/sdb
mdadm -C -v /dev/md0 -l 0 -n 2 /dev/sdb1 /dev/sdb2
mdadm: chunk size defaults to 512K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
这样磁盘阵列RAID0就启动了,设备就是/dev/md0。
查看磁盘阵列详细信息:

4.2.2 导出配置文件

mdadm -Ds > /etc/madam.conf
[root@integrate-01 ~]# cat !$
cat /etc/madam.conf
ARRAY /dev/md0 metadata=1.2 name=integrate-01:0 UUID=84762f0a:b88e860a:5fded0d9:55b664a0

4.2.3 格式化并挂载到指定目录

fdisk /dev/md0
[root@integrate-01 ~]# ll /dev/md0*
brw-rw---- 1 root disk 9, 0 Dec 31 08:13 /dev/md0
brw-rw---- 1 root disk 259, 0 Dec 31 08:13 /dev/md0p1
然后进行格式化:
mkfs.ext4 /dev/md0p1

挂载到/raid0
mkdir /raid0
mount /dev/md0p1 /raid0

4.2.4 修改/etc/fstab永久挂载,即开机挂载

vim /etc/fstab,添加:
/dev/md0p1 /raid0 ext4 defaults 0 0

4.3 RAID-1(镜像模式,mirror)

核心思想:
镜像模式是指将2个或以上的磁盘组合成一个较大的逻辑磁盘设备,然后同一份数据同时保存在两个磁盘上,即允许数据冗余,这样就算一个磁盘坏了,另外一个磁盘的数据还在。

RAID-1特性:
#1 至少需要2块或以上的磁盘
#2 总容量是全部磁盘容量的一般,,即磁盘容量利用率是50%
#3 数据有备份,当一个磁盘损坏了还可以从另外一个磁盘读取
#4 写的性能不好,但是读的性能还可以

4.3.1 创建RAID-1 并且添加1G的热备盘

创建三个分区:fdisk /dev/sdc
创建完毕之后,查看一下
fdisk -l /dev/sdc

创建RAID-1:
mdadm -C -v /dev/md1 -l 1 -n 2 -x 1 /dev/sdc{1,2,3}

查看磁盘阵列状况:cat /proc/mdstat

生成配置文件:
mdadm -Ds > /etc/mdadm.conf

开始磁盘阵列的分区:
fdisk /dev/md1

mkfs.ext4 /dev/md1p1
mkdir /raid1
mount /dev/md1p1 /raid1/

4.3.2 模拟磁盘故障,自动顶替故障盘

可以监控磁盘阵列状况
watch -n 1 cat /proc/mdstat
模拟故障:
mdadm -f /dev/md1 /dev/sdc1
看到磁盘阵列的状况:

即备份盘消失了,顶替了sdc1,而sdc1则是出现了故障的盘

4.3.3 卸载阵列并删除阵列

将/dev/sdc1 从磁盘阵列/dev/md1中删除
mdadm -r /dev/md1 /dev/sdc1
cat /proc/mdstat
看一看出sdc1已经移除了

4.4 RAID-5

数据类似RAID0进行等量模式写入,不过在写入的过程中,每一次写入,会进行数据奇偶校验,即异或运算,然后这个值会放入一个磁盘中,每次总有一个磁盘来记录这个校验值。同时兼顾了读性能和数据冗余的特点。
什么是数据奇偶校验呢?
说白了就是异或运算:比如
3 7 10 parity?
3的二进制是0011
7的二进制是0111
10的二进制是1010
现在进行异或运算,即0011 xor 0111 xor 1010 = 1110
如果7所在磁盘算坏,那么就可以根据这个异或值推算出来这个值是0111。

RAID-5特性:
#1 至少需要三块磁盘
#2 总容量=(磁盘数量-1)* 容量,前提是容量相等。所以磁盘的利用率是(n-1)/n
#3 因为数据校验,可以提供数据冗余的功能,但是只支持一块磁盘的损坏。RAID 6原理跟RAID 5 差不多,可以支持2块磁盘损坏
#4 读的性能还行,跟RAID0差不多,但是写的性能并没有提升,因为要计算校验值

4.4.1 创建RAID-5,添加1G热备盘

创建3个主分区,1个扩展分区,然后2个逻辑分区,当三个主分区都给1G,然后剩余的都分给扩展分区
注意:一个Linux系统可以有至少一个最多4个主分区,扩展分区可以没有,最多一个。但是主分区+扩展分区数量不能超过4个,剩余的都是逻辑分区,硬盘的容量=主分区的容量+扩展分区的容量
扩展分区的容量=各个逻辑分区的容量之和。
fdisk /dev/sdd

创建磁盘阵列/dev/md5,
mdadm -C -v /dev/md5 -l 5 -n 3 -c 32 -x 1 /dev/sdd{1,2,3,5}
提示我扩展分区不适合这个阵列,所以我换成了逻辑分区
cat /proc/mdstat

4.4.2 停止和激活磁盘阵列

停止磁盘阵列:
mdadm -S /dev/md5

激活磁盘阵列:

4.4.3 添加

mdadm -a /dev/md5 /dev/sdd6

4.5 RAID-10创建

核心思想:
由于RAID-0读写性能不错,但是没有备份,RAID-1虽有备份,但是性能不佳,所以就有了结合这两者的一个RAID方案即RAID10.
底层由磁盘组成2个或以上RAID-1,然后组成的RAID-1阵列再组成RAID-0.

RAID-10特点:
#1 应该至少需要4块磁盘
#2 总容量 = 所有磁盘的总容量的一半,即磁盘利用率50%
#3 数据冗余,性能提升

fdisk /dev/sdf
查看分区情况
fdisk -l /dev/sdf

先创建底层的2个RAID-1
mdadm -C -v /dev/md11 -l 1 -n 2 /dev/sdf{1,2}
mdadm -C -v /dev/md12 -l 1 -n 2 /dev/sdf{3,4}

然后创建上层RAID-0
mdadm -C -v /dev/md10 -l 0 -n 2 /dev/md1{1,2}
mdadm -Ds > /etc/mdadm.conf

4.6 删除磁盘阵列

首先:如果已经挂载则先卸载
umount /dev/md1 /mnt
其次:停止RAID设备
mdadm -Ss(所有)
最后:删除RAID配置文件
rm -rf /etc/mdadm.conf

清除物理磁盘中的RAID标识
mdadm --misc --zero-superblock /dev/sdf{5,6}


转载:https://blog.csdn.net/zhanglh046/article/details/115710477
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场