1 背景
海纳数据库的并行处理能力在面对复杂数据分析时能大大提升数据处理的能力,并行处理的效果和CPU的多核处理能力以及底层的存储带宽有关系。海纳数据库的并行执行计划能充分利用CPU的多核处理能力,来规划最高效的执行计划,然而底层存储IO的能力由于受存储本身的能力影响外,还会受到当时系统的其它任务的影响,这在云ECS环境下尤为突出。本文中小六将为您回顾一次云环境下,客户在HexaDB-H上进行重IO数据分析计算时遇到的问题及解决方案。本方案,将为您提供一个高性价比、高安全的IO提速解决方案。
2 问题描述
客户反馈,在某张1亿记录左右的表上执行分析类查询需要200秒以上才能返回结果,时间不可接受。
系统资源消耗
数据库进程CPU使用率保持在200%左右, 磁盘IO使用率经常达到100%,内存和网络没有异常。
CPU

内存

磁盘


网络

SQL 分析
查看执行计划
对该SQL执行情况进行分析,时间基本都花费在磁盘IO上(IO_EVENT.DataFileRead),该表文件大小为52G,而此时磁盘IO使用率已达100%,平均读取速度为190M/s。


因此得出结论, SQL慢的原因是由于该表数据量较大,而磁盘IO性能有限。
3 问题处理
客户部署环境为云ECS,磁盘IO能力测试结果如下:
测试时块大小为4k | 单盘 |
写速度(MB/s) | 152 |
读速度(MB/s) | 227 |
IOPS | 3306 |
显然,查询性能瓶颈在于磁盘, 因此需要优化磁盘IO性能。有两种优化方案:
方案一:更换性能更好的磁盘
方案二:使用多盘创建条带化LVM
由于ECS已经配备了高性能SSD存储,没有继续优化的空间。经过分析,我们认为方案二更加可行,因此决定添加4块云盘来创建条带化LVM。
LVM是Linux提供的逻辑卷管理(Logical Volume Manager)的简称,它是建立在物理存储设备之上的一个抽象层,允许创建逻辑存储卷,和直接使用物理存储在管理上相比,提供了更好的性能和灵活性。LVM将存储资源虚拟化,使用逻辑卷不会受限于物理磁盘的大小,可以不用停止应用或卸载文件系统来调整卷大小或数据迁移。LVM和直接使用云存储相比,有以下好处:
1)更加灵活的容量:当使用逻辑卷时,文件系统能扩展到多个磁盘上,你能聚合多个磁盘或磁盘分区成单一的逻辑卷。
2)可伸缩的存储池:能使用简单的命令来扩大或缩小逻辑卷大小,不用重新格式化或分区磁盘设备。
3)磁盘条带化:可生成一个逻辑盘,数据能被条块化存储在多个磁盘上,这样能明显提升IO吞吐量。
4)支持卷快照:使用逻辑卷,能获得设备快照用来一致性备份或测试数据更新效果而不影响真实数据。
由于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秒,性能提升非常明显。
4 升级前后资源利用对比
服务器监控
CPU
优化前

优化后

磁盘
优化前,磁盘读写最大速度为200M/S:


优化后
总体磁盘读写速度最大为800M/S(4块盘组成dm-0):

IO繁忙程度降低为40%以下:

磁盘性能对比
测试时块大小为4k | 单盘 | 4盘条带化LVM |
写速度(MB/s) | 152 | 588 |
读速度(MB/s) | 227 | 1024 |
IOPS | 3306 | 13452 |
业务性能对比

5 总结
使用多盘条带化LVM的存储池,可以显著提高磁盘吞吐,提升程度接近线性,相应地,在该场景下,SQL的执行性能提升4倍,提升程度也接近线性。
6 后记
使用LVM做存储的池化,在成本不增加的前提下可以获得客观的性能提升。除此之外,他还有几点对于数据库运维相当友好的特性:
1、热插拔和在线容量调整。LVM允许将多个物理磁盘分区合并成一个逻辑卷,从而提供了更大的存储空间。逻辑卷的大小可以动态调整,而不会丢失现有数据。LVM还支持磁盘的热插拔,可以动态添加或删除物理磁盘,而不会中断正在运行的系统。这意味着用户可以在不影响海纳数据库运行的情况下增加或减少存储空间。
2、基于COW(Copy-On_Write)的快照能力。该能力是对数据库备份恢复技术的一个重要补充。LVM快照的一个重要特点是他的快照非常快,通常能在秒级完成(快照的过程实际上是在同一个VG上创建一个空的LV,该LV用来保存后续修改数据块的原始数据)。利用LVM一致性快照能力,海纳数据库(HexaDB)可以秒级创建一个备份,并可以在非常短(相当于hx_backup物理备份)的时间内恢复快照。在实际的运维中,可以先创建一个快照,然后后台慢慢转移到专门的备份空间,然后删除快照。
值得注意的是,在使用LVM的时候也有几个需要注意的点:
1、LVM本身并没有引入技术风险,但是LVM的元数据一旦被破坏,整个存储将变得不可用,所以要注意对元数据的备份。
2、LVM的快照不适宜长期保留,因为基于COW(Copy-On_Write)的快照长时间运行,对于更新数据特别多的业务数据库,快照空间将不断增长,并且伴随着一定程度数据写入性能的下降。因此需要及时转移走快照并删除快照。





