阿里云分析型数据库MySQL版(AnalyticDB)测试初体验
3月27日,腾讯云推送的文章 TXSQL(TencentDB for MySQL) 8.0特性介绍 中提到即将推出 基于MySQL框架的列存引擎CSTORE,看了下架构图,和以前红极一时的 infobright 有点神似。
不过现在还没上线,还不能开始内测,只能看看了。
转过身看看阿里云,发现有 分析型数据库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 " ";
提醒: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启动、停止
同步进度
由于测试经费预算有限,我只能放弃全量数据同步,有多少算多少吧。
接下来的事情可就有点头疼了。
上面说了,lineorder_flat表是 CREATE...SELECT 创建的,而这个语法在ADB中是不支持的(产品页面上宣称全面支持MySQL语法,产品经理果然很会画大饼啊,哈哈)。
好嘛,我退而求其次,改成 在RDS中先创建一个空表,让DTS把表结构同步过去,再在ADB中用INSERT...SELECT写数据。
由于lineorder_flat原表是没有主键的,我需要新建一个自增INT做主键,否则DTS配置阶段是过不去的,无论我选择分区表还是维度表,都必须指定主键列。
分区表模式下:
维度表模式下:
好了,变通之后表结构是同步过去了,可是在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倍)。
在ADB中没办法看到每次扫描了多少条数据,因此少了这项数据。
看起来性能还算可以,就是不知道如果数据量一样的话,结果又会如何。
这次的测试就先到这里吧,以后有机会再继续。
本次测试得到了DTS产品经理的帮助,感谢。
最后,说几个槽点吧。
1. DTS任务出现了重复的作业ID
按理说,这个任务ID应该是唯一的吧?
在原来的那个任务上,停止任务后,多点几次"重新配置同步",就会出现重复的ID了。
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列作为主键。
DTS任务报告共有3条数据,同步时没任何重复(冲突)的报错(提醒)。
但是在ADB库,则只能查到两条数据。
记得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)测试初体验 的全部内容, 来源链接: utcz.com/z/533401.html