暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

初探MariaDB on Arm + S3后端

计算魔方 2021-06-28
675

MariaDB除了默认的InnoDB存储引擎以外,还支持许多其它存储引擎,这些引擎都有各自合适的应用场景。MariaDB本身在Arm64平台上的使用我们已经介绍过很多了,从这篇文章开始,我们开始关注一下这些非默认的存储引擎在arm64平台上的表现。

我们第一个研究的存储引擎是S3。S3存储引擎是在MariaDB 10.5版本才引进的一个新功能。S3存储引擎的功能是把数据存储在支持S3协议的云存储上,当前存储在上面的表只能读,不能写。使用时,可以通过改变表的存储引擎的方式,把数据传到S3上面去,也可以对S3存储引擎的表进行增加列和删除列,也可以建立索引,但是不能直接对表增删改(后续版本可能会有这些功能)。看到这里读者应该会有疑问,S3存储引擎有啥用?其实在对一些不再更新的数据,但是数据量又比较大,而且数据比较重要,又不能删除的场景比较有用,这时候就可以把这些表的存储引擎改为S3,例如不常更新的历史数据存储的场景。因为S3存储引擎相对于本地存储比较便宜,而且可靠,是一个很好的选择。

下面我们就简单的从几个方面看一下S3存储引擎在Arm64平台上的表现

Arm平台功能验证

首先我们先跑一下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最新版本的源码,并编译

su - mariadb
sudo apt-get install build-essential libncurses5-dev gnutls-dev libcurl4-gnutls-dev 
sudo apt-get install zlib1g-dev ccache libnuma-dev libxml2-dev cmake bison
git clone https://github.com/mariadb/server
cd server
git submodule update --init
cd ..
mkdir build-mariadb-server
cd build-mariadb-server
#加入RelWithDebInfo选项,是为了后续如果需要进行对性能分析的话,可以用perf工具看到代码
cmake ../server -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build .


测试用例

编辑测试用例需要的配置文件:

vi ~/server/mysql-test/suite/s3/my.cnf

最终配置格式如下:

!include include/default_mysqld.cnf
!include include/default_client.cnf

[mysqld.1]
#当前S3存储引擎在10.6版本的成熟度是gamma,还不是stable,没有默认被加载,需要手动配置一下
plugin-maturity = gamma
plugin-load-add=@ENV.HA_S3_SO
s3=ON
s3-host-name=obs.cn-north-4.myhuaweicloud.com
#之前在OBS上创建的桶的名字
s3-bucket=mariadb
s3-access-key=please replace with your access key
s3-secret-key=please replace with your secret key
#OBS区域
s3-region=cn-north-4

编辑如下配置文件:

vi ~/server/mysql-test/suite/s3/slave.cnf

最终配置如下:

[mysqld.2]
plugin-maturity = gamma
plugin-load-add=@ENV.HA_S3_SO
s3=ON
s3-slave-ignore-updates=1
s3-host-name=obs.cn-north-4.myhuaweicloud.com
s3-bucket=mariadb
s3-access-key=please replace with your access key
s3-secret-key=please replace with your secret key
s3-region=cn-north-4

执行测试用例:

cd ~/build-mariadb-server/mysql-test
./mysql-test-run --suite=s3

输出如下:

 1Logging: /home/mariadb/server/mysql-test/mysql-test-run.pl  --suite=s3
2vardir: /home/mariadb/build-mariadb-server/mysql-test/var
3Checking leftover processes...
4Removing old var directory...
5Creating var directory '/home/mariadb/build-mariadb-server/mysql-test/var'...
6Checking supported features...
7MariaDB Version 10.6.0-MariaDB
8
9 - SSL connections supported
10   Using suites: s3
11   Collecting tests...
12   Installing system database...
13
14==============================================================================
15
16TEST                                      RESULT   TIME (ms) or COMMENT
17--------------------------------------------------------------------------
18
19worker[1] Using MTR_BUILD_THREAD 300with reserved ports 16000..16019
20s3.partition_create_fail                 [ skipped ]  Requires debug build
21s3.encryption                            [ pass ]    777
22s3.partition_move 'innodb'               [ pass ]   4059
23s3.alter 'innodb'                        [ pass ]   5361
24s3.innodb 'innodb'                       [ pass ]   1444
25s3.alter2                                [ pass ]   1702
26s3.partition                             [ pass ]  24858
27s3.no_s3                                 [ pass ]      7
28s3.arguments                             [ pass ]   1231
29s3.basic                                 [ pass ]    830
30s3.discovery                             [ pass ]   3288
31s3.amazon                                [ skipped ]  Not connected to AWS
32s3.backup                                [ pass ]    581
33s3.mysqldump                             [ pass ]   3156
34s3.select                                [ pass ]    600
35s3.unsupported                           [ pass ]    329
36s3.replication_delayed 'innodb,mix'      [ pass ]   3444
37s3.replication_mixed 'mix'               [ pass ]   8435
38s3.replication_partition 'innodb,mix'    [ pass ]  20100
39
40s3.replication_stmt 'stmt'               [ pass ]   8967
41--------------------------------------------------------------------------
42
43The servers were restarted 10 times
44Spent 89.169 of 107 seconds executing testcases
45
46Completed: All 18 tests were successful.
47
482 tests were skipped, 1 by the test itself.


可以看到,除了一个测试用例需要debug版本来测,另外一个需要连接AWS(我们用的是华为云)来测,被skip了以外,其余测试用例全部都是成功的。说明在arm64平台上,S3存储引擎的基本功能是没问题的。

S3后端使用方法

接下来我们看看S3后端的使用方式以及性能方面的情况。编辑配置文件mariadb.cnf, 按如下格式输入内容:

 1[mariadbd]
2#数据文件目录
3datadir = /home/mariadb/data/dir
4#path to source dir + sql/share
5lc_messages_dir = /home/mariadb/server/sql/share
6
7innodb_buffer_pool_size = 8G
8innodb_log_file_size = 1G
9innodb_flush_method = O_DIRECT
10
11plugin-maturity = gamma
12plugin_dir = /home/mariadb/build-mariadb-server/storage/maria
13plugin-load-add=ha_s3
14s3=ON
15s3-host-name=obs.cn-north-4.myhuaweicloud.com
16s3-bucket=mariadb
17s3-access-key=please replace with your access key 
18s3-secret-key=please replace with your secret key
19s3-region=cn-north-4

启动数据库:

mkdir -p /home/mariadb/data/dir
cd ~/build-mariadb-server
./scripts/mysql_install_db --srcdir=../server --defaults-file=~/mariadb.cnf
sql/mysqld --defaults-file=~/mariadb.cnf

数据库启动成功以后,我们创建一些测试数据,新启动一个shell窗口,登陆到mariadb用户,登陆数据库并创建一个测试表:

create table test.s3test(id int, description varchar(40));

然后退出到shell环境,准备给这个表导入大量的数据。用shell脚本生成了一个大小为2.6G的csv文件,大概6000多万条记录,里面第一列为数字,第二列为随机生成的字符串,命名为s3test.csv,
用如下命令导入数据库:

mysqlimport --socket=/tmp/mysql.sock --fields-terminated-by=, test /home/mariadb/s3test.csv

导入数据库以后,查看数据库文件 /home/mariadb/data/dir/test/s3test.ibd
,数据库文件的大小为4.4G。

接下来我们测试一下,将这个4.4G大小的表,存储到S3存储引擎,时间需要多久。登陆到数据库,执行如下sql:

alter table test.s3test engine=s3;

输出如下:

Query OK, 63649280 rows affected (2 min 49.886 sec)
Records: 63649280  Duplicates: 0  Warnings: 0

可以看到4.4G大小的表,存储引擎改为S3,只用了两分钟49秒,速度还是挺快的。我们再看本地的数据文件/home/mariadb/data/dir/test/s3test.ibd
已经不存在了,说明表的确已经被存到了云存储上面。然后我们查看一下OBS上面的文件。

下载一个obsutil工具,并查询一下OBS上的数据:

./obsutil ls obs://mariadb/test/s3test/

大小为3.22GB, 比innodb的存储还要小一点。

Total size of prefix [test/s3test/] is3.22GB
Folder number is0
File number is826

接下来我们查询一下数据,看看速度怎么样,登陆mariadb数据库,输入如下sql:

select * from test.s3test where id = 8;

输出除了结果以外,显示用的时间如下:

512 rows in set (1 min 17.121 sec)

从6000多万条无索引的记录里,查询512条记录,大概用了1分钟17秒,速度还是可以接受的。接下来我们看看建索引的速度,以及建索引后查询的速度。

MariaDB [(none)]alter table test.s3test add index idx_id(id);
Query OK, 63649280 rows affected (7 min 12.253 sec)
Records: 63649280  Duplicates: 0  Warnings: 0

可以看到创建索引用了7分钟。我们重新查询一下:

MariaDB [(none)]> pager md5sum; select * from test.s3test where id = 8;
46ebf3c834a4023edec7fe311f50438d  -
512 rows in set (25.146 sec)

可以看到这次速度快了一点,25秒。我们看看索引占用的大小:

Total size of prefix [test/s3test/] is3.81GB
Folder number is0
File number is979

输出的大小为3.81GB,比不建索引多了600M,说明索引占用了600M左右。

S3 vs InnoDB

现在表在本地数据库,存储引擎是InnoDB,我们把以上操作重新来一遍,对比一下InnoDB引擎和S3引擎的性能。

 1MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
2PAGER set to 'md5sum'
346ebf3c834a4023edec7fe311f50438d  -
4512 rows in set (30.218 sec)
5
6MariaDB [(none)]> alter table test.s3test add index idx_id(id)
;
7Query OK, 0 rows affected (2 min 1.309 sec)
8Records: 0  Duplicates: 0  Warnings: 0
9
10MariaDB [(none)]> pager md5sum
;select * from test.s3test where id = 8;
11PAGER set to 'md5sum'
1246ebf3c834a4023edec7fe311f50438d  -
13512 rows in set (0.009 sec)
14
15MariaDB [(none)]> alter table test.s3test drop index idx_id
;
16Query OK, 0 rows affected (0.009 sec)
17Records: 0  Duplicates: 0  Warnings: 0
18


可以看出来,本地InnoDB引擎还是比S3要快不少,除了索引查询和删除索引操作外,无索引查询和创建索引两个操作并没有数量级上的差异,S3的速度还是可以接受的。

增大S3 Page Buffer

我们把S3存储引擎的Buffer改大,看看性能有没有改善。在mariadb.cnf中添加如下配置,将s3的page buffer的大小设置为5个G(默认是128M):


s3_pagecache_buffer_size=5368709120

重启数据库,并重复上文介绍过的查询操作:

 1MariaDB [(none)]> alter table test.s3test engine=s3;
2Query OK, 63649280 rows affected (5 min 8.340 sec)
3Records: 63649280  Duplicates: 0  Warnings: 0
4
5MariaDB [(none)]> pager md5sum
;select * from test.s3test where id = 8;
6PAGER set to 'md5sum'
746ebf3c834a4023edec7fe311f50438d  -
8512 rows in set (39.110 sec)
9
10MariaDB [(none)]> pager md5sum
;select * from test.s3test where id = 8;
11PAGER set to 'md5sum'
1246ebf3c834a4023edec7fe311f50438d  -
13512 rows in set (10.019 sec)
14
15MariaDB [(none)]> alter table test.s3test add index idx_id(id)
;
16Query OK, 63649280 rows affected (5 min 45.067 sec)
17Records: 63649280  Duplicates: 0  Warnings: 0
18
19MariaDB [(none)]> pager md5sum
;select * from test.s3test where id = 8;
20PAGER set to 'md5sum'
2146ebf3c834a4023edec7fe311f50438d  -
22512 rows in set (17.479 sec)
23
24MariaDB [(none)]> pager md5sum
;select * from test.s3test where id = 8;
25PAGER set to 'md5sum'
2646ebf3c834a4023edec7fe311f50438d  -
27512 rows in set (0.015 sec)
28
29MariaDB [(none)]> alter table test.s3test drop index idx_id
;
30Query OK, 63649280 rows affected (4 min 46.552 sec)
31Records: 63649280  Duplicates: 0  Warnings: 0
32
33MariaDB [(none)]> alter table test.s3test engine
=innodb;
34Query OK, 63649280 rows affected (6 min 28.248 sec)
35Records: 63649280  Duplicates: 0  Warnings: 0
36


可以看到改变引擎,创建删除索引等操作并没有实质上的提升,但是查询数据,特别是第二遍以后的查询数据,速度有数量级上的提升,主要应该归功于大的Buffer对数据的缓存。

压缩

接下来我们测试一下创建表的时候,加上压缩参数 COMPRESSION_ALGORITHM=zlib
,看看效果如何。

1MariaDB [(none)]> alter table test.s3test engine=s3  COMPRESSION_ALGORITHM=zlib;
2Query OK, 63649280 rows affected (6 min 21.659 sec)
3Records: 63649280  Duplicates: 0  Warnings: 0

时间用了6分多钟,比不压缩长了一倍多一点。我们看下空间能节省多少。

1Total size of prefix [test/s3test/] is1.51GB
2Folder number is0
3File number is826

可以看到空间节省了一半以上。不过我们的数据是随机的,如果是现实中有规律的数据,估计能有更高的压缩率。另外我们用了默认大小的4MB的块,如果把块的大小改大点,估计压缩率也会有提升。我们看看查询速度怎么样:

1MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
2PAGER set to 'md5sum'
346ebf3c834a4023edec7fe311f50438d  -
4512 rows in set (56.610 sec)
5
6MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
7PAGER set to 'md5sum'
846ebf3c834a4023edec7fe311f50438d  -
9512 rows in set (10.110 sec)

可以看到首次查询,比没有压缩时慢了不到一倍,还是可以接受的,第二次查询,由于大的缓存的存在,压缩和没压缩的速度都是一样的。再看看建立索引的情况:

1MariaDB [(none)]alter table test.s3test add index idx_id(id);
2Query OK, 63649280 rows affected (9 min 26.030 sec)
3Records: 63649280  Duplicates: 0  Warnings: 0

耗时了9分钟,也是慢了不到一倍。看看索引占用的空间:

1Total size of prefix [test/s3test/indexis261.54MB
2Folder number is0
3File number is153


最后,我们看看查询的耗时:

1MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
2PAGER set to 'md5sum'
346ebf3c834a4023edec7fe311f50438d  -
4512 rows in set (27.094 sec)
5
6MariaDB [(none)]> pager md5sum;select * from test.s3test where id = 8;
7PAGER set to 'md5sum'
846ebf3c834a4023edec7fe311f50438d  -
9512 rows in set (0.009 sec)


第一次查询和没压缩时相比,慢了不到一倍,第二次查询由于大的缓存的存在,就和没压缩时一样了。


总结

通过我们的测试,可以发现,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












文章转载自计算魔方,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论