查看原文
其他

50T的数据还能存储在阿里云RDS MySQL中吗?

司马辽太杰 云数据库技术 2022-10-13

0、概述

随着业务发展和时间积累,业务系统的数据库存储着较大规模的数据,而这些数据访问频率是不同的,通常访问频率高的热数据是少量,比较多的冷数据访问频率并不高,甚至有些冷数据只需要只读。如果这些冷数据都存储在联机事务处理OLTP(On-Line Transaction Processing)数据库引擎中,如MySQL InnoDB引擎,会在成本、安全、性能等问题上带来一些挑战,常见做法是将系统中的冷数据存储在归档数据库中。此时一个高压缩比、性能稳定可靠、完全兼容MySQL的数据库引擎会是最佳选择,阿里云RDS MySQL X-Engine就是符合此类需求的产品。


阿里云 RDS MySQL最大存储只支持32TB,那如何存储50T的数据呢?本文将帮助阿里云用户开发者们了解RDS X-Engine的以下特性:

  • 相对于MySQL InnoDB引擎,X-Engine有50%左右的压缩率,RDS最大32TB存储的规格下,可以存64TB InnoDB引擎的数据。

  • 相对于MySQL InnoDB引擎,只写场景大约提升了20%的性能,只读和读写混合场景性能略差。

  • 完全兼容MySQL,并和MySQL有相同的生态。


1、X-Engine是什么

X-Engine是阿里云数据库产品事业部自研的联机事务处理OLTP(On-Line Transaction Processing)数据库存储引擎,完全兼容MySQL数据库。

X-Engine使用了LSM-Tree技术。LSM-Tree将数据进行分层存储,严格的顺序append-only写入磁盘,所以极大提高了数据库写入能力。在对海量数据的存储和检索场景下,近几年流行的NoSQL通常采用了此技术,比如Apache顶级开源数据库项目HBase、Cassandra,又如Google和Facebook分别开源的数据库存储引擎LevelDB、RocksDB。

阿里对LSM-Tree进行了大量的重构设计:

  • 热数据层和数据更新使用内存存储,通过内存数据库技术(Lock-Free index structure/append only)提高事务处理的性能。

  • 流水线事务处理机制,把事务处理的几个阶段并行起来,极大提升了吞吐。

  • 访问频度低的数据逐渐淘汰或是合并到持久化的存储层次中,并结合多层次的存储设备进行存储。

  • 对性能影响比较大的Compaction过程做了优化:

    a)拆分数据存储粒度,利用数据更新热点较为集中的特征,尽可能在合并过程中复用数据。

    b)精细化控制LSM的形状,减少I/O和计算代价,有效缓解了合并过程中的空间增大。

  • 同时使用更细粒度的访问控制和缓存机制,优化读的性能。


2、X-Engine架构

LSM tree (log-structured merge-tree) 是一个磁盘严格顺序写入、数据分level存储、每level的数据都按主键(Key)排序后存储、各level中的数据会定期merge然后写入下一level等特性的数据结构。这种特性保证了对增删改很友好,尤其是极大的增强写入吞吐量能力,但是弱化了范围查的能力。阿里又加入硬件加速Compaction过程、Copy-on-write等技术,从而使X-Engine可以将存储空间降低至10%~50%。X-Engine的LSM架构详见图1。

图1


3、X-Engine测试

3.1 测试环境

X-Engine和InnoDB相比,他的压缩率和事务并发处理能力到底如何呢?我们进行了实际测试,首先在阿里云上分别购买2个RDS MySQL 8.0实例,引擎分别为:InnoDB和X-Engine,其余配置均相同。详细参数见下图2。

图2


3.2 压缩比测试

使用Sysbench构建测试数据,分别对两个不同引擎的实例都构建30个表、每个表2000万数据。

语句如下:

#InnoDB preparesysbench /usr/share/sysbench/oltp_update_index.lua \--mysql-host= \--mysql-user= \--mysql-password= \--mysql-port=3306 \--mysql-db=test \--threads=32 \--tables=30 \--table_size=20000000\--mysql-storage_engine=INNODB \prepare
#X-Engine preparesysbench /usr/share/sysbench/oltp_update_index.lua \--mysql-host= \--mysql-user= \--mysql-password= \--mysql-port=\--mysql-db=test \--threads=32 \--tables=30 \--table_size=20000000\--mysql-storage_engine= XENGINE \prepare

InnoDB引擎使用145G存储(仅数据),X-Engine使用71G存储(仅数据),存储使用率仅为InnoDB的48%。见图3。

图3


3.3 性能测试

此次测试,选取只读、只插入、混合读写的场景(一般归档库很少使用更新和删除操作),

其中threads在不同场景下值均为1000,该线程使不同场景下,服务端数据库实例的CPU使用率都接近100%。其他tables、table_size等参数均保持一致,详细测试命令见下文。


3.3.1只读场景

#Xengine & InnoDB runsysbench /usr/share/sysbench/oltp_read_only.lua \--mysql-host= \--mysql-user= \--mysql-password= \--mysql-port= \--time=600 \--mysql-db=test_hj_01 \--threads=1000 \--tables=30 \--table_size=10000000 \--rand-type=uniform \--report-interval=10 \run

测试结果见图4:

图4


3.3.2只插入场景

#Xengine & InnoDB runsysbench /usr/share/sysbench/oltp_insert.lua \--mysql-host= \--mysql-user= \--mysql-password= \--mysql-port= \--time=600 \--mysql-db=test_hj_01 \--threads=1000 \--tables=30 \--table_size=10000000 \--rand-type=uniform \--report-interval=10 \run

测试结果见图5:

图5


3.3.3读写混合场景

#Xengine & InnoDB runsysbench /usr/share/sysbench/oltp_read_write.lua \--mysql-host= \--mysql-user= \--mysql-password= \--mysql-port= \--time=600 \--mysql-db=test_hj_01 \--threads=1000 \--tables=30 \--table_size=10000000 \--rand-type=uniform \--report-interval=10 \run

测试结果见图6:

图6


4、分析总结

通过以上数据,发现阿里云 RDS MySQL X-Engine相对于MySQL InnoDB引擎,提高了大约一倍的数据存储能力,同时有20%左右的写入性能提升,只读和读写混合场景性能略差,同时完全兼容MySQL数据。这些特性,对一些以MySQL数据库为重度用户的企业,在面对海量数据存储和使用时,阿里云 RDS MySQL X-Engine是一个不错的选择。


另外,阿里云的PolarDB也支持X-Engine,也有高压缩率、更大存储、更强的性能表现、完全兼容MySQL的特点,PolarDB X-Engine将在未来的文章介绍。


5、参考

  • 自研内核AliSQL @阿里云数据库文档

  • Sysbench使用介绍 @Sysbench Github Documentation


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存