X-Engine的性能与InnoDB相似,但是存储成本远低于InnoDB,因此拥有极高的性价比。
背景信息
RDS MySQL提供阿里云自研存储引擎X-Engine,相比InnoDB,X-Engine在磁盘空间占用和数据库整体成本上有比较明显的优势,X-Engine使用了层次化的存储结构,并结合ZSTD压缩算法实现了更高的数据压缩率。下文将详细对比X-Engine、InnoDB、TokuDB的存储开销和性能。
测试环境
用于测试的RDS实例规格为rds.mysql.s3.large(4核CPU、8 GB内存),存储空间为2 TB。
X-Engine存储成本约为InnoDB一半
上图为分别使用InnoDB和X-Engine存储引擎时的磁盘空间使用情况。
两种存储引擎均使用默认配置,使用SysBench的默认表结构,每张表包含1千万条记录,表总数从32张逐渐增长到736张。实测数据显示,随着数据量的逐渐增长,X-Engine的空间占用的增长更慢,节省的空间越多,最多时仅为InnoDB的58%。对于单条记录长度更长的场景,X-Engine有更大的存储空间优势。例如淘宝图片空间库从InnoDB迁移到X-Engine后,存储空间仅为InnoDB的14%。
由于绝大部分的InnoDB业务场景中未使用数据压缩,如果开启压缩,InnoDB的存储空间会压缩为之前的67%左右,且查询性能会大幅下降,严重影响业务,以主键更新为例,其吞吐性能仅为压缩前的10%。相比开启压缩后性能过低的InnoDB,X-Engine是一个兼顾存储成本和性能的高性价比存储引擎。
Sysbench测试命令:
#InnoDB prepare数据库
sysbench /usr/share/sysbench/oltp_update_index.lua\
--mysql-host=[RDS实例连接串]\
--mysql-user=sbtest\
--mysql-password=sbtest\
--mysql-db=sbtest\
--threads=32\
--tables=[32-736]\
--table_size=10000000\
--mysql-storage_engine=INNODB\
prepare
#X-Engine prepare数据库
sysbench /usr/share/sysbench/oltp_update_index.lua\
--mysql-host=[RDS实例连接串]\
--mysql-user=sbtest\
--mysql-password=sbtest\
--mysql-db=sbtest\
--threads=32\
--tables=[32-736]\
--table_size=10000000\
--mysql-storage_engine=XENGINE\
prepare
X-Engine存储开销比TokuDB更低
TokuDB曾经也是提供低存储开销的数据库引擎,但其开发者Percona已经停止TokuDB的维护,而且X-Engine与TokuDB相比拥有更低的存储开销,所以阿里云建议将TokuDB引擎的数据库迁移至X-Engine引擎。
TokuDB采用分形树(Fractal Tree),较InnoDB使用的B+tree而言拥有更多充满数据的叶子节点及相应的数据块,能够实现比InnoDB更高的压缩率。但TokuDB没有X-Engine的分层存储设计,而X-Engine同样拥有充满记录的数据块这一优势,结合其它空间优化,X-Engine实现了比TokuDB更低的存储开销。
上图为分别使用TokuDB和X-Engine存储引擎时的磁盘空间使用情况。
实例中创建32张表,每张表1亿条记录,最终TokuDB和X-Engine分别占用411 GB和400 GB磁盘空间,由此可见X-Engine可以替代TokuDB,满足您的低成本存储需求。
Sysbench测试命令:
#TokuDB prepare数据库
sysbench /usr/share/sysbench/oltp_update_index.lua\
--mysql-host=[RDS实例连接串]\
--mysql-user=sbtest\
--mysql-password=sbtest\
--mysql-db=sbtest\
--threads=32\
--tables=[32-736]\
--table_size=1000000000\
--mysql-storage_engine=TokuDB\
prepare
#X-Engine prepare数据库
sysbench /usr/share/sysbench/oltp_update_index.lua\
--mysql-host=[RDS实例连接串]\
--mysql-user=sbtest\
--mysql-password=sbtest\
--mysql-db=sbtest\
--threads=32\
--tables=[32-736]\
--table_size=1000000000\
--mysql-storage_engine=XENGINE\
prepare
X-Engine分层存储和分层访问提高QPS
X-Engine可以保证在不影响热数据查询性能的情况下,降低冷数据占用的空间,以实现降低总存储成本。主要原因如下:
- 采用层次化的存储结构,将热数据与冷数据分别存放在不同的层次中,并默认对冷数据所在层次进行压缩。
- 对每一条记录都使用了前缀编码等减少存储开销的技术。
- 采用分层访问,结合真实业务场景中广泛存在的局部性和数据访问倾斜现象(热数据量往往远小于冷数据量),提高QPS。
上图为X-Engine处理有倾斜特征的数据访问时点查询的性能情况。
这项测试使用了业界常用的齐夫分布来控制数据访问的倾斜程度,当倾斜程度(Zipf factor)较高时,更多的点查询会命中缓存中的热数据,而不是磁盘中的冷数据,所以访问延迟更低,整体QPS性能更高,此时压缩冷数据对QPS的影响很小。
简而言之,X-Engine分层存储、分层访问的方式使得业务中绝大部分访问热数据的SQL可以不受冷数据的影响,QPS比均匀访问所有数据高2.7倍。
Sysbench测试命令:
sysbench /usr/share/sysbench/oltp_point_select.lua\
--mysql-host=[RDS实例连接串]\
--mysql-user=sbtest\
--mysql-password=sbtest\
--time=3600\
--mysql-db=sbtest\
--tables=32\
--threads=512\
--table_size=10000000\
--rand-type=zipfian\
--rand-zipfian-exp=[0-1]\
--report-interval=1\
run
X-Engine查询存量数据性能与InnoDB基本持平
如果将大量存量数据(尤其是归档和历史类数据)存入X-Engine,查询存量数据时X-Engine的性能(QPS或TPS)整体略低于InnoDB。
上图为各种场景分别使用InnoDB和X-Engine存储引擎时的性能对比,通过对比可以发现X-Engine与InnoDB性能相近。
在大多数的OLTP事务型负载中,更新(oltp_update_index、oltp_write_only)和点查(oltp_point_select)的执行频率较高,X-Engine在这两项上的性能与InnoDB基本持平。
由于X-Engine的分层存储特性,X-Engine在执行范围扫描时或检查一条记录是否唯一时,需要扫描或访问多个层次,所以X-Engine的范围查询(oltp_read_only)和新记录插入(oltp_insert)性能比InnoDB略差。
在混合场景(oltp_read_write),X-Engine与InnoDB性能基本持平。
Sysbench测试命令:
#以oltp_read_only为例
sysbench /usr/share/sysbench/oltp_read_only.lua\
--mysql-host=[RDS实例连接串]\
--mysql-user=sbtest\
--mysql-password=sbtest\
--mysql-db=sbtest\
--time=3600\
--tables=32\
--threads=512\
--table_size=10000000\
--rand-type=uniform\
--report-interval=1\
run
总结
X-Engine是一款性能与InnoDB相似,但是存储成本非常低的RDS MySQL存储引擎产品。目前,X-Engine已经服务于阿里云上承载的钉钉历史库、淘宝图片信息库、淘宝交易历史库等多项阿里巴巴集团核心业务,不仅降低了存储成本,还能保证性能满足业务需求。关于X-Engine的详细介绍请参见X-Engine简介。
使用X-Engine
- 如果您是新用户,想使用X-Engine,请在购买RDS MySQL实例时选择X-Engine作为默认引擎,详情请参见创建RDS MySQL实例。
- 如果您已经在使用RDS MySQL实例,想转换为X-Engine,请参见InnoDB/TokuDB/Myrocks引擎转换为X-Engine引擎。