Amazon EC2可以创建多个EBS卷,并使用LVM(Logical Volume Manager)设定为RAID0来提高磁盘的读写性能。
介绍在Amazon Linux上使用2个EBS卷,创建RAID0的方法。
RAID0为什么能提高性能
RAID是Redundant Array of Independent Disks的缩写,基本上指的是一种允许多个硬盘驱动器被识别和显示的技术,就如一个驱动器一样。
使用多个HDD构成RAID有很大的好处。一是即使某个硬盘出现故障,只需更换坏硬盘可快速恢复数据。更重要的是,即使特定硬盘发生故障或正在恢复,其他硬盘也完好无损,并且能正常访问数据。
另一个好处是数据写入速度更快。从计算机发出的数据写入请求,被RAID自动分配并将其写入多个HDD的功能。通过将数据写入多个HDD,比顺序地将数据写入单个HDD更快。
RAID的种类较多,RAID0、RAID1、RAID5、RAID6、RAID01、RAID10等,具体取决于数据如何分配到HDD以及数据的冗余方式。
RAID0
RAID0是最有效地利用HDD存储容量的级别。通过将数据划分为块(Block)并将其分布在多个磁盘上,可以提高读写速度。但由于没有冗余,即使RAID中的一块硬盘出现故障,文件也无法恢复。尽管RAID0提供了更快的数据写入的好处,但并没有提供更高的安全性。RAID0没有安全性的问题,可由AWS EBS的耐用性99.8%~99.999%来保证。对磁盘读写速度要求苛刻的系统,可使用RAID0来提高磁盘性能,比如SAP HANA数据库服务器AWS的最佳实践就是对磁盘做RAID0。
RAID1
RAID1是一种复制相同数据并将其写入两个磁盘的方法,也称为“镜像”。优点是,即使其中一个硬盘发生故障,所有文件仍完好无损。另一方面,由于将相同的数据写入两个HDD,因此具有容量成本加倍的缺点。AWS提供的EBS具有99.8%~99.999%的耐用性,因此在云计算上没有RAID1的使用场景。
RAID5
RAID5需要一个HDD磁盘保存“奇偶校验”的数据,这样即使其中一个HDD出现故障,丢失的数据也能从奇偶校验中生成。奇偶校验是硬盘发生故障后用于恢复数据的代码,在将数据写入RAID时自动生成。可以通过组合剩余数据和奇偶校验来恢复数据。即使1个HDD损坏也可以运行,提高了抗故障能力。另一方面,也有计算奇偶校验时给CPU带来负载的缺点。
RAID6
RAID6基本上是与RAID5类似的技术。不过,通过生成”双奇偶校验”并将其记录在不同的磁盘上,比RAID5具有更好的容错能力。使用RAID5,如果两个HDD 发生故障,将无法恢复,但如果使用RAID6,可以从剩余数据生成完整数据。虽然具有出色的容错能力,但缺点是由于生成的奇偶校验数量增加,写入性能和容量效率不如RAID5。
创建RAID0
这里使用的测试环境使用 AWS上创建EC2(003) – AWS入门 里创建的Amazon EC2。
在这里使用数据盘1和数据盘2组成RAID0。
磁盘 | EBS卷类型 | 磁盘容量 |
---|---|---|
系统盘 | gp3 | 8GiB |
数据盘1 | gp3 | 4GiB |
数据盘2 | gp3 | 4GiB |
安装lvm2
Amazon Linux2023默认没有安装lvm软件包,首先手动安装lvm2软件包。
# dnf install lvm2 -y
创建物理卷(PV)
执行lsblk命令,确认当前EC2上可用的磁盘。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
xvda 202:0 0 8G 0 disk
├─xvda1 202:1 0 8G 0 part /
├─xvda127 259:0 0 1M 0 part
└─xvda128 259:1 0 10M 0 part /boot/efi
xvdb 202:16 0 4G 0 disk
xvdc 202:32 0 4G 0 disk
从上面的结果,2个4GiB的xvdb和svdc磁盘,是未被使用的EBS卷。
和在物理机上创建RAID一样,首先创建物理设备。这里的xvdb和xvdb是必须指定执行lsblk命令后确认的设备文件。
# pvcreate /dev/xvdb /dev/xvdc
Physical volume "/dev/xvdb" successfully created.
Physical volume "/dev/xvdc" successfully created.
Creating devices file /etc/lvm/devices/system.devices
确认创建的物理卷。
# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb lvm2 --- 4.00g 4.00g
/dev/sdc lvm2 --- 4.00g 4.00g
创建卷组(VG)
指定物理卷 /dev/sdb 及 /dev/sdc 创建卷组。在这里卷组的名称为 vg-demo-sysblog,根据实际项目情况修改为易于识别的名称。
# vgcreate vg-demo-sysblog /dev/sdb /dev/sdc
Volume group "vg-demo-sysblog" successfully created
指定卷组名称执行vgdisplay命令,确认创建的卷组的信息。
# vgdisplay vg-demo-sysblog
--- Volume group ---
VG Name vg-demo-sysblog
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 7.99 GiB
PE Size 4.00 MiB
Total PE 2046
Alloc PE / Size 0 / 0
Free PE / Size 2046 / 7.99 GiB
VG UUID DFRD33-ITct-bvAm-zVeh-gTQd-9ZEs-cr0f1b
创建逻辑卷(LV)
创建的逻辑卷名称名为lv-demo-sysblog。
# lvcreate -n lv-demo-sysblog -i 2 -I 256 -l 100%FREE vg-demo-sysblog
Logical volume "lv-demo-sysblog" created.
lvcreate命令的常用选项如下。
选项 | 内容 |
---|---|
-i | 此处写LV用到的PV的数量,不能超过所在VG的PV数量,一般设置VG里的PV数。 |
-I | 条带单元大小,单位Kb。 |
-L | LV的大小,默认为Mb,可带单位G,M,K。 |
-l | 小写L,分配给LV的PE个数,对应于VG中的PE,从vgdisplay的输出中可看到VG中一共有2046个PE。指定100%FREE时将整个VG的全部容量分配给该LV。 |
-n | 定义LV名称,默认从lvol0开始。 |
指定创建的逻辑卷名称lv-demo-sysblog,确认逻辑卷的信息。
# lvdisplay lv-demo-sysblog
Volume group "lv-demo-sysblog" not found
Cannot process volume group lv-demo-sysblog
lvs命令可使用 -o 选项可指定要确认的项,进行确认。可指定选项的执行 lvs -o help 进行确认。
# lvs -o lv_name,vg_name,uuid,lv_size,Layout,stripe_size,stripes
LV VG LV UUID LSize Layout Stripe #Str
lv-demo-sysblog vg-demo-sysblog GuSeOx-QyUs-6xr6-YjkQ-Sof4-v71o-uLeoDn 7.99g striped 256.00k 2
创建文件系统及挂载
确认逻辑卷的设备文件,一般格式为 /dev/<卷组名称>/<逻辑卷名称> 。
# ll /dev/vg-demo-sysblog/lv-demo-sysblog
lrwxrwxrwx. 1 root root 7 Jan 20 12:48 /dev/vg-demo-sysblog/lv-demo-sysblog -> ../dm-0
指定逻辑卷的设备文件,创建xfs的文件系统。为什么是xfs文件系统,因为Amazon Linux2023的默认文件系统(系统盘)是xfs。
# mkfs -t xfs /dev/vg-demo-sysblog/lv-demo-sysblog
meta-data=/dev/vg-demo-sysblog/lv-demo-sysblog isize=512 agcount=8, agsize=261824 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1
data = bsize=4096 blocks=2094592, imaxpct=25
= sunit=64 swidth=128 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=64 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
将文件系统挂载至/mnt目录。
# mount /dev/vg-demo-sysblog/lv-demo-sysblog /mnt
确认文件系统是否挂载成功。
# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 475M 0 475M 0% /dev/shm
tmpfs tmpfs 190M 2.9M 188M 2% /run
/dev/xvda1 xfs 8.0G 1.6G 6.4G 20% /
tmpfs tmpfs 475M 0 475M 0% /tmp
/dev/xvda128 vfat 10M 1.3M 8.7M 13% /boot/efi
tmpfs tmpfs 95M 0 95M 0% /run/user/1000
/dev/mapper/vg--demo--sysblog-lv--demo--sysblog xfs 8.0G 90M 7.9G 2% /mnt
逻辑卷成功挂载至/mnt目录,并且磁盘容量为7.9GiB和VG的大小8GiB基本一致。
设定开机自动挂载
执行blkid命令确认逻辑卷lv-demo-sysblog的UUID。
# blkid
/dev/xvda128: SEC_TYPE="msdos" UUID="4C80-02C7" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="2352d8a6-ed1d-425e-a17c-4f4c351a43ec"
/dev/xvda1: LABEL="/" UUID="e5718765-e5e6-444f-9618-64d4cbf47272" BLOCK_SIZE="4096" TYPE="xfs" PARTLABEL="Linux" PARTUUID="fb240939-88e4-4077-ad73-32947b5232e4"
/dev/xvdc: UUID="mqvI3R-NiZb-26l3-wh2G-784u-LrDh-q4ytLr" TYPE="LVM2_member"
/dev/xvda127: PARTLABEL="BIOS Boot Partition" PARTUUID="7ab837f2-8d36-42bd-8fd3-8ab0e8cd51d5"
/dev/mapper/vg--demo--sysblog-lv--demo--sysblog: UUID="d907a024-b044-4b21-9073-9bae08b24403" BLOCK_SIZE="512" TYPE="xfs"
/dev/xvdb: UUID="9SKfGc-fuAN-ejEq-TniM-SMX9-yqrw-fwOBuw" TYPE="LVM2_member"
从blkid命令结果,可以确定逻辑卷lv-demo-sysblog的UUID为 “d907a024-b044-4b21-9073-9bae08b24403″。
使用文本编辑器打开 /etc/fstab 文件后,添加下如下一行。
UUID=d907a024-b044-4b21-9073-9bae08b24403 /mnt xfs defaults,nofail 0 0
接下来测试 /etc/fstab 文件是否正确配置,umount命令卸载临时挂载的目录/mnt后,使用/etc/fstab的配置进行挂载(mount -a)。
# umount /mnt
# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 475M 0 475M 0% /dev/shm
tmpfs tmpfs 190M 2.9M 188M 2% /run
/dev/xvda1 xfs 8.0G 1.6G 6.4G 20% /
tmpfs tmpfs 475M 0 475M 0% /tmp
/dev/xvda128 vfat 10M 1.3M 8.7M 13% /boot/efi
tmpfs tmpfs 95M 0 95M 0% /run/user/1000
# mount -a
# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 475M 0 475M 0% /dev/shm
tmpfs tmpfs 190M 2.9M 188M 2% /run
/dev/xvda1 xfs 8.0G 1.6G 6.4G 20% /
tmpfs tmpfs 475M 0 475M 0% /tmp
/dev/xvda128 vfat 10M 1.3M 8.7M 13% /boot/efi
tmpfs tmpfs 95M 0 95M 0% /run/user/1000
/dev/mapper/vg--demo--sysblog-lv--demo--sysblog xfs 8.0G 90M 7.9G 2% /mnt
介绍了在Amazon Linux2023上设定RAID0,提高读写性能的方法。