对于互联网运营的公司来说,数据是至关重要的.每天有着用户的访问,都会产生大量的数据,这些数据的存放地正是我们的硬盘.基于此,磁盘的管理就显得尢为的重要了.
数据的不段产生,就会不停的写入到磁盘中,而磁盘的空间终究是有限的,而造出一个无限大的硬盘又不是不可能的.这就对我们的技术提出了新的要求,在当前的硬盘容量不足以支持的情况下,要加入新的硬盘进来,共同完成数据的存储.
而磁盘在读写的时候,在高并发的访问量的情况下,会给磁盘的读写造成相当大的压力,这就要求我们要用新的解决方案来克服这一问题.而且磁盘的工作寿命也终究是有限的,这又要求我们在生产环境中,需要能将坏掉的硬盘换下来,补允新的硬盘上去.完成以上的种种技术要求,需要怎样的技术来得以实现呢? 在这样的大背景下, 独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks)和LVM是逻辑盘卷管理(Logical Volume Manager)就应孕而生了.
首先我们来了解一下 RAID 技术.RAID有 RAID0 -RAID6这几种管理方式,[还有非公开的RAID7标准,这里不作讨论]
RAID 0 它将两个以上的磁盘并列起来,成为一个大容量的磁盘。在存放数据时,分段后分散存储在这些磁盘中,因为读写时都可以并行处理,所以在所有的级别中,RAID 0的速度是最快的。但是RAID 0既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失,非常危险。数据存放容量是 组合中,最小磁盘的容量 X 磁盘数量
RAID 1
两组以上的N个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,另外写入速度有微小的降低。所有个硬盘互为镜像.不管哪块硬盘损坏,镜像硬盘则会工作。不管多少硬盘组成阵列都只能用一块硬盘的空间,空间利用 率极低,有容错能力.可用空间为组合中最小容量的硬盘
RAID2 - RAID4在生产环境中,使用并不多,这里不作讨论.
RAID 5
RAID 5是一种储存性能、数据安全和存储成本兼顾的存储解决方案。它使用的是硬盘分区技术。RAID 5至少需要三块硬盘,RAID 5不是对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。也就是每一块盘都是其它盘的校验盘,当RAID5的一个磁盘数据发生损坏后,可以用剩下的数据校验信息修复被损坏的数据。RAID 5可以理解为是RAID 0和RAID 1的折衷方案。RAID 5有容错能力,又极大的提高了磁盘的利用空间, 而且RAID5的读写速度近似于RAID0,所以这是一个很好的选择.该方案的容量使用率为硬盘数量减1,X组合中最小容量磁盘.
RAID 6
与RAID 5相比,RAID 6增加了第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,即使两块磁盘同时失效也不会影响数据的使用。但RAID 6需要分配给奇偶校验信息更大的磁盘空间,相对于RAID 5有更大的“写损失”,因此“写性能”非常差。较差的性能和复杂的实作方式使得RAID 6很少得到实际应用。同一数组中最多容许两个磁盘损坏。更换新磁盘后,数据将会重新算出并写入新的磁盘中。RAID6必须要有4块盘才能正常工作,所以这里我们选择RAID5作为重点讨论
首先在虚拟机中,准备8块5G的硬盘
[root@localhost html]# fdisk -l|awk '/^Disk \/dev\/sd[a-z]/{print $2}' ==>sdb - sdg 共8块
/dev/sda:
/dev/sdb:
/dev/sdc:
/dev/sde:
/dev/sdd:
/dev/sdf:
/dev/sdh:
/dev/sdi:
/dev/sdg:
准备8块硬盘,4块硬盘做成一组RAID5,其中有一块是热备盘,这里我们要用到mdadm命令,简单的简介一下mdadm命令的用法
mdadm: 模块式化命令
-A: 装配模式,重新识别此前实现的RAID
-C:创建模式,创建RAID
-F:监控模式
管理模式:-f, -r, -a
-C: 创建模式中专用选项
-n #: 用于创建RAID设备的磁盘个数;
-l #: 级别
-a yes: 自动为创建的RAID生成设备文件;
-c Chunk_Size:
这里我们是创建RAID,用到的是-C选项,过程如下
[root@localhost ~]# mdadm -C /dev/md0 -a yes -n 3 -l 5 /dev/sdb /dev/sdc /dev/sdd ==> -a yes是自动创建块设备, -n 3 用三块硬盘创建, -l 5 五级别
mdadm: /dev/sdb appears to be part of a raid array:
level=raid1 devices=2 ctime=Sun Jul 20 20:19:23 2014
mdadm: /dev/sdc appears to be part of a raid array:
level=raid1 devices=2 ctime=Sun Jul 20 20:19:23 2014
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started. ==>看到这个就表示以/dev/md0为命名的RAID5设备创建好了.
[root@localhost ~]# mdadm -a /dev/md0 /dev/sde ==>给RAID5 设备/dev/md0 加入一块热备盘
mdadm: added /dev/sde
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Jul 20 21:10:35 2014
Raid Level : raid5
Array Size : 10476544 (9.99 GiB 10.73 GB)
Used Dev Size : 5238272 (5.00 GiB 5.36 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Sun Jul 20 21:13:39 2014
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 53eb296b:191ae53c:c075947a:72f789e5
Events : 19
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
3 8 48 2 active sync /dev/sdd
4 8 64 - spare /dev/sde 这里显示, /dev/sdb,sdc,sdd是工作盘, /dev/sde是热备盘
同样的过程创建RAID5 /dev/md1.
准备好 两个 RAID5 的 /dev/md0 , /dev/md1后,我们就可以 创建 LVM 逻辑盘卷管理了
首先创建PV
[root@localhost ~]# pvcreate /dev/md0 /dev/md1
Physical volume "/dev/md0" successfully created
Physical volume "/dev/md1" successfully created
用创建的两个pv /dev/md0 /dev/md1 创建一个vg组,
[root@localhost ~]# vgcreate myvg /dev/md0 /dev/md1
Volume group "myvg" successfully created
[root@localhost ~]# lvcreate -n mylv1 -L 6G myvg
Logical volume "mylv1" created
[root@localhost ~]# lvcreate -n mylv2 -L 6G myvg
Logical volume "mylv2" created
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
myvg 2 2 0 wz--n- 19.98g 7.98g ==>此时myvg组还有7.98G的容量,把它都分给mylv3
vg0 1 4 0 wz--n- 59.99g 7.99g
[root@localhost ~]# lvcreate -n mylv3 -L 7.97G myvg
这样我们的一个逻辑盘卷管理系统就做好了.下面可以进行格式化分区了,格式化分区后,就可以挂载到系统目录中使用了.
虚拟分区格式化
[root@localhost ~]# mke2fs -t ext4 /dev/myvg/mylv1 格式化lv1
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
393216 inodes, 1572864 blocks
78643 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1610612736
48 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
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
在/mnt下创建三个目录,分别挂载 mylv1,2,3
[root@localhost mnt]# mkdir mylv{1,2,3}
[root@localhost mnt]# tree ./
./
├── mylv1
├── mylv2
└── mylv3
分别将三个分区挂载好.
[root@localhost mnt]# mount /dev/myvg/mylv1 /mnt/mylv1
[root@localhost mnt]# mount /dev/myvg/mylv2 /mnt/mylv2
[root@localhost mnt]# mount /dev/myvg/mylv3 /mnt/mylv3
[root@localhost mylv1]# touch /mnt/mylv1/testmylv1.txt
[root@localhost mylv1]# echo 'hello lvm'>>/mnt/mylv1/testmylv1.txt
此时,在逻辑卷中,我们写入了数据,那么我们模拟一下RAID中的一块块盘坏了,看对数据是否有影响
[root@localhost mylv1]# mdadm -f /dev/md0 /dev/sdb 此时我们设置/dev/md0中的 /dev/sdb硬盘已损坏
mdadm: set /dev/sdb faulty in /dev/md0
[root@localhost mylv1]# mdadm -D /dev/md0 查看/dev/md0的状态
/dev/md0:
Version : 1.2
Creation Time : Sun Jul 20 21:10:35 2014
Raid Level : raid5
Array Size : 10476544 (9.99 GiB 10.73 GB)
Used Dev Size : 5238272 (5.00 GiB 5.36 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Sun Jul 20 21:58:14 2014
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 1
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Rebuild Status : 45% complete
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 53eb296b:191ae53c:c075947a:72f789e5
Events : 28
Number Major Minor RaidDevice State
4 8 64 0 spare rebuilding /dev/sde ==>此处显示原来的热备盘正在同步之前的数据
1 8 32 1 active sync /dev/sdc
3 8 48 2 active sync /dev/sdd
0 8 16 - faulty /dev/sdb ==>很明显,这里显示/dev/sdb盘处于损坏状态,此前作为热备盘的/dev/sde自动顶上了
[root@localhost mylv1]# cat testmylv1.txt 再来查看,逻辑卷中的数据是否受影响
hello lvm ==>ok数据完好.
此时该RAID组还有三块硬盘在工作,还允许再坏一块硬盘,而数据的完整性同样能得到保证.
[root@localhost mylv1]# mdadm -f /dev/md0 /dev/sdc 设置 /dev/sdc盘坏了
mdadm: set /dev/sdc faulty in /dev/md0
[root@localhost mylv1]# mdadm -D /dev/md0 查看RAID组状态
/dev/md0:
Version : 1.2
Creation Time : Sun Jul 20 21:10:35 2014
Raid Level : raid5
Array Size : 10476544 (9.99 GiB 10.73 GB)
Used Dev Size : 5238272 (5.00 GiB 5.36 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Sun Jul 20 22:13:30 2014
State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 2
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 53eb296b:191ae53c:c075947a:72f789e5
Events : 42
Number Major Minor RaidDevice State
4 8 64 0 active sync /dev/sde
1 0 0 1 removed
3 8 48 2 active sync /dev/sdd
0 8 16 - faulty /dev/sdb
1 8 32 - faulty /dev/sdc 两块磁盘处于损坏状态
我们再来检查一下,看数据是否依然完整
[root@localhost mylv1]# cat /mnt/mylv1/testmylv1.txt
hello lvm ==> ok数据完整