===================================================================
Linux存储模式
应用程序
虚拟文件系统提供接口
文件系统 ext3,ext4,vfat,ntfs
硬件驱动 sda, sdb
硬件
硬盘类型:
传统硬盘:
ide,sata家用
scsi ,sas
固态硬盘
ssd
从集成角度分:
直连存储
普通阵列还是是普通硬盘数据总线连接
高端阵列 SAN 存储区域网络,使用光纤把计算机和存储设备连接起来组成的网络,一般用于大型数据库,适合IO密集型的应用
NAS网络附加存储适合cpu密集型的应用
分布式存储(分布式文件系统)
阵列raid:
硬件raid
软件raid
应用程序
虚拟文件系统提供接口
文件系统 ext3,ext4,vfat,ntfs
硬件驱动 sda, sdb
硬件raid
硬件
应用程序
虚拟文件系统提供接口
文件系统 ext3,ext4,vfat,ntfs
硬件驱动 sda, sdb
硬件
常见的raid阵列算法:
raid0
raid0不支持热插拔
条带化存放数据的
至少两个硬盘
能够提高N倍读写速度,N是磁盘的个数
不能损坏任意一个硬盘RAID 0只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据。因此,RAID 0不能应用于数据安全性要求高的场合。
raid1
镜像raid
至少两个硬盘
能够数据进行冗余(冗余不等备份)
可以坏掉任何硬盘,只要剩下一个好的就OK
基本不会带来什么性能提升,个别的raid卡能够对读数据提高速度,写数据肯定不会提高。
raid5
至少3个设备组长
可以提供数据的读写性能,也能提供数据冗余
只能坏掉任意一个设备。
支持热插拔
raid10
实际是将RAID 0和RAID 1标准结合的产物,在连续地以位或字节为单位分割数据并且并行
读/写多个磁盘的同时,为每一块磁盘作磁盘镜像进行冗余。它的优点是同时拥有RAID 0的
超凡速度和RAID 1的数据高可靠性,但是CPU占用率同样也更高,而且磁盘的利用率比
例子1:使用软raid的方法实现raid0
建立一个虚拟机,给它额外增加四个1G的硬盘
raid0不支持热插拔
# mdadm --create/dev/md0 --level=0 --raid-devices=2 /dev/vdb /dev/vdc
# cat /proc/mdstat
Personalities :[raid6] [raid5] [raid4] [raid0]
md0 : active raid0vdc[1] vdb[0]
4093952 blocks super 1.2 512k chunks
unused devices:<none>
格式化、挂载好了
# mkfs.ext4/dev/md0
验证原理:
# mount -o sync/dev/md0 /mnt
# iostat -d -m vdb vdc 2
# ddif=/dev/zero of=/mnt/200M bs=1Mcount=200
临时把阵列拆掉
# umount /mnt
# mdadm --stop/dev/md0 临时拆掉,数据不会丢失
mdadm: stopped/dev/md0
重新组装
# mdadm -As
mdadm: /dev/md/0has been started with 2 drives.
会自动扫描所有硬盘,通过查看硬盘是否存在软raid的组装信息,如果有,就把他们组装
如果想永久拆掉阵列,下次不会自动组装(彻底破坏阵列)
# mdadm --stop/dev/md0
# mdadm--zero-superblock /dev/vdb
# mdadm--zero-superblock /dev/vdc
例子2:实现raid1,想方法去验证raid1的原理
# mdadm --create /dev/md1 --level=1 --raid-devices=2/dev/vdd /dev/vde
# watch "cat/proc/mdstat"
Personalities :[raid6] [raid5] [raid4] [raid0] [raid1]
md1 : active raid1vde[1] vdd[0]
2046964 blocks super 1.2 [2/2] [UU]
[=======>.............] resync = 38.9% (797632/2046964) finish=0
.5min speed=36256K/sec 首次组装,需要初始化后才能使用
验证原理:
如果是真实环境下,硬盘损坏掉,直接把坏掉硬盘拔掉,然后换上新的硬盘,它重新计算和初始化,计算完毕(把数据同步到新的硬盘),raid1又恢复了。
# mdadm /dev/md1--fail /dev/vdd
mdadm: set/dev/vdd faulty in /dev/md1
# cat /proc/mdstat
Personalities :[raid6] [raid5] [raid4] [raid0] [raid1]
md1 : active raid1vde[1] vdd[0](F)
2046964 blocks super 1.2 [2/1] [_U]
# mdadm /dev/md1--add /dev/vdb
# watch "cat/proc/mdstat"
Personalities :[raid6] [raid5] [raid4] [raid0] [raid1]
md1 : active raid1vde[1] vdd[0]
2046964 blocks super 1.2 [2/2] [UU]
[=======>.............] resync = 38.9% (797632/2046964) finish=0
.5minspeed=36256K/sec 同步完毕,功能完整raid1又恢复了
把就的故障硬盘移除
# mdadm /dev/md1 --remove /dev/vdd
mdadm: hot removed/dev/vdd from /dev/md1
例子3:实现raid5
在此之前,需要知道Linux硬盘是否能正常运行
fdisk -l
Disk /dev/sda:21.5 GB, 21474836480 bytes
255 heads, 63sectors/track, 2610 cylinders
Units = cylindersof 16065 * 512 = 8225280 bytes
Sector size(logical/physical): 512 bytes / 512 bytes
I/O size(minimum/optimal): 512 bytes / 512 bytes
Disk identifier:0x000e918e
Device Boot Start End Blocks Id System
/dev/sda1 * 1 638 5120000 83 Linux
Partition 1 doesnot end on cylinder boundary.
/dev/sda2 638 1913 10240000 83 Linux
/dev/sda3 1913 2550 5120000 82 Linux swap / Solaris
Disk /dev/sdb:21.5 GB, 21474836480 bytes
255 heads, 63sectors/track, 2610 cylinders
Units = cylindersof 16065 * 512 = 8225280 bytes
Sector size(logical/physical): 512 bytes / 512 bytes
I/O size(minimum/optimal): 512 bytes / 512 bytes
Disk identifier:0x18a3f71e
Device Boot Start End Blocks Id System
/dev/sdb1 1 2610 20964793+ 83 Linux
Disk /dev/sdc:1073 MB, 1073741824 bytes
255 heads, 63sectors/track, 130 cylinders
Units = cylindersof 16065 * 512 = 8225280 bytes
Sector size(logical/physical): 512 bytes / 512 bytes
I/O size(minimum/optimal): 512 bytes / 512 bytes
Disk identifier:0x2933311b
Device Boot Start End Blocks Id System
/dev/sdc1 1 130 1044193+ 83 Linux
Disk /dev/sdd:1073 MB, 1073741824 bytes
255 heads, 63sectors/track, 130 cylinders
Units = cylindersof 16065 * 512 = 8225280 bytes
Sector size(logical/physical): 512 bytes / 512 bytes
I/O size(minimum/optimal): 512 bytes / 512 bytes
Disk identifier:0x8fd865c7
Device Boot Start End Blocks Id System
/dev/sdd1 1 130 1044193+ 83 Linux
# mdadm --create /dev/md0 --level=5 --raid-devices=3/dev/vd{b,c,d} --spare-devices=1 /dev/vde
# watch "cat/proc/mdstat"
Personalities :[raid6] [raid5] [raid4] [raid0] [raid1]
md0 : active raid5vdd[4] vde[3](S) vdc[1] vdb[0]
4092928 blocks super 1.2 level 5, 512kchunk, algorithm 2 [3/2] [
UU_]
[=>...................] recovery = 6.8% (140416/2046464) finish
=1.5minspeed=20059K/sec
就算在虚拟机中添加了硬盘还需创建分区表。(fdisk /dev/sda-f)
等待初始化完毕,就能使用
查看RAID是否成功的创建是否运行的正常,有两种方法
查看详细信息:mdadm --detail /dev/md0命令查看RAID的详细信息
验证原理:
1、验证三个原始设备都是同时读写的
2、验证数据冗余功能
把其中原始设备设定为故障,由于我们添加了备用盘,所以他会自动进行恢复,无需手工干预
=======================================================================================
LVM
LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分LVM区管理的灵活性。
LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。
LVM
友情链接:http://redking.blog.51cto.com/27212/123126
LVM 是一种把硬盘驱动器空间分配成逻辑卷的方法,这样硬盘就不必使用分区而被简易地重划大小。主要就是这个功能,可以随意扩展或者缩小某个分区的大小,前提这个分区是逻辑卷管理的。
从硬盘驱动器中创建物理卷(physical volumes-PV)。
从物理卷中创建卷组(volume groups-VG)。
从卷组中创建逻辑卷(logical volumes-LV),并分派逻辑卷挂载点
其中只有逻辑卷才可以写数据
分一个物理分区,建立一个物理卷,然后这个物理卷建立一个卷组,我们就可以在这个卷组里面去分无数个逻辑卷,而且逻辑卷可以随意扩大缩小,不会对物理分区有影响,逻辑卷的功能也和物理分区差不多,一样可以格式化成随意的文件系统,挂载到随意的目录。 同时也支持quota
[root@rhel5 /mnt/mylv1]#
fdisk -l
Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 1318 10482412+ 83 Linux /dev/sda3 1319 1971 5245222+ 83 Linux /dev/sda4 1972 3916 15623212+ 5 Extended /dev/sda5 1972 2624 5245191 83 Linux /dev/sda6 2625 2689 522081 82 Linux swap / Solaris /dev/sda7 2690 2751 497983+ 83 Linux /dev/sda8 2752 2788 297171 8e Linux LVM [root@rhel5 /mnt/mylv1]# lvdisplay --- Logical volume --- LV Name /dev/myvg/mylv1 VG Name myvg LV UUID xXbNEd-LAQa-xLtB-c92X-3BJ9-qfWu-z54ejZ LV Write Access read/write LV Status available # open 1 LV Size 100.00 MB Current LE 25 Segments 1 Allocation inherit Read ahead sectors 0 Block device 253:0 [root@rhel5 /mnt/mylv1]# |
[root@rhel5 ~]#
umount /mnt/mylv2
[root@rhel5 ~]# lvresize -L 150M /dev/myvg/mylv2 Rounding up size to full physical extent 152.00 MB Extending logical volume mylv2 to 152.00 MB Logical volume mylv2 successfully resized [root@rhel5 ~]# e2fsck -f /dev/myvg/mylv2 e2fsck 1.39 (29-May-2006) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/myvg/mylv2: 12/38912 files (8.3% non-contiguous), 10580/155648 blocks [root@rhel5 ~]# resize2fs /dev/myvg/mylv2 100M resize2fs 1.39 (29-May-2006) Resizing the filesystem on /dev/myvg/mylv2 to 102400 (1k) blocks. The filesystem on /dev/myvg/mylv2 is now 102400 blocks long.
[root@rhel5 ~]#
lvresize -L 100M /dev/myvg/mylv2 WARNING: Reducing active logical volume to 100.00 MB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce mylv2? [y/n]: y Reducing logical volume mylv2 to 100.00 MB Logical volume mylv2 successfully resized [root@rhel5 ~]# e2fsck -f /dev/myvg/mylv2 e2fsck 1.39 (29-May-2006) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/myvg/mylv2: 12/26624 files (8.3% non-contiguous), 9032/102400 blocks [root@rhel5 ~]# mount -t ext3 /dev/myvg/mylv2 /mnt/mylv2 [root@rhel5 ~]# |
[root@rhel5 /mnt/mylv1]#
fdisk /dev/sda
The number of cylinders for this disk is set to 3916.
There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):
n
First cylinder (2789-3916, default 2789): Using default value 2789 Last cylinder or +size or +sizeM or +sizeK (2789-3916, default 3916): +500M
Command (m for help):
p
Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 1318 10482412+ 83 Linux /dev/sda3 1319 1971 5245222+ 83 Linux /dev/sda4 1972 3916 15623212+ 5 Extended /dev/sda5 1972 2624 5245191 83 Linux /dev/sda6 2625 2689 522081 82 Linux swap / Solaris /dev/sda7 2690 2751 497983+ 83 Linux /dev/sda8 2752 2788 297171 8e Linux LVM /dev/sda9 2789 2850 497983+ 83 Linux
Command (m for help):
t
Partition number (1-9): 9 Hex code (type L to list codes): 8e Changed system type of partition 9 to 8e (Linux LVM)
Command (m for help):
p
Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 1318 10482412+ 83 Linux /dev/sda3 1319 1971 5245222+ 83 Linux /dev/sda4 1972 3916 15623212+ 5 Extended /dev/sda5 1972 2624 5245191 83 Linux /dev/sda6 2625 2689 522081 82 Linux swap / Solaris /dev/sda7 2690 2751 497983+ 83 Linux /dev/sda8 2752 2788 297171 8e Linux LVM /dev/sda9 2789 2850 497983+ 8e Linux LVM
Command (m for help):
w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks. [root@rhel5 /mnt/mylv1]# |
[root@rhel5 ~]#
fdisk /dev/sda
The number of cylinders for this disk is set to 3916.
There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):
p
Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 1318 10482412+ 83 Linux /dev/sda3 1319 1971 5245222+ 83 Linux /dev/sda4 1972 3916 15623212+ 5 Extended /dev/sda5 1972 2624 5245191 83 Linux /dev/sda6 2625 2689 522081 82 Linux swap / Solaris /dev/sda7 2690 2751 497983+ 83 Linux /dev/sda8 2752 2788 297171 8e Linux LVM /dev/sda9 2789 2850 497983+ 8e Linux LVM
Command (m for help):
d
Partition number (1-9): 9
Command (m for help):
p
Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 1318 10482412+ 83 Linux /dev/sda3 1319 1971 5245222+ 83 Linux /dev/sda4 1972 3916 15623212+ 5 Extended /dev/sda5 1972 2624 5245191 83 Linux /dev/sda6 2625 2689 522081 82 Linux swap / Solaris /dev/sda7 2690 2751 497983+ 83 Linux /dev/sda8 2752 2788 297171 8e Linux LVM
Command (m for help):
d
Partition number (1-8): 8
Command (m for help):
p
Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 1318 10482412+ 83 Linux /dev/sda3 1319 1971 5245222+ 83 Linux /dev/sda4 1972 3916 15623212+ 5 Extended /dev/sda5 1972 2624 5245191 83 Linux /dev/sda6 2625 2689 522081 82 Linux swap / Solaris /dev/sda7 2690 2751 497983+ 83 Linux
Command (m for help):
w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks. [root@rhel5 ~]# partprobe [root@rhel5 ~]# |
===========================================================================
重新理解:
LVM逻辑卷管理
传统硬盘:
盘碟1 --\ /----分区1
------- 硬盘 -----
盘碟2 --/ \----分区2
LVM结构:
物理卷1 ---\ /-----逻辑卷1
------- 卷组 -----
物理卷2 ---/ \-----逻辑卷2
物理卷:所有能够存放数据库的块设备,都能够成为物理卷,它是卷组容量的提供者,也是底层实际存放数据的硬件
卷组:由多个物理卷组成的集体,它是物理卷的容量的整合。
逻辑卷:从卷组中划分出一部分空间作为存放的数据的逻辑设备。可以对它进行格式化、挂载使用
LVM逻辑卷的一些特性:
方便调整容量
支持一些高级特性:条带化、镜像、快照功能
应用程序
虚拟文件系统提供接口
文件系统 ext3,ext4,vfat,ntfs
LVM驱动
硬件驱动 sda, sdb
硬件
例子1:实现简单的逻辑卷
1、创建物理卷
# pvcreate /dev/sda7 /dev/sda8 /dev/sda9
就是在块设备上写入了一些关于逻辑卷的元数据信息
查看物理卷
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda7 lvm2 a-- 2.01g 2.01g
/dev/sda8 lvm2 a-- 2.01g 2.01g
/dev/sda9 lvm2 a-- 2.01g 2.01g
# pvdisplay
2、创建卷组
# vgcreate myvg/dev/sda7 /dev/sda8 /dev/sda9
Volume group "myvg" successfullycreated
创建了一个名字为myvg的卷组,它是由sda7,sda8,sda9等物理卷组成的。
# vgs
VG #PV #LV #SNAttr VSize VFree
myvg 3 0 0 wz--n- 6.01g 6.01g
# vgdisplay
3、创建逻辑卷
# lvcreate -nmysqldata -L 2G myvg
Logical volume "mysqldata" created
创建了一个名字为mysqldata,容量为2G的逻辑卷,容量是从myvg卷组中取出的
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
mysqldata myvg -wi-a- 2.00g
# lvdisplay
# ls/dev/myvg/mysqldata
# mkfs.ext4/dev/myvg/mysqldata
例子:一些常见的管理操作
1、对逻辑卷进行扩容
特点:支持在线热调整,无需取消挂载,在调整的过程中,逻辑卷可以正常读写
前提:逻辑卷所在的卷组有足够的空间允许本次调整
# vgs
VG #PV #LV#SN Attr VSize VFree
myvg 3 1 0 wz--n- 6.01g 4.01g
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
mysqldata myvg -wi-ao 2.00g
# lvextend/dev/myvg/mysqldata -L +1G <--- +1G 在原有的容量的基础上增加了1G
Extending logical volume mysqldata to 3.00GiB
Logical volume mysqldata successfully resized
# resize2fs/dev/myvg/mysqldata <---刷新文件系统的元数据,更新可用容量信息
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
mysqldata myvg -wi-ao 3.00g
2、对逻辑卷进行裁剪容量
一般不会进行容量裁剪,因为很可能会对文件系统进行永久性地损坏。千万要小心。
不支持在线调整
1)
# umount/dev/myvg/mysqldata
2)调整之前必须保证文件系统是干净,没有损坏数据
# fsck -f/dev/myvg/mysqldata
3)必须先调整文件系统的信息
# resize2fs /dev/myvg/mysqldata1G <---把原来的3G变成现在的1G
前提:你的逻辑卷的已经使用的空间不能大于1G
4)对逻辑卷进行裁剪容量
# lvreduce/dev/myvg/mysqldata -L 1G
WARNING: Reducing active logical volume to1.00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really wantto reduce mysqldata? [y/n]: y
5)再次检测文件系统,保证没错
# fsck -f/dev/myvg/mysqldata
测试挂载、使用
3、对卷组进行扩容
增加新的物理卷到卷组中
# pvcreate /dev/sda10
# vgextend myvg/dev/sda10
# vgs
VG #PV #LV#SN Attr VSize VFree
myvg 4 1 0 wz--n- 8.02g 7.02g
4、对卷组进行裁剪容量
裁剪前:
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda10 myvg lvm2 a-- 2.00g 2.00g
/dev/sda7 myvg lvm2 a-- 2.00g 1.00g <--- 该物理卷的空间已经分配出去给某个逻辑卷使用,所以不能裁掉它
/dev/sda8 myvg lvm2 a-- 2.00g 2.00g
/dev/sda9 myvg lvm2 a-- 2.00g 2.00g
# vgreduce myvg/dev/sda10
Removed "/dev/sda10" from volumegroup "myvg"
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda10 lvm2 a-- 2.01g 2.01g <---已经不属于任何卷组
/dev/sda7 myvg lvm2 a-- 2.00g 1.00g
/dev/sda8 myvg lvm2 a-- 2.00g 2.00g
/dev/sda9 myvg lvm2 a-- 2.00g 2.00g
5、移除逻辑卷、移除物理卷、移除卷组
# umount/dev/myvg/mysqldata
# lvremove/dev/myvg/mysqldata
Do you really wantto remove active logical volume mysqldata? [y/n]: y
# vgreduce myvg /dev/sda10
# pvremove/dev/sda10 <---移除的物理卷必须是不属于任何卷组的
# vgremove myvg
例子3:创建条带化的逻辑卷
特点:就是类似于raid0,把数据均衡到多个物理卷,实现IO的并发。
前提:要实现真正条带化带来的性能提升,那么物理卷必须是2个以上,而且是真正的独立的不同的硬件设备(不同的硬盘)
# vgcreate myvg/dev/sda{7,8,9}
Volume group "myvg" successfullycreated
# lvcreate -nmysqldata -L 2G myvg -i 2
Using default stripesize 64.00 KiB
Logical volume "mysqldata" created
-i 2 该逻辑卷的数据会条带化写到两个不同的物理卷
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda7 myvg lvm2 a-- 2.00g 1.00g 《--
/dev/sda8 myvg lvm2 a-- 2.00g 1.00g 《--
/dev/sda9 myvg lvm2 a-- 2.00g 2.00g
验证条带化:
# mount -o sync/dev/myvg/mysqldata /mnt
# ddif=/dev/zero of=/mnt/100M bs=1Mcount=100
# iostat -d -msda7 sda8 2
例子4:创建镜像逻辑卷
类似于 raid1 可以实现数据的冗余
# lvcreate -nmysqldata -L 2G -m 1 --mirrorlog core myvg
Logical volume "mysqldata" created
-m 1 数据需要镜像到另外一个独立的物理卷,所有整个逻辑卷会用到两个不同物理卷
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
mysqldata myvg mwi-a- 2.00g 13.48
^^m代表镜像 ^^^等待100%同步完成才能使用
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda7 myvg lvm2 a-- 2.00g 4.00m <---
/dev/sda8 myvg lvm2 a-- 2.00g 4.00m <---
/dev/sda9 myvg lvm2 a-- 2.00g 2.00g
验证数据的冗余:
1、把一些数据放在逻辑卷上
2、破坏其中一个物理卷
# dd if=/dev/zero of=/dev/sda8
3、验证数据继续可以被访问
输入何人lvm管理命令,都会提示有一个设备损坏掉、已经无法识别
4、移除故障的设备,把新的物理卷添加进去,把故障的镜像逻辑卷恢复到正常状态
# vgreduce --removemissing --force myvg
从myvg卷组中,把故障的物理卷强制移走
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
mysqldata myvg -wi-ao 2.00g ^^^^已经没有了100%
已经没有镜像功能了,因为它所镜像的其中一个物理卷已经被移除了
# lvconvert/dev/myvg/mysqldata -m 1 --mirrorlog core
重新把失去镜像功能的mysqldata转换成镜像
myvg/mysqldata: Converted: 0.2%
myvg/mysqldata: Converted: 23.0%
myvg/mysqldata: Converted: 47.1%
myvg/mysqldata: Converted: 70.9%
myvg/mysqldata: Converted: 95.7%
myvg/mysqldata: Converted: 100.0% 恢复完毕
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
mysqldata myvg mwi-ao 2.00g 100.00
例子5:创建逻辑卷的快照
不支持镜像逻辑卷做快照。
1、建立一个普通逻辑卷,并且存放一些数据
# lvcreate -n mysqldata -L 2G myvg
Logical volume "mysqldata" created
# mkfs.ext4/dev/myvg/mysqldata
自行存放一些数据
2、对该逻辑卷创建快照
# lvcreate -n mysqldata-sp -L 400M --snapshot/dev/myvg/mysqldata
Logical volume "mysqldata-sp"created
为mysqldata逻辑卷创建一个容量为400M的快照,名字为mysqldata-sp
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
mysqldata myvg owi-ao 2.00g
mysqldata-sp myvg swi-a- 400.00mmysqldata 0.00
3、挂载创建后的快照卷,及时对里面的数据进行备份移走。
# mount/dev/myvg/mysqldata-sp /media/
使用rsync,cp,tar等命令对快照卷上看到的数据进行备份移走
# cp -a/media/* /backup
4、备份完毕之后,应该把快照删除,免得影响原来逻辑卷读写效率
就算不删除,快照卷的空间一使用完毕,快照卷就彻底失效。
# umount /media/
# lvremove/dev/myvg/mysqldata-sp
例子6:使用逻辑卷的快照实现对mysql数据库的“快速”备份
mysqldump 逻辑备份,只能对innodb实现真正的在线热备份,其他存储引擎锁库备份,备份过程中,数据库不能正常读写
meb 物理热备,也是只能对innodb实现真正的在线热拷贝备份,其他也是要锁库备份。很难做到真正的在线备份。
前提:把mysql数据库的数据目录挂载到逻辑卷中
快照备份的优势:
快照创建的速度非常块,也就一秒以内的事情,对数据库的影响也是一秒以内的影响,创建后,只要在快照卷还没失效之前,对数据库的快照做完成备份,备份的过程不会数据库有任何读写的锁定,但会有一定的性能影响。
# vim /etc/my.cnf
[mysqld]
datadir=/data
user=mysql
socket=/data/mysqld.sock
port=3306
skip-name-resolve
# df -h
。。。
/dev/mapper/myvg-mysqldata
2.0G 67M 1.9G 4% /data
# service mysqldstart
1、对数据库进行全库锁定
对数据库的锁定了,为了避免在创建快照的过程中,避免意外的数据发生,所以锁定是数据全的保障而已。
mysql> flushtables with read lock;
2、创建快照
# lvcreate -nmysqldata-sp -L 400M -s /dev/myvg/mysqldata
3、解锁
mysql> unlocktables;
4、备份快照
# mount/dev/myvg/mysqldata-sp /mnt
# cp -a/mnt/* /backup/
5、移除快照
# lvremove/dev/myvg/mysqldata-sp
注意:为了能使用快照备份的数据把数据库恢复到最新的状态,而不仅仅快照的时候状态,那么备份的时候,应该把二进制日志文件也要做好备份。而二进制文件的备份,应该周期性的,不是跟快照一起做备份。