阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

栏目: IT技术 · 发布时间: 5年前

内容简介:其实是测试半遂体验。这阵子对OLAP数据库产生了兴趣,先是简单测试了ClickHouse,性能的确不错,不过它在稳定&可靠性,整体生态&周边配套方面还有待加强,我会持续保持关注。3月27日,腾讯云推送的文章

其实是测试半遂体验。

这阵子对OLAP数据库产生了兴趣,先是简单测试了ClickHouse,性能的确不错,不过它在稳定&可靠性,整体生态&周边配套方面还有待加强,我会持续保持关注。

3月27日,腾讯云推送的文章 TXSQL(TencentDB for MySQL) 8.0特性介绍 中提到即将推出 基于 MySQL 框架的列存引擎CSTORE ,看了下架构图,和以前红极一时的 infobright 有点神似。

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

不过现在还没上线,还不能开始内测,只能看看了。

转过身看看阿里云,发现有 分析型数据库MySQL版 (AnalyticDB,简称ADB) 以及 云数据库ClickHouse 可选。

ADB的产品介绍可以看官方文档 什么是分析型数据库MySQL版,我抓取了其中几个关键技术信息:

  • 云端PB级高并发实时数据仓库。

  • 采用关系模型的行列混存技术。

  • 自动索引,智能优化器。

  • 高度兼容MySQL和 SQL 2003语法。

  • 可对RDS直接创建一个分析实例,构建ADB,并利用DTS实现数据同步。

看着很牛逼,有木有,那就测测呗。

1. 新建RDS实例和ADB实例

我选择的RDS实例对标之前用于测试ClickHouse的规则

  • 4CPU

  • 16G内存

  • 500G存储

选择ADB实例时,系统会根据RDS中的数据量,只显示符合条件的规格,我这里选择的是 3.0版本、T16型号、存储空间 600G。

2. 导入测试数据

老样子,用ClickHouse官网提到的dbgen工具生成测试数据,生成数据时选择 -s 100   参数。

然后在RDS实例中分别导入到几个测试表。

MySQL [testabc]> load data local infile '/data/ssb-dbgen/customer.tbl' 
into table customer fields terminated by '\t';

提醒:ClickHouse官网提供的建表DDL需要自己微调下,改成适用于MySQL的语法和数据类型。

3. 创建数据同步DTS任务

DTS的工作机制类似 pt-table-sync ,需要每个表都要指定一个主键,这就让我很不开心了。

生成的测试表中, 是在其他表都导完数据后,再用 CREATE...SELECT 创建的。

几个测试表的总数据量是604,637,902(6亿),创建完DTS同步任务后,经过22.5小时候,同步的数据量约为325,174,022条,完成率53.78%,折算下来每秒约3990条记录,这个速度如果是OLTP数据库也还算可以,但放在海量数据的OLAP场景下,可就有点慢了。

对了,我选择的是 medium 规则,号称最高同步性能 5000 records/s

DTS启动、停止

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

同步进度

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

由于测试经费预算有限,我只能放弃全量数据同步,有多少算多少吧。

接下来的事情可就有点头疼了。

上面说了,lineorder _flat表是 CREATE...SELECT 创建的,而这个语法在ADB中是不支持的(产品页面上宣称全面支持MySQL语法,产品经理果然很会画大饼啊,哈哈)。

好嘛,我退而求其次,改成  在RDS中先创建一个空表,让DTS把表结构同步过去,再在ADB中用INSERT...SELECT写数据

由于 lineorder _flat 原表是没有主键的,我需要新建一个自增INT做主键,否则DTS配置阶段是过不去的,无论我选择分区表还是维度表,都必须指定主键列。

分区表模式下:

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

维度表模式下:

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

好了,变通之后表结构是同步过去了,可是在ADB上执行 INSERT...SELECT 时,弹出下面的错误提醒:

INSERT INTO lineorder_flat SELECT ... FROM lineorder AS l INNER JOIN customer AS c ON c.C_CUSTKEY = l.LO_CUSTKEY INNER JOIN supplier AS s ON s.S_SUPPKEY = l.LO_SUPPKEY INNER JOIN part AS p ON p.P_PARTKEY = l.LO_PARTKEY limit 1;

失败原因:[40040, 2020040414153117201906308103453294111] Query execution error: : Insert query has mismatched column types. The 1 column has mismatched types. Table: bigint. Query: decimal(20,0).

而上面这条SQL,如果 把所有列读取出来,再手动构造成INSERT写入,则不会报错 ,这就尴尬了,搞不懂具体是错在哪里。

不得已,只能回到RDS实例上,硬着头皮对其他几个表都先加上主键和必要,再生成测试数据了。

在RDS主库上往lineorder_flat表中写入1000万条数据,等到DTS同步完成后,再在ADB上跑测试SQL。

4. 执行测试SQL

下面是几个测试SQL执行耗时、返回数据,和ClickHouse运行结果的对比(提醒: CH的数据量是6亿,ADB的数据量是1000万,相差60倍 )。

SQL ADB(毫秒)/返回数量 CH(秒)/返回数量 CH扫描数量(10万)
Q1.1 33/0 2.141/1 91.01
Q1.2 33/0 0.320/1 7.75
Q1.3 31/0 0.053/1 1.81
Q2.1 271/100 17.979/280 600.04
Q2.2 385/56 3.625/56 600.04
Q2.3 99/7 3.263/7 600.04
Q3.1 383/100 6.906/150 546.67
Q3.2 130/100 5.330/600 546.67
Q3.3 96/24 3.666/24 546.67
Q3.4 65/2 0.058/4 7.76
Q4.1 304/35 10.110/35 600.04
Q4.2 519/100 1.928/100 144.42
Q4.3 67/772 1.373/800 144.42

在ADB中没办法看到每次扫描了多少条数据,因此少了这项数据。

看起来性能还算可以,就是不知道如果数据量一样的话,结果又会如何。

这次的测试就先到这里吧,以后有机会再继续。

本次测试得到了DTS产品经理的帮助,感谢。

最后,说几个 槽点 吧。

1. DTS任务出现了重复的作业ID

按理说,这个任务ID应该是唯一的吧?

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

在原来的那个任务上,停止任务后,多点几次"重新配置同步",就会出现重复的ID了。

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

2. 无主键的表同步数据时,会自动删除重复数据

创建测试表,插入3条测试数据,其中有2条是重复的。

# 创建一个没有主键的测试表
[testabc]> CREATE TABLE t1 (
id int(11
) DEFAULT NULL,
c1 varchar(20) DEFAULT NULL
) ENGINE
=InnoDB DEFAULT CHARSET=utf8;

[testabc]> insert into t1 select 1,'c1';
[testabc]> insert into t1 select 2,'c2';
[testabc]> insert into t1 select 2,'c2'; -- 重复数据
[testabc]> select * from t1;
+------+------+
| id | c1 |
+------+------+
| 1 | c1 |
| 2 | c2 |
| 2 | c2 | -- 重复数据
+------+------+

配置DTS同步任务,选择id列作为主键。

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

DTS任务报告共有3条数据,同步时没任何重复(冲突)的报错(提醒)。

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

但是在ADB库,则只能查到两条数据。

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

记得RDS有个特性就是可以帮客户自动隐式创建内置主键(如果用户表没显式定义主键的话),这时候就应该用于DTS呀,白瞎了这功能。

3. 删数据太慢测试删除500万数据,期间几次观测计算,每秒删除数据量约 2673 条。跑了几百秒之后,删了200万数据,忍不住了,终止删除任务。

4. 看似简单的SQL语法也不支持

有几个测试SQL中,有用到AS别名列语法,但发现并不支持,例如下面这个:

SELECT
sum(LO_REVENUE),
Year(LO_ORDERDATE) AS year,
P_BRAND
FROM lineorder_flat
WHERE P_BRAND >= 'MFGR#2221' AND P_BRAND <= 'MFGR#2228' AND S_REGION = 'ASIA'
GROUP BY
year,
P_BRAND
ORDER BY
year,
P_BRAND;

运行时并不会报错,但下面这个SQL就会报错了

SELECT
C_CITY,
S_CITY,
Year(LO_ORDERDATE) AS year,
sum(LO_REVENUE) AS revenue
FROM lineorder_flat
WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5')
GROUP BY
C_CITY,
S_CITY,
year
ORDER BY
year ASC,
revenue DESC;

报错内容见下

失败原因:

[20038, 2020040418065317201906308103453830416] : line 0:1: Column 'year' cannot be resolved

看起来 在WHERE条件中,不能用到别名列,但在GROUP BY和ORDER BY可以 ,略诡异。

5. 基本功能异常

在ADB的集群信息,点"管理DTS任务"链接,新打开页面异常。

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

或者,在日常刷新页面时,弹出这个提醒

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

全文完。

由叶老师主讲的知数堂「MySQL优化课」第17期已发车,课程从第15期就升级成MySQL 8.0版本了,现在上车刚刚好,扫码开启MySQL 8.0的修行之旅吧。

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

另外,叶老师在腾讯课堂的短课程《 MySQL性能优化 》已开课,本课程讲解读几个MySQL性能优化的核心要素: 合理利用索引,降低锁影响,提高事务并发度

下面是报名小程序码

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

晴澜茶坊

主营安溪 铁观音、闽南乌龙,做人人喝得起的好茶。

点击小程序选购

满1斤送还优质羊脂玉瓷茶具+茶巾

点“在看”给我一朵小黄花

阿里云分析型数据库MySQL版(AnalyticDB)测试初体验


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

A Philosophy of Software Design

A Philosophy of Software Design

John Ousterhout / Yaknyam Press / 2018-4-6 / GBP 14.21

This book addresses the topic of software design: how to decompose complex software systems into modules (such as classes and methods) that can be implemented relatively independently. The book first ......一起来看看 《A Philosophy of Software Design》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试