MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
PAGER set to 'md5sum'
46ebf3c834a4023edec7fe311f50438d -
512 rows in set (30.218 sec)
MariaDB [(none)]> alter table test.s3test add index idx_id(id);
Query OK, 0 rows affected (2 min 1.309 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
PAGER set to 'md5sum'
46ebf3c834a4023edec7fe311f50438d -
512 rows in set (0.009 sec)
MariaDB [(none)]> alter table test.s3test drop index idx_id;
Query OK, 0 rows affected (0.009 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [(none)]> alter table test.s3test engine=s3;
Query OK, 63649280 rows affected (5 min 8.340 sec)
Records: 63649280 Duplicates: 0 Warnings: 0
MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
PAGER set to 'md5sum'
46ebf3c834a4023edec7fe311f50438d -
512 rows in set (39.110 sec)
MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
PAGER set to 'md5sum'
46ebf3c834a4023edec7fe311f50438d -
512 rows in set (10.019 sec)
MariaDB [(none)]> alter table test.s3test add index idx_id(id);
Query OK, 63649280 rows affected (5 min 45.067 sec)
Records: 63649280 Duplicates: 0 Warnings: 0
MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
PAGER set to 'md5sum'
46ebf3c834a4023edec7fe311f50438d -
512 rows in set (17.479 sec)
MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
PAGER set to 'md5sum'
46ebf3c834a4023edec7fe311f50438d -
512 rows in set (0.015 sec)
MariaDB [(none)]> alter table test.s3test drop index idx_id;
Query OK, 63649280 rows affected (4 min 46.552 sec)
Records: 63649280 Duplicates: 0 Warnings: 0
MariaDB [(none)]> alter table test.s3test engine=innodb;
Query OK, 63649280 rows affected (6 min 28.248 sec)
Records: 63649280 Duplicates: 0 Warnings: 0
MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
PAGER set to 'md5sum'
46ebf3c834a4023edec7fe311f50438d -
512 rows in set (56.610 sec)
MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
PAGER set to 'md5sum'
46ebf3c834a4023edec7fe311f50438d -
512 rows in set (10.110 sec)
MariaDB [(none)]> alter table test.s3test add index idx_id(id);
Query OK, 63649280 rows affected (9 min 26.030 sec)
Records: 63649280 Duplicates: 0 Warnings: 0
耗时了9分钟,也是慢了不到一倍。
看看索引占用的空间:
./obsutil ls obs://mariadb/test/s3test/index
Total size of prefix [test/s3test/index] is: 261.54MB
Folder number is: 0
File number is: 153
可以看到启用压缩以后,索引也变小了不少,比不压缩时的一半还要小一点。
再看看查询的情况:
MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
PAGER set to 'md5sum'
46ebf3c834a4023edec7fe311f50438d -
512 rows in set (27.094 sec)
MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
PAGER set to 'md5sum'
46ebf3c834a4023edec7fe311f50438d -
512 rows in set (0.009 sec)
第一次查询和没压缩时相比,慢了不到一倍,第二次查询由于大的缓存的存在,就和没压缩时一样了。
最后看看删除索引和将引擎改回InnoDB的耗时:
MariaDB [(none)]> alter table test.s3test drop index idx_id;
Query OK, 63649280 rows affected (6 min 39.382 sec)
Records: 63649280 Duplicates: 0 Warnings: 0
MariaDB [(none)]> alter table test.s3test engine=innodb;
Query OK, 63649280 rows affected (6 min 36.595 sec)
Records: 63649280 Duplicates: 0 Warnings: 0
删除索引慢了不到一倍,改变引擎和没有压缩时耗时一样。
总结
通过我们的测试,可以发现,S3存储引擎在arm64上工作良好,性能也不错。
我们把上面测试的结果通过一个表格总结一下:
/
InnoDB
S3 with default options
S3 after setting pagecache buffer size to 5G
S3 after compression enabled and page buffer size 5G
作者: zhaorenhai
MariaDB除了默认的InnoDB存储引擎以外,还有很多其他的存储引擎,这些引擎在某些方面也是比较有用的。从这篇文章开始,我们开始关注一下这些非默认的存储引擎在arm64平台上的表现。
我们第一个研究的存储引擎是S3。 S3存储引擎是在10.5版本才引进的一个新功能。S3存储引擎其实就把数据存储在支持S3协议的云存储上。当前存储在上面的表只能读,不能写。可以通过改变表的存储引擎的方式,把数据传到S3上面去,也可以对S3存储引擎的表进行增加列和删除列,也可以建立索引,但是就是不能直接对表增删改(后续版本可能会有这些功能)。看到这里读者应该会有疑问,S3存储引擎有啥用?其实在对一些不再更新的数据,但是数据量又比较大,而且数据比较重要,又不能删除的场景比较有用,这时候就可以把这些表的存储引擎改为S3,因为S3存储引擎相对于本地存储比较便宜,而且可靠,是一个很好的选择。
下面我们就简单的从几个方面看一下S3存储引擎在arm64平台上的表现
首先我们先跑一下S3存储引擎的测试用例,看看在arm64平台上是否都能通过(MariaDB当前还没有把S3存储引擎相关的测试用例作为默认必跑的测试用例,这个文档里有提到:https://mariadb.com/kb/en/s3-storage-engine/ ),然后会看看S3存储引擎在arm64上功能和性能方面的情况。
测试平台用的是华为云的鲲鹏虚拟机,OS是Ubuntu18.04。我们S3存储服务用的是华为云的OBS服务,提前创建好访问key和密钥,桶,后续测试时需要配置(注意OBS选择的存储区域最好和测试用的鲲鹏虚拟机在同一个区域,以减少网络延迟。OBS相关指导请参考华为云官方指导,这里不再详述)。
我们在OS上新建一个用户
adduser mariadb
,后续所有的工作都在这个用户下进行。从github上下载一下MariaDB最新版本的源码,并编译
测试用例
编辑测试用例需要的配置文件:
最终配置格式如下:
编辑如下配置文件
最终配置格式如下:
开始跑测试用例
输出如下:
我们可以看到,除了一个测试用例需要debug版本来测,另外一个需要连接AWS(我们用的是华为云)来测,被skip了以外,其余测试用例全部都是成功的。说明在arm64平台上,S3存储引擎的基本功能是没问题的。
性能
接下来我们看看S3性能方面的情况。
首先配置一下mysql客户端路径,我们使用刚刚编译出来的最新mysql客户端,将如下代码加入
~/.bashrc
里然后
编辑配置文件:
按如下格式输入内容:
然后启动数据库:
数据库启动成功以后,我们创建一些测试数据
新启动一个shell窗口,登陆到mariadb用户,登陆数据库
执行如下sql创建一个测试表
然后退出到shell环境,准备给这个表导入大量的数据。
用shell脚本生成了一个大小为2.6G的csv文件,大概6000多万条记录,里面第一列为数字,第二列为随机生成的字符串,命名为
s3test.csv
用如下命令导入数据库:
导入数据库以后,查看数据库文件
/home/mariadb/data/dir/test/s3test.ibd
,数据库文件的大小为4.4G。接下来我们测试一下,将这个4.4G大小的表,存储到S3存储引擎,时间需要多久。
登陆到数据库,执行如下sql
输出如下
可以看到4.4G大小的表,存储引擎改为S3,只用了两分钟49秒,速度还是挺快的。
我们再看本地的数据文件
/home/mariadb/data/dir/test/s3test.ibd
已经不存在了,说明表的确已经被存到了云存储上面。然后我们查看一下OBS上面的文件。
下载一个obsutil工具:
查询一下OBS上的数据
输出的大小如下, 为3.22GB, 比innodb的存储还要小一点:
接下来我们查询一下数据,看看速度怎么样,登陆mariadb数据库,输入如下sql
输出除了结果以外,显示用的时间如下:
从6000多万条无索引的记录里,查询512条记录,大概用了1分钟17秒,速度还是可以接受的。
接下来我们看看建索引的速度,以及建索引后查询的速度。
可以看到创建索引用了7分钟。
重新查询一下
可以看到这次速度快了一点,25秒。
我们看看索引占用的大小
输出的大小为3.81GB,比不建索引多了600M,说明索引占用了600M左右
可以证实一下
输出如下,的确占用600M左右
接下来我们把索引删掉,看看用时多久。
删除索引用了4分钟。
把表的存储引擎改为InnoDB,看看用时多久。
用了6分钟左右。
和InnoDB对比
现在表在本地数据库,存储引擎是InnoDB,我们把以上操作重新来一遍,对比一下InnoDB引擎和S3引擎的性能。
可以看出来,本地InnoDB引擎还是比S3要快不少,除了索引查询和删除索引操作外,无索引查询和创建索引两个操作并没有数量级上的差异,S3的速度还是可以接受的。
增大S3 Page Buffer之后的性能
我们把S3存储引擎的Buffer改大,看看性能有没有改善。
添加如下配置,将s3的page buffer的大小设置为5个G(默认是128M)
重启数据库
现在我们再来重复一遍之前的操作:
可以看到改变引擎,创建删除索引等操作并没有实质上的提升,但是查询数据,特别是第二遍以后的查询数据,速度有数量级上的提升,主要应该归功于大的Buffer对数据的缓存。
启用压缩之后的性能
接下来我们测试一下创建表的时候,加上压缩参数
COMPRESSION_ALGORITHM=zlib
,看看效果如何。时间用了6分多钟,比不压缩长了一倍多一点。我们看下空间能节省多少。
可以看到空间节省了一半以上。不过我们的数据是随机的,如果是现实中有规律的数据,估计能有更高的压缩率。另外我们用了默认大小的4MB的块,如果把块的大小改大点,估计压缩率也会有提升。
我们看看查询速度怎么样:
可以看到首次查询,比没有压缩时慢了不到一倍,还是可以接受的,第二次查询,由于大的缓存的存在,压缩和没压缩的速度都是一样的。
再看看建立索引的情况:
耗时了9分钟,也是慢了不到一倍。
看看索引占用的空间:
可以看到启用压缩以后,索引也变小了不少,比不压缩时的一半还要小一点。
再看看查询的情况:
第一次查询和没压缩时相比,慢了不到一倍,第二次查询由于大的缓存的存在,就和没压缩时一样了。
最后看看删除索引和将引擎改回InnoDB的耗时:
删除索引慢了不到一倍,改变引擎和没有压缩时耗时一样。
总结
通过我们的测试,可以发现,S3存储引擎在arm64上工作良好,性能也不错。
我们把上面测试的结果通过一个表格总结一下:
参考链接
https://mariadb.com/kb/en/s3-storage-engine/
https://mariadb.com/kb/en/plugin-overview/#installing-a-plugin
https://www.percona.com/blog/2020/07/17/mariadb-s3-engine-implementation-and-benchmarking/
https://blog.csdn.net/weixin_39132936/article/details/103260024
https://support.huaweicloud.com/obs/index.html