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,提高读写性能的方法。

参考URL