存储
Linux存储模式:
应用程序数据
虚拟文件系统 (/dev/sda)
文件系统驱动 (ext3,ext4,vfat)
内核驱动(硬件驱动)
硬件
存储介质:
ide (并口, ata, pata)
sata
scsi
sas (串口scsi硬盘)
固态硬盘 (随机读写性能非常好)
flash card (随机读写性能非常好)
存储的分类
DAS(直连存储)
集中式存储
NAS
nfs,cifs,第三方协议
操作最小单位是文件
适合cpu密集型的应用: web应用(php,jsp)
SAN (Storage Area Network)
操作最小单位是块
适合IO密集型: 大型数据库
gnbd,IpSAN(iscsi)
分布式存储
mfs
tfs
适合:存放随机读写的数据,例如:很多大小不一的图片,需要使用海量的存储空间,无限量地扩容。
一、Raid磁盘阵列
Raid0 :
条带化
至少需要2块原始设备。
提升数据存取效率。
没有提供数据冗余。
不能坏掉任意一个硬盘
Raid1 :
至少需要2块原始设备。
镜像raid,每个设备存放的数据都是一样的。
写的效率的没有提高,读取的效率提高。
提供了数据冗余。
只要剩下一个健康的设备,数据都可以读写。
Raid5 :
至少需要3个原设设备。
提供数据冗余
提高数据的读写效率。
只能坏掉任意一个设备。
Raid10 :
至少需要4个原始设备。
既提高存取效率也提供的数据冗余。
系统会选择raid1
数据库一般选择:raid10,raid5
软件构建raid:
mdadm
实现逻辑卷管理
物理卷pv(散户的钱):
可以存放数据的原始设备,是直接提供容量的设备,这些设备可以是分区,硬盘,可以raid设备等等。这些设备都是经过处理,含有lvm的元数据。
卷组vg(银行):
就是由多个pv组成的存储池。
逻辑卷lv(贷款):
在卷组分出来的,最用用于操作,存放数据的设备对象。
特点:
轻松扩容,条带化,镜像,快照
盘片 磁盘 分区
pv lv
----> VG
pv lv
应用程序数据
虚拟文件系统 (/dev/sda) <--- lv
文件系统驱动 (ext3,ext4,vfat)
内核驱动(硬件驱动)
硬件
例子1:
建立3个pv,组成一个VG,然后创建一个lv
1、创建pv
pvcreate
pvs
pvdisplay
2、建立vg
# vgcreate mysqlvg /dev/sda{7,8}
Volume group "mysqlvg" successfully created
# vgs
VG #PV #LV #SN Attr VSize VFree
mysqlvg 2 0 0 wz--n- 3.83G 3.83G
# vgextend mysqlvg /dev/sda9
Volume group "mysqlvg" successfully extended
3、创建lv
# lvcreate -L 500M -n mysqldata mysqlvg
Logical volume "mysqldata" created
例子2:对逻辑卷进行裁减容量,减少200M空间
在裁减容量之前,先存放100M的数据。
前提:有足够多的剩余空闲空间才能裁减
1、取消挂载
2、文件系统检查
# fsck -f /dev/mysqlvg/mysqldata
3、调整文件系统的容量
# resize2fs /dev/mysqlvg/mysqldata 300M
4、调整逻辑卷的容量
# lvreduce -L 300M /dev/mysqlvg/mysqldata
# fsck -f /dev/mysqlvg/mysqldata 《--建议
例子3:实现条带化
# lvcreate -n webdata -L 300M -i 2 mysqlvg
-i 2 实现条带化,涉及两个原始设备(pv)。
验证数据是同时写到两个原始设备
# iostat -x -d sda7 sda8 sda9 2
例子4:实现镜像逻辑卷。
至少需要3个以上的物理卷。两个用于镜像,一个用于日志。
# lvcreate -n webroot -L 300M -m 1 mysqlvg
用一个物理卷实现镜像数据的保存。
1个用于存放数据,另一个镜像数据,第三个用于写日志。
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
mysqldata mysqlvg -wi-a- 300.00M
webdata mysqlvg -wi-a- 304.00M
webroot mysqlvg mwi-a- 300.00M webroot_mlog 100.00
^^
验证操作:
1、保存一些数据
2、破坏其中一个物理卷。
# dd if=/dev/zero of=/dev/sda8
或者
# mkfs.ext3 /dev/sda8
# pvs 检测出有物理卷被损坏。
3、验证数据是否可以继续访问。
# vgreduce --removemissing --force mysqlvg
....
WARNING: Bad device removed from mirror volume, mysqlvg/webroot
WARNING: Mirror volume, mysqlvg/webroot converted to linear due to device failure.
Wrote out consistent volume group mysqlvg
输入以下指令,如果没有报错,一般就是转换成功,把原本镜像逻辑卷转换成普通的逻辑卷。
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda7 mysqlvg lvm2 a- 1.91G 1.62G
/dev/sda9 mysqlvg lvm2 a- 1.91G 1.62G
# vgs
VG #PV #LV #SN Attr VSize VFree
mysqlvg 2 2 0 wz--n- 3.83G 3.24G
思考:如果损坏逻辑卷修复好了,如何把逻辑卷恢复到镜像逻辑卷?
# lvconvert
例子5:逻辑卷的快照
作用:一般用于逻辑卷的数据备份。往往用在mysql数据库的快速备份。
注意:不支持对镜像逻辑卷作快照
# lvcreate -n mysqldata-sp -L 100M -s /dev/mysqlvg/mysqldata
Logical volume "mysqldata-sp" created
-s /dev/mysqlvg/mysqldata 针对 mysqldata原始卷创建快照卷,快照卷叫做mysqldata-sp,在它的生命周期里,只原始卷发生不超过100M的数据变更。
创建所需时间,取决于原始卷的元数据的大小。因为创建快照卷仅仅是做元数据的拷贝。
验证:
分别挂载原始卷和快照卷
然后验证两个卷看到的数据都是一样
对原始卷的数据进行修改,验证快照卷的数据是没有发生改变。
例子6:使用快照卷实现对mysql的在线热备。
前提:mysql的数据库是保存在逻辑卷。
1、如果数据库存在myisam存储引擎的表,建议登录到mysql,然后进行短期的所表操作。
一般在高并发环境下去操作。
mysql> flush tables with read lock;
mysql> flush logs; // mysql会新建一个二进制日志文件,把以后日志都记录到新的日志文件。
mysqld-bin.000006 <--- 该文件以及编号比它小的文件包含所表之前的所有数据变更。
mysqld-bin.000007 <-- 新的
2、建立快照卷。
思考:快照卷到底需要多少空间?
需要考虑备份所花的时间,在这段时间内,估算一般会有多少数据发生变更。
3、解锁
mysql > unlock tables;
4、挂载快照卷,然后备份数据。
rsync,cp ,scp ,tar 等等。
5、取消挂载,删除快照卷。
lvremove
注意:
1、自己设计验证步骤。
2、备份的时候,别忘记了备份二进制日志文件。
写一个脚本,要求每天进行一次快照在线全备。
mysql_spbackup-v2.sh 支持增量备份
./mysql_spbackup-v2.sh --incback <---增量备份的参数
全备:
锁表
刷新日志,会产生最新的一个日志文件000007
记录当前二进制日志文件日志状态(全备之前,数据所处的状态对应的二进制日志文件000007)
创建快照卷
...
开始备份,备份所有文件
增量备份:
锁表
记录当前二进制日志文件日志状态(全备之前,数据所处的状态对应的二进制日志文件000012)
刷新日志 000013
创建快照卷
...
只备份 000007 - 000012 的二进制日志文件
如果只有一台数据库服务器,要求尽可能减少备份时候的影响,推荐使用快照备份,前提是数据必须放在逻辑卷上。
如果是大规模的数据和是很多数据库服务器,而且是做了主从,推荐使用:
xtrabackup,meb,用于对从服务器的备份,这样不影响其他数据库的正常使用。
===============================
iscsi
gnbd