磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具备冗余能力的阵列”之意。 磁盘阵列是由不少价格较便宜的磁盘,以硬件(RAID卡)或软件(MDADM)形式组合成一个容量巨大的磁盘组,利用多个磁盘组合在一块儿,提高整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。 磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据。html
注:RAID能够预防数据丢失,可是它并不能彻底保证你的数据不会丢失,因此你们使用RAID的同时仍是注意备份重要的数据node
RAID的建立有两种方式:软RAID(经过操做系统软件来实现)和硬RAID(使用硬件阵列卡);了解raid一、raid5和raid10。不过随着云的高速发展,供应商通常能够把硬件问题解决掉。linux
RAID几种常见的类型面试
RAID类型centos |
最低磁盘个数数组 |
空间利用率安全 |
各自的优缺点服务器 |
|
级 别并发 |
说 明app |
|||
RAID0 |
条带卷 |
2+ |
100% |
读写速度快,不容错 |
RAID1 |
镜像卷 |
2 |
50% |
读写速度通常,容错 |
RAID5 |
带奇偶校验的条带卷 |
3+ |
(n-1)/n |
读写速度快,容错,容许坏一块盘 |
RAID10 |
RAID1的安全+RAID0的高速 |
4 |
50% |
读写速度快,容错 |
RAID基本思想:把好几块硬盘经过必定组合方式把它组合起来,成为一个新的硬盘阵列组,从而使它可以达到高性能硬盘的要求
镜像:提供了数据的安全性;
条带(块大小也能够说是条带的粒度),它的存在的就是提供了数据并发性
数据的校验:提供了数据的安全
RAID-0的工做原理
条带 (strping),也是咱们最先出现的RAID模式
需磁盘数量:2块以上(大小最好相同),是组建磁盘阵列中最简单的一种形式,只须要2块以上的硬盘便可.
特色:成本低,能够提升整个磁盘的性能。RAID 0没有提供冗余或错误修复能力,速度快.
任何一个磁盘的损坏将损坏所有数据;磁盘利用率为100%。
RAID-1
mirroring(镜像卷),须要磁盘两块以上
原理:是把一个磁盘的数据镜像到另外一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另外一块闲置的磁盘上生成镜像文件,(同步)
RAID 1 mirroring(镜像卷),至少须要两块硬盘
磁盘利用率为50%,即2块100G的磁盘构成RAID1只能提供100G的可用空间。以下图
RAID-5
须要三块或以上硬盘,能够提供热备盘实现故障的恢复;只损坏一块,没有问题。但若是同时损坏两块磁盘,则数据将都会损坏。 空间利用率: (n-1)/n 2/3 以下图所示
奇偶校验信息的做用:
当RAID5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。
扩展:异或运算
所谓的“奇偶校验”能够简单理解为二进制运算中的“异或运算”,一般用 xor 标识。
最左边的是原始数据,右边分别是三块硬盘,假设第二块硬盘出了故障,经过第一块硬盘上的 1 和第三块硬盘上的 1 xor 2,就可以还原出 2。同理能够还原出 3 和 8。至于 5 xor 6 则更简单了,直接用 5 和 6 运算出来便可。
一句话解释 raid 5 的数据恢复原理就是:都是用公式算出来的。
嵌套RAID级别
RAID-10镜像+条带
RAID 10是将镜像和条带进行两级组合的RAID级别,第一级是RAID1镜像对,第二级为RAID 0。好比咱们有8块盘,它是先两两作镜像,造成了新的4块盘,而后对这4块盘作RAID0;当RAID10有一个硬盘受损其他硬盘会继续工做,这个时候受影响的硬盘只有2块
通常两种处理方法:热备和热插拔
热备:HotSpare
定义:当冗余的RAID组中某个硬盘失效时,在不干扰当前RAID系统的正常使用的状况下,用RAID系统中另一个正常的备用硬盘自动顶替失效硬盘,及时保证RAID系统的冗余性
全局式:备用硬盘为系统中全部的冗余RAID组共享
专用式:备用硬盘为系统中某一组冗余RAID组专用
以下图所示:是一个全局热备的示例,该热备盘由系统中两个RAID组共享,可自动顶替任何一个RAID中的一个失效硬盘
热插拔:HotSwap
定义:在不影响系统正常运转的状况下,用正常的物理硬盘替换RAID系统中失效硬盘。
RAID的实现方式
面试题:咱们作硬件RAID,是在装系统前仍是以后?
答:先作阵列才装系统 ,通常服务器启动时,有显示进入配置Riad的提示。
硬RAID:须要RAID卡,咱们的磁盘是接在RAID卡的,由它统一管理和控制。数据也由它来进行分配和维护;它有本身的cpu,处理速度快
软RAID:经过操做系统实现
Linux内核中有一个md(multiple devices)模块在底层管理RAID设备,它会在应用层给咱们提供一个应用程序的工具mdadm ,mdadm是linux下用于建立和管理软件RAID的命令。
mdadm命令常见参数解释:
参数 |
做用 |
-a |
检测设备名称 添加磁盘 |
-n |
指定设备数量 |
-l |
指定RAID级别 |
-C |
建立 |
-v |
显示过程 |
-f |
模拟设备损坏 |
-r |
移除设备 |
-Q |
查看摘要信息 |
-D |
查看详细信息 |
-S |
中止RAID磁盘阵列 |
互动: raid5须要3块硬盘。 那么使用4块硬盘,能够作raid5吗?
能够的
新添加4块硬盘
第一步:查看磁盘
[root@ken ~]# ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
第二步:下载mdadm
[root@ken ~]# yum install mdadm -y
第三步:建立raid10阵列
[root@ken ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd{b,c,d,e} mdadm: layout defaults to n2 mdadm: layout defaults to n2 mdadm: chunk size defaults to 512K mdadm: size set to 20954112K mdadm: Fail create md0 when using /sys/module/md_mod/parameters/new_array mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
第四步:格式磁盘阵列为ext4
[root@ken ~]# mkfs.ext4 /dev/md0 mapper/ mcelog md0 mem midi mqueue/ [root@ken ~]# mkfs.ext4 /dev/md0 mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=128 blocks, Stripe width=256 blocks 2621440 inodes, 10477056 blocks 523852 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2157969408 320 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
第五步:挂载
[root@ken ~]# mkdir /raid10 [root@ken ~]# mount /dev/md0 /raid10 [root@ken ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.2G 16G 7% / devtmpfs 224M 0 224M 0% /dev tmpfs 236M 0 236M 0% /dev/shm tmpfs 236M 5.6M 230M 3% /run tmpfs 236M 0 236M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 48M 0 48M 0% /run/user/0 /dev/md0 40G 49M 38G 1% /raid10
第六步:查看/dev/md0的详细信息
[root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:08:25 2019 Raid Level : raid10 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:11:41 2019 State : clean, resyncing Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Layout : near=2 Chunk Size : 512K Consistency Policy : resync Resync Status : 96% complete Name : ken:0 (local to host ken) UUID : c5df1175:a6b1ad23:f3d7e80b:6b56fe98 Events : 26 Number Major Minor RaidDevice State 0 8 16 0 active sync set-A /dev/sdb 1 8 32 1 active sync set-B /dev/sdc 2 8 48 2 active sync set-A /dev/sdd 3 8 64 3 active sync set-B /dev/sde
第七步:写入到配置文件中
[root@ken ~]# echo "/dev/md0 /raid10 ext4 defaults 0 0" >> /etc/fstab
之因此在生产环境中部署RAID 10磁盘阵列,是为了提升硬盘存储设备的读写速度及数据的安全性,但因为咱们的硬盘设备是在虚拟机中模拟出来的,所以对读写速度的改善可能并不直观。
在确认有一块物理硬盘设备出现损坏而不能继续正常使用后,应该使用mdadm命令将其移除,而后查看RAID磁盘阵列的状态,能够发现状态已经改变。
第一步:模拟设备损坏
[root@ken ~]# mdadm /dev/md0 -f /dev/sdb mdadm: set /dev/sdb faulty in /dev/md0 [root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:08:25 2019 Raid Level : raid10 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:15:59 2019 State : clean, degraded Active Devices : 3 Working Devices : 3 Failed Devices : 1 Spare Devices : 0 Layout : near=2 Chunk Size : 512K Consistency Policy : resync Name : ken:0 (local to host ken) UUID : c5df1175:a6b1ad23:f3d7e80b:6b56fe98 Events : 30 Number Major Minor RaidDevice State - 0 0 0 removed 1 8 32 1 active sync set-B /dev/sdc 2 8 48 2 active sync set-A /dev/sdd 3 8 64 3 active sync set-B /dev/sde 0 8 16 - faulty /dev/sdb
第二步:添加新的磁盘
在RAID 10级别的磁盘阵列中,当RAID 1磁盘阵列中存在一个故障盘时并不影响RAID 10磁盘阵列的使用。当购买了新的硬盘设备后再使用mdadm命令来予以替换便可,在此期间咱们能够在/RAID目录中正常地建立或删除文件。因为咱们是在虚拟机中模拟硬盘,因此先重启系统,而后再把新的硬盘添加到RAID磁盘阵列中。
[root@ken ~]# reboot [root@ken ~]# umount /raid10 [root@ken ~]# mdadm /dev/md0 -a /dev/sdb mdadm: added /dev/sdb [root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:08:25 2019 Raid Level : raid10 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:19:14 2019 State : clean, degraded, recovering Active Devices : 3 Working Devices : 4 Failed Devices : 0 Spare Devices : 1 Layout : near=2 Chunk Size : 512K Consistency Policy : resync Rebuild Status : 7% complete #这里显示重建进度 Name : ken:0 (local to host ken) UUID : c5df1175:a6b1ad23:f3d7e80b:6b56fe98 Events : 35 Number Major Minor RaidDevice State 4 8 16 0 spare rebuilding /dev/sdb #rebuilding重建中 1 8 32 1 active sync set-B /dev/sdc 2 8 48 2 active sync set-A /dev/sdd 3 8 64 3 active sync set-B /dev/sde
再次查看发现已经构建完毕
[root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:08:25 2019 Raid Level : raid10 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:20:52 2019 State : clean Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Layout : near=2 Chunk Size : 512K Consistency Policy : resync Name : ken:0 (local to host ken) UUID : c5df1175:a6b1ad23:f3d7e80b:6b56fe98 Events : 51 Number Major Minor RaidDevice State 4 8 16 0 active sync set-A /dev/sdb 1 8 32 1 active sync set-B /dev/sdc 2 8 48 2 active sync set-A /dev/sdd 3 8 64 3 active sync set-B /dev/sde
为了不多个实验之间相互发生冲突,咱们须要保证每一个实验的相对独立性,为此须要你们自行将虚拟机还原到初始状态。另外,因为刚才已经演示了RAID 10磁盘阵列的部署方法,咱们如今来看一下RAID 5的部署效果。部署RAID 5磁盘阵列时,至少须要用到3块硬盘,还须要再加一块备份硬盘,因此总计须要在虚拟机中模拟4块硬盘设备。
第一步:查看磁盘
[root@ken ~]# ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
第二步:建立RAID5阵列
[root@ken ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sd{b,c,d,e} mdadm: layout defaults to left-symmetric mdadm: layout defaults to left-symmetric mdadm: chunk size defaults to 512K mdadm: size set to 20954112K mdadm: Fail create md0 when using /sys/module/md_mod/parameters/new_array mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
第三步:格式化为ext4
[root@ken ~]# mkfs.ext4 /dev/md0 mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=128 blocks, Stripe width=256 blocks 2621440 inodes, 10477056 blocks 523852 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2157969408 320 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
第四步:挂载
[root@ken ~]# mount /dev/md0 /raid5 [root@ken ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.2G 16G 7% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.7M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/md0 40G 49M 38G 1% /raid5
第五步:查看阵列信息
能够发现有一个备份盘/dev/sde
[root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:35:10 2019 Raid Level : raid5 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 3 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:37:11 2019 State : active Active Devices : 3 Working Devices : 4 Failed Devices : 0 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Consistency Policy : resync Name : ken:0 (local to host ken) UUID : b693fe72:4452bd3f:4d995779:ee33bc77 Events : 76 Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 1 8 32 1 active sync /dev/sdc 4 8 48 2 active sync /dev/sdd 3 8 64 - spare /dev/sde
第六步:模拟/dev/sdb磁盘损坏
能够发现/dev/sde备份盘当即开始构建
[root@ken ~]# mdadm /dev/md0 -f /dev/sdb mdadm: set /dev/sdb faulty in /dev/md0 [root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:35:10 2019 Raid Level : raid5 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 3 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:38:41 2019 State : active, degraded, recovering Active Devices : 2 Working Devices : 3 Failed Devices : 1 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Consistency Policy : resync Rebuild Status : 2% complete Name : ken:0 (local to host ken) UUID : b693fe72:4452bd3f:4d995779:ee33bc77 Events : 91 Number Major Minor RaidDevice State 3 8 64 0 spare rebuilding /dev/sde 1 8 32 1 active sync /dev/sdc 4 8 48 2 active sync /dev/sdd 0 8 16 - faulty /dev/sdb
1.uefi或BIOS初始化,开始post(power on self test)开机自检
这个过程是开机后,BIOS或UEFI进行硬件检查的阶段。
2.加载MBR到内存
自检硬件没有问题时候,这里以BIOS为例,BIOS将会直接找硬盘的第一个扇区,找到前446字节,将MBR加载到内存中,MBR将告诉程序下一阶段去哪里找系统的grub引导。此阶段属于grub第一阶段。grub还有1.5阶段和2阶段。
3.GRUB阶段
grub第1.5和第2阶段,信息默认存放在扇区中,若是使用grub-install生成的第2阶段的文件是存放在/boot分区中的。
为了加载内核系统,不得不加载/boot分区,而加载/boot分区,要有/boot分区的驱动,/boot分区驱动是放在/boot分区中的啊,咱们好像进入死循环了,Linux是怎么解决的呢?就是靠放在1.5阶段中的数据,放在第一个扇区后的后续扇区中,第1.5阶段和2阶段总共27个扇区。
第1.5阶段:mbr以后的扇区,识别stage2所在的分区上的文件系统。
第2阶段:开机启动的时候看到Grub选项、信息,还有修改GRUB背景等功能都是stage2提供的,stage2会去读入/boot/grub/grub.conf或者menu.lst等配置文件。
4.加载内核和initramfs模块
加载内核,核心开始解压,启动一些最核心的程序。
为了让内核足够的轻小,硬件驱动并没放在内核文件里面。
5.内核开始初始化,使用systemd来代替centos6之前的init程序
(1)执行initrd.target
包括挂载/etc/fstab文件中的系统,此时挂载后,就能够切换到根目录了
(2)从initramfs根文件系统切换到磁盘根目录
(3)systemd执行默认target配置
centos7表面是有“运行级别”这个概念,其实是为了兼容之前的系统,每一个所谓的“运行级别”都有对应的软链接指向,默认的启动级别时/etc/systemd/system/default.target,根据它的指向能够找到系统要进入哪一个模式
模式:
0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target
(4)systemd执行sysinit.target
有没有很眼熟?是的,在CentOS6上是被叫作rc.sysint程序,初始化系统及basic.target准备操做系统
(5)systemd启动multi-user.target下的本机与服务器服务
(6)systemd执行multi-user.target下的/etc/rc.d/rc.local
6.Systemd执行multi-user.target下的getty.target及登陆服务
getty.target咱们也眼熟,它是启动终端的systemd对象。若是到此步骤,系统没有被指定启动图形桌面,到此就能够结束了,若是要启动图形界面,须要在此基础上启动桌面程序
7.systemd执行graphical须要的服务
CentOS6,7启动区别
系统启动和服务器守护进程管理器,它不一样于centos5的Sysv init,centos6的Upstart(Ubuntu制做出来),systemd是由Redhat的一个员工首先提出来的,它在内核启动后,服务什么的全都被systemd接管,kernel只是用来管理硬件资源,至关于内核被架空了,所以linus很不满意Redhat这种作法。