RAID:独立磁盘冗余阵列(Redundant Arrays of Independent(最早是Inexpensive,后来改成Independent) Disks,RAID)
计算机核心部件:CPU,内存,IO设备
部分硬盘接口格式:
硬盘类型 | 英文名称 | 传输速度 | 接口类型 |
---|---|---|---|
IDE | Integrated Drive Electronics | 133Mbps | 并行接口 |
SATA1 | Serial Advanced Technology Attachment1.0 | 300Mbps | 串行接口 |
SATA2 | 600Mbps | 串行接口 | |
SATA3 | 6Gbps | 串行接口 | |
USB3.0 | Universal Serial Bus | 480Mbps | 串行接口 |
SCSI | small computer system interface | 1Gbps | 并行 |
SAS |
驱动:将逻辑指令转化为对应设备的控制指令的程序。
将cpu指令转化为各设备可以理解的指令,在转换处有一个控制设备,集成再主板上的叫控制器,独立在主板外的叫适配器;本质上是同一种东西。即控制器(适配器)是连接主板和IO设备(外接IO设备,如磁盘、USB等)中间的桥梁,负责让CPU和IO设备良好通信的介质。
RAID级别仅仅代表磁盘组织方式不同(应用不同场景需求),没有上下之分。考虑因素:数据传输速度,完整性,可靠性,安全性等。
所谓条带技术,即RAID0,就是将一各数据分为很多片,通过控制器,存放在不同的磁盘设备上,这样可以大大提高读写速度,缓解IO端口的读写瓶颈问题。但是带来的问题:如果任意一个磁盘损坏,此文件就无法使用,这也大大降低了磁盘存储的可靠性。
磁盘镜像技术,即RAID1,就是在通过控制器向磁盘存储数据时,将一份数据分别存放在不同的磁盘上,每个磁盘存放的数据都是完整的,相同的。这种技术,提高了磁盘存储的可靠性,即是有一个磁盘损坏,也可以从别的磁盘上备份得到;但是缺毫无冗余能力,即读写速度并没有提升(相反,写的速度反而降低),硬盘利用率只有二分之一。
校验码技术,即RAID4,磁盘群提供一个校验码盘,负责记录其他磁盘存储的总和数据,如:在上图,存储数据磁盘上分别存储1、2、2,则在校验码盘存储5(1+2+2);如果存储数据盘有一个损坏,有能通过校验码盘和其他正常工作的盘,恢复出损坏盘的数据。校验码技术,提升了读写速度,并且有一定的可靠性(坏一块磁盘并不影响数据完整性)。
即便如此,因为恢复数据(有一块盘损坏)时,需要校验码盘和其他盘共同参与,这也提升了IO压力,和损坏风险。同时,校验码盘容易成为整个技术的瓶颈。
RAID5和RAID4很相似,差别在于:RAID5的校验码盘不是固定的,即磁盘群内,互为校验码盘,这样就缓解了RAID4暴露出来的问题(固定的校验码盘容易成为整个技术的瓶颈)。
RAID级别示意图
级别 | 应用技术 | 允许磁盘损坏程度 | 性能表现 |
---|---|---|---|
RAID0 | 条带技术 | 不允许磁盘坏 | 传输速度快(读写性能提升N倍),可靠性极差(没有冗余(错)能力) |
RAID1 | 磁盘镜像技术 | 坏一块不影响 | 传输速度慢(写性能下降,读性能提升),可靠性高(较强的冗余能力) |
RAID2 | 汉明码技术 | 同0 | 在0的基础上,提升读写数据时的纠错能力 |
RAID3 | 汉明码技术 | 同1 | 在1的基础上,提升读写数据时的纠错能力 |
RAID4 | 校验码技术 | 坏一块可修复 | 传输速度快(读写性能提升),具备冗余能力(不高),修复危险度高 |
RAID5 | 轮流校验码技术 | 坏一块可修复 | 同4,避免单一校验硬盘成为瓶颈问题 |
RAID6 |
所谓RAID01就是先进行RAID0(条带化),在进行RAID1(镜像化),这样可一提升IO速度,也可以确保可靠性。
但是,如果有一块磁盘损坏,可能整个磁盘体系都需要被调用。
所谓RAID10即先进行RAID1(镜像技术),再进行RAID0(条带技术),这样可一提升IO速度,也可以确保可靠性。如果有一块磁盘损坏,则不需要调用整个磁盘体系,只需要调用和损坏磁盘互为镜像的磁盘进行数据恢复即可。
所谓RAID10即先进行RAID5(镜像技术),再进行RAID0(条带技术)。此处不再过多解释。
RAID50大大提升对数据的读写能力,同时具备冗余能力。空间利用率为(总盘数-校验盘个数)/总盘数
JBOD磁盘技术,适合Hadoop。
性能无提升,不具备冗余能力,空间利用率百分之百
早期:
IDE
SCSI
如今:
STAT
盘大,价格便宜
SAS
盘小,价格昂贵
主机连接有插槽,RAID控制器通过线缆连接到插槽(插槽镶嵌再主机上),将硬盘插入插槽,组成RAID阵列。
磁盘阵列放在一个大的磁盘盒子内,通过一个向外接口
主机没有插槽,通过一个外接线缆,将主机RAID控制器和磁盘阵列盒子连接在一起。
内核必须支持软件RAID,LInux内核中有一个模块md:multi disks(多磁盘)
使用md模拟一个raid(逻辑RAID),/dev/mdx
RAID需要在不同磁盘上做,才有意义(突破单个磁盘的IO瓶颈),实验状态下,使用一块磁盘不同分区来实现(真实环境是毫无意义的,因为磁盘的IO端口依然是传输瓶颈)。
mdadm是个模式化的命令:
创建模式 -C
专用选项:-l(指定级别);-n(设备个数);-a(是否自动为其创建设备文件(yes,no));-c(指定chunk大小,即数据块大小)
-x : 指定空闲盘的个数。留着一个备份盘,如果有一个使用的盘坏掉,备份盘立刻顶上去,保证数据安全。
管理模式
--add(-a) --remove(-r)等
mdadm /dev/mdx --fail /dev/sdxx
mdadm -S(--stop) /dev/mdx
监控模式 -F
增长模式 -G
装配模式 -A
将/dev/vdb分为四个分区,并创建其每个分区的系统类型为Linux raid autodetect。
[root@raid ~]# fdisk /dev/vdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x05300968. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2080, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2080, default 2080): +200M Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (408-2080, default 408): Using default value 408 Last cylinder, +cylinders or +size{K,M,G} (408-2080, default 2080): +200M Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 3 First cylinder (815-2080, default 815): Using default value 815 Last cylinder, +cylinders or +size{K,M,G} (815-2080, default 2080): +200M Command (m for help): n Command action e extended p primary partition (1-4) p Selected partition 4 First cylinder (1222-2080, default 1222): Using default value 1222 Last cylinder, +cylinders or +size{K,M,G} (1222-2080, default 2080): Using default value 2080 Command (m for help): t Partition number (1-4): 1 Hex code (type L to list codes): fd Changed system type of partition 1 to fd (Linux raid autodetect) Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): fd Changed system type of partition 2 to fd (Linux raid autodetect) Command (m for help): t Partition number (1-4): 3 Hex code (type L to list codes): fd Changed system type of partition 3 to fd (Linux raid autodetect) Command (m for help): t Partition number (1-4): 4 Hex code (type L to list codes): fd Changed system type of partition 4 to fd (Linux raid autodetect) Command (m for help): w
将/dev/vdb1和/dev/vdb4作为磁盘阵列(RAID0模式)。
[root@raid ~]# mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/vdb{1,4} mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. [root@raid ~]# cat /proc/mdstat //查看创建结果 Personalities : [raid0] md0 : active raid0 vdb4[1] vdb1[0]//所有启用的RAID设备 637440 blocks super 1.2 512k chunks //chunk大小为512k unused devices:
在操作系统看来,/dev/md0就是一个块设备,和/dev/sda2没有区别,RAID机制的实现是在物理层面。即块设备可以被操作系统识别后,就需要进行格式化:
[root@raid ~]# mkfs.ext3 /dev/md0 //格式化/dev/md0为ext3格式 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=128 blocks, Stripe width=256 blocks 39840 inodes, 159360 blocks 7968 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=163577856 5 block groups 32768 blocks per group, 32768 fragments per group 7968 inodes per group Superblock backups stored on blocks: 32768, 98304 Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 20 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
查看md0文件系统
[root@raid ~]# fdisk -l /dev/md0 Disk /dev/md0: 652 MB, 652738560 bytes 2 heads, 4 sectors/track, 159360 cylinders Units = cylinders of 8 * 512 = 4096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 524288 bytes / 1048576 bytes Disk identifier: 0x00000000
挂载文件设备
[root@raid ~]# mkdir /fsx [root@raid ~]# mount /dev/md0 /fsx/ [root@raid ~]# cd /fsx/ [root@raid fsx]# ls lost+found
前期步骤和创建RAID0基本一样,即创建分区,设备分区系统类型等。然后,创建RAID1:
root@raid fsx]# mdadm -C /dev/md1 -a yes -l 1 -n 2 /dev/vda1 /dev/vda2 mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 Continue creating array? y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md1 started.
查看/dev/md1设备块信息
[root@raid fsx]# fdisk -l /dev/md1 Disk /dev/md1: 209 MB, 209846272 bytes//只是一个磁盘的大小,即操作系统看来,md1仅仅是一个磁盘,备份的任务是物理底层完成的 2 heads, 4 sectors/track, 51232 cylinders Units = cylinders of 8 * 512 = 4096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
格式化,挂载md1,并写入数据
[root@raid fsx]# mkfs.ext4 /dev/md1 mke2fs 1.41.12 (17-May-2010) warning: 127 blocks unused. Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) Stride=0 blocks, Stripe width=0 blocks 51400 inodes, 204801 blocks 10246 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=67371008 25 block groups 8192 blocks per group, 8192 fragments per group 2056 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 23 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@raid fsx]# mount /dev/md1 /mnt/ [root@raid fsx]# echo "fsx123" > /mnt/fsx [root@raid mnt]# cat fsx fsx123
监控模式下,可以显示RAID设备的详细信息:
[root@raid mnt]# mdadm -D /dev/md1 //-D == --detail /dev/md1: Version : 1.2 //版本 Creation Time : Wed Apr 4 02:34:10 2018 Raid Level : raid1 Array Size : 204928 (200.16 MiB 209.85 MB) //阵列大小 Used Dev Size : 204928 (200.16 MiB 209.85 MB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Wed Apr 4 02:39:29 2018 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Name : raid:1 (local to host raid) UUID : d9cb6898:63c22e52:c3651fed:8650a65c Events : 17 Number Major Minor RaidDevice State 0 252 1 0 active sync /dev/vda1 1 252 2 1 active sync /dev/vda2
管理模式下可以模拟一个磁盘损坏:
[root@raid mnt]# mdadm /dev/md1 -f /dev/vda1 //模拟损坏/dev/md1阵列中的/dev/vda1磁盘 mdadm: set /dev/vda1 faulty in /dev/md1 [root@raid mnt]# ls fsx lost+found //一个磁盘存坏,文件仍然可以读取,RAID1的冗余能力。 [root@raid mnt]# vim fsx [root@raid mnt]# cat fsx fsx123 [root@raid mnt]# mdadm -D /dev/md1 /dev/md1: Version : 1.2 Creation Time : Wed Apr 4 02:34:10 2018 Raid Level : raid1 Array Size : 204928 (200.16 MiB 209.85 MB) Used Dev Size : 204928 (200.16 MiB 209.85 MB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Wed Apr 4 02:45:27 2018 State : clean, degraded Active Devices : 1 Working Devices : 1 Failed Devices : 1 Spare Devices : 0 Name : raid:1 (local to host raid) UUID : d9cb6898:63c22e52:c3651fed:8650a65c Events : 21 Number Major Minor RaidDevice State 0 0 0 0 removed //查看状态,处与remove 1 252 2 1 active sync /dev/vda2 0 252 1 - faulty /dev/vda1
移除损坏的设备
[root@raid mnt]# mdadm /dev/md1 -r /dev/vda1 //-r == --remove mdadm: hot removed /dev/vda1 from /dev/md1 [root@raid mnt]# mdadm -D /dev/md1 /dev/md1: Version : 1.2 Creation Time : Wed Apr 4 02:34:10 2018 Raid Level : raid1 Array Size : 204928 (200.16 MiB 209.85 MB) Used Dev Size : 204928 (200.16 MiB 209.85 MB) Raid Devices : 2 Total Devices : 1 Persistence : Superblock is persistent Update Time : Wed Apr 4 02:47:40 2018 State : clean, degraded Active Devices : 1 Working Devices : 1 Failed Devices : 0 Spare Devices : 0 Name : raid:1 (local to host raid) UUID : d9cb6898:63c22e52:c3651fed:8650a65c Events : 26 Number Major Minor RaidDevice State 0 0 0 0 removed //被移除 1 252 2 1 active sync /dev/vda2
重新给md1添加一块设备
[root@raid mnt]# mdadm /dev/md1 -a /dev/vda1 //-a == --add mdadm: added /dev/vda1 [root@raid mnt]# mdadm -D /dev/md1 /dev/md1: Version : 1.2 Creation Time : Wed Apr 4 02:34:10 2018 Raid Level : raid1 Array Size : 204928 (200.16 MiB 209.85 MB) Used Dev Size : 204928 (200.16 MiB 209.85 MB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Wed Apr 4 02:50:01 2018 State : clean, degraded, recovering Active Devices : 1 Working Devices : 2 Failed Devices : 0 Spare Devices : 1 Rebuild Status : 47% complete Name : raid:1 (local to host raid) UUID : d9cb6898:63c22e52:c3651fed:8650a65c Events : 37 Number Major Minor RaidDevice State 2 252 1 0 spare rebuilding /dev/vda1 1 252 2 1 active sync /dev/vda2 [root@raid mnt]# cat /proc/mdstat Personalities : [raid0] [raid1] md1 : active raid1 vda1[2] vda2[1] 204928 blocks super 1.2 [2/2] [UU] md0 : active raid0 vdb4[1] vdb1[0] 637440 blocks super 1.2 512k chunks unused devices:
停止阵列
[root@raid /]# umount /mnt/ //停止前必须先解挂 [root@raid /]# mdadm -S /dev/md1 //-S == --stop mdadm: stopped /dev/md1
重新启动阵列
[root@raid /]# mdadm -A /dev/md1 /dev/vda1 /dev/vda2 mdadm: /dev/md1 has been started with 2 drives. [root@raid /]# mdadm -D /dev/md1 /dev/md1: Version : 1.2 Creation Time : Wed Apr 4 02:34:10 2018 Raid Level : raid1 Array Size : 204928 (200.16 MiB 209.85 MB) Used Dev Size : 204928 (200.16 MiB 209.85 MB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Wed Apr 4 02:54:19 2018 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Name : raid:1 (local to host raid) UUID : d9cb6898:63c22e52:c3651fed:8650a65c Events : 83 Number Major Minor RaidDevice State 2 252 1 0 active sync /dev/vda1 3 252 2 1 active sync /dev/vda2