一.什么是HTAP
HTAP数据库(Hybrid Transaction and Analytical Process,混合事务和分析处理)。2014年Gartner的一份报告中使用混合事务分析处理(HTAP)一词描述新型的应用程序框架,以打破OLTP和OLAP之间的隔阂,既可以应用于事务型数据库场景,亦可以应用于分析型数据库场景。实现实时业务决策。这种架构具有显而易见的优势:不但避免了繁琐且昂贵的ETL操作,而且可以更快地对最新数据进行分析。这种快速分析数据的能力将成为未来企业的核心竞争力之一。
如图:图片来源于网络
再简单介绍一下OLAP和OLTP的概念与特点。
OLAP(On-Line Analytical Processing),OLAP是面向数据分析的,也称为面向信息分析处理过程。它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。其特征是应对海量数据,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。例如数据仓库是其典型的OLAP系统。其具备以下特点:
OLTP(On-Line Transaction Processing),OLTP是事件驱动、面向应用的,也称为面向交易的处理过程。其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作的快速响应。例如银行类、电子商务类的交易系统就是典型的OLTP系统。其具备以下特点:
二.GaussDB(for MySQL)只读分析特性
华为云近期推出了GaussDB(for MySQL)只读分析特性,当前处于邀请测试阶段,墨天轮社区受邀对部分特性做了测试,并选取当下最热门的分析型数据库——ClickHouse来做比较分析。
ClickHouse拥有强大极致的性能,但是在实践生产过程中仍然面临一些问题,在我们的测试中,GaussDB(for MySQL)的HTAP只读分析节点有更好的用户体验,同时还解决了用户在使用过程中的一些痛点。
HTAP只读分析节点在已有的GaussDB(for MySQL)数据库上可以创建对应的同步链路,把数据抽取到HTAP只读分析节点,数据分析是在HTAP只读分析节点中操作完成。在数据同步过程中,HTAP只读分析节点先做一次全量同步,完成后,后续的数据是以增量的方式同步。
三.使用测试
源库: GaussDB(for MySQL) 目标库: GaussDB(for MySQL)只读分析,自建ClickHouse。
GaussDB(for MySQL) 3.3亿数据,5张表全量同步到GaussDB(for MySQL)只读分析实例,通过界面化操作。
test_primary 是空表。
源库数据量:
mysql> select count(1) from lineitem;+-----------+| count(1) |+-----------+| 300000000 |+-----------+1 row in set (53.32 sec)
mysql> select count(1) from lineitem_2;+----------+| count(1) |+----------+| 7500000 |+----------+1 row in set (1.71 sec)lineitem_3,lineitem_4,lineitem_5 表数据为7500000
GaussDB(for MySQL)只读分析创建全量同步: 通过连上GaussDB(for MySQL)只读分析实例,马上可以看到有6张表了。可以说是并行同步的。
mysql> show tables;+--------------+| name |+--------------+| lineitem || lineitem_2 || lineitem_3 || lineitem_4 || lineitem_5 || test_primary |+--------------+6 rows in set (0.01 sec)Read 6 rows, 192.00 B in 0.001041072 sec., 5763 rows/sec., 180.10 KiB/sec.mysql> select count(1) from lineitem;+-----------+| count() |+-----------+| 300000000 |+-----------+1 row in set (11.62 sec)Read 300000000 rows, 5.31 GiB in 11.608233926 sec., 25843724 rows/sec., 468.28 MiB/sec.
全量同步完成后,会显示增量同步中。
大概耗时6分钟,这个时间可以通过监控界面估算,并没有详细的日志记录同步时间。
GaussDB(for MySQL) 3.3亿数据全量同步到自建ClickHouse实例:
开启MaterializeMySQL引擎使用:
ecs-bd1c : ) SET allow_experimental_database_materialize_mysql = 1;SET allow_experimental_database_materialize_mysql = 1Ok.0 rows in set. Elapsed: 0.000 sec.
设置ClickHouse内存使用为25G:
ecs-bd1c : ) SET max_memory_usage = 26843545600;SET max_memory_usage = 26843545600Ok.
创建复制管道:
CREATE DATABASE tpchENGINE = MaterializeMySQL('192.168.0.193:3306','tpch','root','xxxxxxxxx');
通过show tables观察,ClickHouse是同步完一张表,再同步下一张表:
ecs-bd1c : ) show tables;
SHOW TABLES
┌─name───────┐│ lineitem ││ lineitem_4 │└────────────┘
2 rows in set. Elapsed: 0.001 sec.
SHOW TABLES
┌─name─────────┐│ lineitem ││ lineitem_2 ││ lineitem_3 ││ lineitem_4 ││ lineitem_5 ││ test_primary │└──────────────┘
6 rows in set. Elapsed: 0.001 sec.
ecs-bd1c : ) select count(1) from lineitem;
SELECT count(1)FROM lineitem
┌──count(1)─┐│ 300000000 │└───────────┘全量同步完成,大概耗时11分钟。
在源端MySQL建表:
mysql> create table test_unique (id int unique key not null, c0 varchar(10));Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.01 sec)ClickHouse端不能同步,会报错。
Received exception from server (version 20.9.2):Code: 48. DB::Exception: Received from localhost:9000. DB::Exception: The tpch.test_unique cannot be materialized, because there is no primary keys..
表名单过滤功能,ClickHouse的MaterializeMySQL引擎不支持。
ClickHouse 的MaterializeMySQL有些数据类型不支持,导致整个同步失败。
GaussDB(for MySQL)只读分析实例同步容错性有增强,如下操作:
mysql> use tpccDatabase changed, 1 warningmysql> select * from test_2;+------+-------+| id | c1 |+------+-------+| 1 | 15.20 |+------+-------+1 row in set (0.00 sec)Read 1 rows, 21.00 B in 0.001468243 sec., 681 rows/sec., 13.97 KiB/sec.
GaussDB(for MySQL)只读分析实例可以自定义设置分区键,ClickHouse默认会使用主键进行分区(不可控)。
ClickHouse不支持事务。GaussDB(for MySQL)只读分析实例支持轻量事务,支持快照读。
在源库MySQL建表:
set autocommit=0;create table test_1(user_id int primary key auto_increment, score varchar(50), deleted tinyint default 0, create_time datetime DEFaULT now());
drop procedure add_data;delimiter $$create procedure add_data(in maxnum int)begindeclare i int default 0;declare s varchar(50);
while (i < maxnum) doselect concat(rpad("a",i%50,"x")) into s;insert into test_1(score,deleted)values(s,0);set i=i+1;end while;end $$delimiter ;call add_data(1000000);commit;ClickHouse端数据只有0和1000000。
ecs-bd1c : ) select count(*) from test_1;
SELECT count(*)FROM test_1
┌─count()─┐│ 1000000 │└─────────┘
1 rows in set. Elapsed: 0.015 sec. Processed 1.00 million rows, 13.00 MB (68.52 million rows/s., 890.71 MB/s.)
ecs-bd1c : )GaussDB(for MySQL)只读分析实例端:
mysql> select count(*) from test_1;+---------+| count() |+---------+| 1000000 |+---------+1 row in set (0.04 sec)Read 1000000 rows, 14.31 MiB in 0.046160647 sec., 21663474 rows/sec., 309.90 MiB/sec.
mysql> select count(*) from test_1 settings mvcc_isolation_level='query_snapshot';+---------+| count() |+---------+| 1000000 |+---------+1 row in set (0.00 sec)Read 1000000 rows, 2.86 MiB in 0.002436235 sec., 410469433 rows/sec., 1.15 GiB/sec.
mysql> select count(*) from test_1 settings mvcc_isolation_level='read_uncommitted';+---------+| count() |+---------+| 1000000 |+---------+1 row in set (0.05 sec)Read 1000000 rows, 14.31 MiB in 0.051543554 sec., 19401068 rows/sec., 277.53 MiB/sec.
mysql> select count(*) from test_1 settings mvcc_isolation_level='read_committed';+---------+| count() |+---------+| 1000000 |+---------+1 row in set (0.05 sec)Read 1000000 rows, 14.31 MiB in 0.045507899 sec., 21974207 rows/sec., 314.34 MiB/sec.
当源端MySQL再写入300笔数据时,
ClickHouse端:
ecs-bd1c : ) select count(*) from test_1;
SELECT count(*)FROM test_1
┌─count()─┐│ 1000300 │└─────────┘
1 rows in set. Elapsed: 0.015 sec. Processed 1.00 million rows, 13.00 MB (65.88 million rows/s., 856.40 MB/s.)GaussDB(for MySQL)只读分析实例端:
mysql> select count(*) from test_1 settings mvcc_isolation_level='query_snapshot';+---------+| count() |+---------+| 1000000 |+---------+1 row in set (0.01 sec)Read 1000000 rows, 2.86 MiB in 0.002786347 sec., 358892844 rows/sec., 1.00 GiB/sec.
mysql> select count(*) from test_1;+---------+| count() |+---------+| 1000300 |+---------+1 row in set (0.05 sec)
GaussDB(for MySQL)只读分析可以查看复制状态:
mysql> show slave status;+----------+-----------------------+---------------------+-------------+------------+------------+-----------------+---------------------+--------------------------------------------+| database | seconds_behind_master | sync_thread_running | sync_phase | last_errno | last_error | master_log_file | read_master_log_pos | executed_gtid_set |+----------+-----------------------+---------------------+-------------+------------+------------+-----------------+---------------------+--------------------------------------------+| tpcc | 0 | Yes | Incremental | 0 | Null | binlog.000022 | 1354 | 28bae983-a195-11ec-8c47-fa163e9fdcda:1-118 || tpch | 0 | Yes | Incremental | 0 | Null | binlog.000022 | 1354 | 28bae983-a195-11ec-8c47-fa163e9fdcda:1-118 |+----------+-----------------------+---------------------+-------------+------------+------------+-----------------+---------------------+--------------------------------------------+2 rows in set (0.01 sec)Read 2 rows, 260.00 B in 0.002712043 sec., 737 rows/sec., 93.62 KiB/sec.
ClickHouse不支持。
在全量同步的过程中,如果MySQL重启或网络突然断开,ClickHouse不会自动重连,GaussDB(for MySQL)只读分析可以自动重连。
ClickHouse在同步的过程中,MySQL重启后,同步链路中断,不能重连。如下:
ecs-bd1c : ) select count(*) from lineitem;
SELECT count(*)FROM lineitem
Received exception from server (version 20.9.2):Code: 1000. DB::Exception: Received from localhost:9000. DB::Exception: mysqlxx::ConnectionFailed: Can't connect to MySQL server on '192.168.0.184' (115) ((nullptr):0).0 rows in set. Elapsed: 0.001 sec.源MySQL实例重启后,GaussDB(for MySQL)只读分析实例通过查未提交快照数据,发现数据在增长,如下:
mysql> select count(*) from lineitem settings mvcc_isolation_level='read_uncommitted';+----------+| count() |+----------+| 86284503 |+----------+1 row in set (2.70 sec)Read 86284503 rows, 1.53 GiB in 2.698228425 sec., 31978205 rows/sec., 579.44 MiB/sec.
mysql> select count(*) from lineitem settings mvcc_isolation_level='read_uncommitted';+-----------+| count() |+-----------+| 121985263 |+-----------+1 row in set (3.99 sec)Read 121985263 rows, 2.16 GiB in 3.988048546 sec., 30587707 rows/sec., 554.24 MiB/sec.
ClickHouse创建的一个新同步,会把源端的所有表去做同步,不能做过滤处理。
源端MySQL tpcc库中只有一张表test_2.
CREATE DATABASE tpccENGINE = MaterializeMySQL('192.168.0.193:3306','tpch','root','xxxxxxxxx');再到ClickHouse下去查看,他会把tpch库所有表也同步。
ecs-bd1c : ) use tpcc
USE tpcc
Ok.
0 rows in set. Elapsed: 0.000 sec.
ecs-bd1c : ) show tables;
SHOW TABLES
┌─name───────┐│ lineitem ││ lineitem_4 │└────────────┘
2 rows in set. Elapsed: 0.001 sec.
GaussDB(for MySQL)只读分析创建tpcc库的表可以选取过滤。如下图:
四.测试总结
通过以上评测对比可以看出:
在数据同步方面,GaussDB(for MySQL)只读分析的性能更好。即使是在硬件配置是GaussDB(for MySQL)只读分析实例2倍的情况下,自建ClickHouse同步3.3亿数据所需要的时间是GaussDB(for MySQL)只读分析实例的2倍。而且相比较ClickHouse,GaussDB(for MySQL)只读实例支持以下特性:
另外,GaussDB(for MySQL)只读分析还支持事务一致性,提供轻量级MVCC,并且对Final操作进行优化,提供基于快照的优越查询性能。
GaussDB(for MySQL)只读分析具备良好的复制链路监控,能够检测复制链路状态。且在全量复制过程中,如果遭遇MySQL重启,支持断开重连。
很期待GaussDB(for MySQL)只读分析特性上线商用。
墨天轮原文链接:https://www.modb.pro/db/374776?sjhy(复制到浏览器或者点击“阅读原文”立即查看)
END
推荐阅读:331页!2021年度数据库技术年刊
2021数据技术嘉年华50余个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2021DTC”获得!
你知道吗?我们的视频号里已经发布了很多有趣的内容,精彩活动也将在这里直播,快快关注吧!↓↓↓
点击下图查看更多 ↓
云和恩墨大讲堂 | 一个分享交流的地方
长按,识别二维码,加入万人交流社群
请备注:云和恩墨大讲堂
点个“在看”
你的喜欢会被看到❤