海纳数据库的并行处理能力在面对复杂数据分析时能大大提升数据处理的能力,并行处理的效果和 CPU 的多核处理能力以及底层的存储带宽有关系。海纳数据库的并行执行计划能充分利用 CPU 的多核处理能力,来规划最高效的执行计划,然而底层存储 IO 的能力由于受存储本身的能力影响外,还会受到当时系统的其它任务的影响,这在云 ECS 环境下尤为突出。本文中小六将为您回顾一次云环境下,客户在 HexaDB-H 上进行重 IO 数据分析计算时遇到的问题及解决方案。本方案,将为您提供一个高性价比、高安全的 IO 提速解决方案。
客户反馈,在某张 1 亿记录左右的表上执行分析类查询需要 200 秒以上才能返回结果,时间不可接受。
数据库进程 CPU 使用率保持在 200%左右, 磁盘 IO 使用率经常达到 100%,内存和网络没有异常
对该 SQL 执行情况进行分析,时间基本都花费在磁盘 IO 上(IO_EVENT.DataFileRead),该表文件大小为 52G,而此时磁盘 IO 使用率已达 100%,平均读取速度为 190M/s。
因此得出结论, SQL 慢的原因是由于该表数据量较大,而磁盘 IO 性能有限。
客户部署环境为云 ECS,磁盘 IO 能力测试结果如下:
测试时块大小为 4k | 单盘 |
---|---|
写速度(MB/s) | 152 |
读速度(MB/s) | 227 |
IOPS | 3306 |
显然,查询性能瓶颈在于磁盘, 因此需要优化磁盘 IO 性能。有两种优化方案:
方案一为更换性能更好的磁盘
方案二为使用多盘创建条带化 LVM
由于 ECS 已经配备了高性能 SSD 存储,没有继续优化的空间。经过分析,我们认为方案二更加可行,因此决定添加 4 块云盘来创建条带化 LVM。
LVM 是 Linux 提供的逻辑卷管理(Logical Volume Manager)的简称,它是建立在物理存储设备之上的一个抽象层,允许创建逻辑存储卷,和直接使用物理存储在管理上相比,提供了更好的性能和灵活性。LVM 将存储资源虚拟化,使用逻辑卷不会受限于物理磁盘的大小,可以不用停止应用或卸载文件系统来调整卷大小或数据迁移。LVM 和直接使用云存储相比,有以下好处:
更加灵活的容量:当使用逻辑卷时,文件系统能扩展到多个磁盘上,你能聚合多个磁盘或磁盘分区成单一的逻辑卷。
可伸缩的存储池:能使用简单的命令来扩大或缩小逻辑卷大小,不用重新格式化或分区磁盘设备。
磁盘条带化:可生成一个逻辑盘,数据能被条块化存储在多个磁盘上,这样能明显提升 IO 吞吐量。
支持卷快照:使用逻辑卷,能获得设备快照用来一致性备份或测试数据更新效果而不影响真实数据。
由于 ECS 云存储对于每一个独立购买的存储资源,均可承诺较为稳定的 IO 吞吐,所以使用 LVM 条带化可以利用多个云存储来获得更好的性能和更加灵活的存储管理能力。
1、ECS 添加 4 块新磁盘
目前磁盘大小为 2.4T, 客户在云服务器上添加 4 块 600G 磁盘,整体存储的成本维持不变。
2、创建条带化 LVM
2.1 使用 fdisk 分区,分区为 LVM
[root@hexadb-master ~]# fdisk /dev/vdc
[root@hexadb-master ~]# fdisk /dev/vdd
[root@hexadb-master ~]# fdisk /dev/vde
[root@hexadb-master ~]# fdisk /dev/vdf
2.2 创建 PV
[root@hexadb-master ~]# pvcreate /dev/vdc1
[root@hexadb-master ~]# pvcreate /dev/vdd1
[root@hexadb-master ~]# pvcreate /dev/vde1
[root@hexadb-master ~]# pvcreate /dev/vdf1
[root@hexadb-master ~]# pvs PV VG Fmt Attr PSize PFree
/dev/vdc1 lvm2 --- <400.00g <400.00g
/dev/vdd1 lvm2 --- <400.00g <400.00g
/dev/vde1 lvm2 --- <400.00g <400.00g
/dev/vdf1 lvm2 --- <400.00g <400.00g
2.3 创建 VG
[root@hexadb-master ~]# vgcreate vg_strip -s 16M /dev/vdc1 /dev/vdd1 /dev/vde1 /dev/vdf1
Volume group "vg_strip" successfully created
[root@hexadb-master ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_strip 4 1 0 wz--n- 2.34t 2.34t
2.4 创建 LV
使用参数 -i 即为条带化个数,即在写入逻辑卷时会分散到 4 个 PV 中去
[root@hexadb-master ~]# lvcreate -L 2.34t -n lv_strip -i4 vg_strip
[root@hexadb-master ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_strip vg_strip -wi-ao---- 2.34t
2.5 挂载
[root@hexadb-master ~]# mkfs.ext4 -b 4096 /dev/vg_strip/lv_strip
[root@hexadb-master ~]# mount /dev/vg_strip/lv_strip /data1
[root@hexadb-master ~]# su - omm
[omm@hexadb-master ~]# cm_ctl stop
[omm@hexadb-master ~]# su - root
[root@hexadb-master ~]# cp -a /data/* /data1/
[root@hexadb-master ~]# umount /data
[root@hexadb-master ~]# mount /dev/vg_strip/lv_strip /data
将挂载命令写入到/etc/fstab中
[omm@hexadb-master ~]# cm_ctl start
升级完磁盘后,原 SQL 执行时间由升级前的 200 秒降低到 42 秒,性能提升非常明显。
优化前
优化后
优化前,磁盘读写最大速度为 200M/S:
优化后
总体磁盘读写速度最大为 800M/S(4 块盘组成 dm-0):
IO 繁忙程度降低为 40%以下:
测试时块大小为 4k | 单盘 | 4 盘条带化 LVM |
---|---|---|
写速度(MB/s) | 152 | 588 |
读速度(MB/s) | 227 | 1024 |
IOPS | 3306 | 13452 |
使用多盘条带化 LVM 的存储池,可以显著提高磁盘吞吐,提升程度接近线性,相应地,在该场景下,SQL 的执行性能提升 4 倍,提升程度也接近线性。
使用 LVM 做存储的池化,在成本不增加的前提下可以获得可观的性能提升。除此之外,他还有几点对于数据库运维相当友好的特性:
热插拔和在线容量调整。LVM 允许将多个物理磁盘分区合并成一个逻辑卷,从而提供了更大的存储空间。逻辑卷的大小可以动态调整,而不会丢失现有数据。LVM 还支持磁盘的热插拔,可以动态添加或删除物理磁盘,而不会中断正在运行的系统。这意味着用户可以在不影响海纳数据库运行的情况下增加或减少存储空间 。
基于 COW(Copy-On_Write)的快照能力。该能力是对数据库备份恢复技术的一个重要补充。LVM 快照的一个重要特点是他的快照非常快,通常能在秒级完成(快照的过程实际上是在同一个 VG 上创建一个空的 LV,该 LV 用来保存后续修改数据块的原始数据)。利用 LVM 一致性快照能力,海纳数据库(HexaDB)可以秒级创建一个备份,并可以在非常短(相当于 hx_backup 物理备份)的时间内恢复快照。在实际的运维中,可以先创建一个快照,然后后台慢慢转移到专门的备份空间,然后删除快照。
值得注意的是,在使用 LVM 的时候也有几个需要注意的点:
LVM 本身并没有引入技术风险,但是 LVM 的元数据一旦被破坏,整个存储将变得不可用,所以要注意对元数据的备份。
LVM 的快照不适宜长期保留,因为基于 COW(Copy-On_Write)的快照长时间运行,对于更新数据特别多的业务数据库,快照空间将不断增长,并且伴随着一定程度数据写入性能的下降。因此需要及时转移走快照并删除快照。