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

GaussDB(for MySQL) HTAP VS ClickHouse对比测试

数据和云 2022-03-18
275

一.什么是HTAP

HTAP数据库(Hybrid Transaction and Analytical Process,混合事务和分析处理)。2014年Gartner的一份报告中使用混合事务分析处理(HTAP)一词描述新型的应用程序框架,以打破OLTP和OLAP之间的隔阂,既可以应用于事务型数据库场景,亦可以应用于分析型数据库场景。实现实时业务决策。这种架构具有显而易见的优势:不但避免了繁琐且昂贵的ETL操作,而且可以更快地对最新数据进行分析。这种快速分析数据的能力将成为未来企业的核心竞争力之一。


如图:图片来源于网络

再简单介绍一下OLAP和OLTP的概念与特点。

OLAP(On-Line Analytical Processing),OLAP是面向数据分析的,也称为面向信息分析处理过程。它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。其特征是应对海量数据,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。例如数据仓库是其典型的OLAP系统。其具备以下特点:

  • 本身不产生数据,其基础数据来源于生产系统中的操作数据。

  • 基于查询的分析系统,复杂查询经常使用多表联结、全表扫描等,牵涉的数量往往十分庞大。

  • 每次查询设计的数据量很大,响应时间与具体查询有很大关系。

  • 用户数量相对较小,其用户主要是业务人员与管理人员。

  • 由于业务问题不固定,数据库的各种操作不能完全基于索引进行。

  • 以SQL为主要载体,也支持语言类交互。

  • 总体数据量相对较大。

OLTP(On-Line Transaction Processing),OLTP是事件驱动、面向应用的,也称为面向交易的处理过程。其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作的快速响应。例如银行类、电子商务类的交易系统就是典型的OLTP系统。其具备以下特点:

  • 直接面向应用,数据在系统中产生。

  • 基于交易的处理系统。

  • 每次交易牵涉的数据量很小;对响应时间要求非常高。

  • 用户数量非常庞大,其用户是操作人员,并发度很高。

  • 数据库的各种操作主要基于索引进行。

  • 以SQL作为交互载体。

  • 总体数据量相对较小。

二.GaussDB(for MySQL)只读分析特性

华为云近期推出了GaussDB(for MySQL)只读分析特性,当前处于邀请测试阶段,墨天轮社区受邀对部分特性做了测试,并选取当下最热门的分析型数据库——ClickHouse来做比较分析。

ClickHouse拥有强大极致的性能,但是在实践生产过程中仍然面临一些问题,在我们的测试中,GaussDB(for MySQL)的HTAP只读分析节点有更好的用户体验,同时还解决了用户在使用过程中的一些痛点。

HTAP只读分析节点在已有的GaussDB(for MySQL)数据库上可以创建对应的同步链路,把数据抽取到HTAP只读分析节点,数据分析是在HTAP只读分析节点中操作完成。在数据同步过程中,HTAP只读分析节点先做一次全量同步,完成后,后续的数据是以增量的方式同步。

三.使用测试

  • 3.1 测试环境

源库: GaussDB(for MySQL)
目标库: GaussDB(for MySQL)只读分析,自建ClickHouse。
  • 3.2 测试数据同步

3.2.1 全量同步

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 = 1
        Ok.
        0 rows in set. Elapsed: 0.000 sec.
        复制
        设置ClickHouse内存使用为25G:
          ecs-bd1c : ) SET max_memory_usage = 26843545600;
          SET max_memory_usage = 26843545600
          Ok.
          复制

          创建复制管道:

            CREATE DATABASE tpch
            ENGINE = 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分钟。

              复制

              3.2.2 无主键表不能同步

              在源端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..
                  复制

                  3.2.3 表过滤

                  表名单过滤功能,ClickHouse的MaterializeMySQL引擎不支持。

                  3.2.4 容错性

                  ClickHouse 的MaterializeMySQL有些数据类型不支持,导致整个同步失败。

                  GaussDB(for MySQL)只读分析实例同步容错性有增强,如下操作:

                    mysql> use tpcc
                    Database changed, 1 warning
                    mysql> 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.
                    复制

                    3.2.5 自定义分区键

                    GaussDB(for MySQL)只读分析实例可以自定义设置分区键,ClickHouse默认会使用主键进行分区(不可控)。

                    • 3.3 测试事务一致性

                    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)
                      begin
                      declare i int default 0;
                      declare s varchar(50);


                      while (i < maxnum) do
                      select 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)
                              复制
                              • 3.4 复制状态监控

                              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不支持。

                                • 3.5 重连机制

                                在全量同步的过程中,如果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.
                                    复制
                                    • 3.6 表同步

                                    ClickHouse创建的一个新同步,会把源端的所有表去做同步,不能做过滤处理。

                                    源端MySQL tpcc库中只有一张表test_2.

                                      CREATE DATABASE tpcc
                                      ENGINE = 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)只读实例支持以下特性:

                                        • 表同步设置:可以根据需要自主定义分区键(partition by(<非空列>))和排序键(order by(<非空列>)等等。

                                        • 支持MySQL表仅包含Unique Key的复制。

                                        • 支持黑白名单,允许过滤目标库中的部分表。

                                        • 支持并行复制,相比较ClickHouse的全量数据同步串行执行,在数据量打的情况下耗时较短。

                                        • 支持更多数据类型,容错性增强。

                                        另外,GaussDB(for MySQL)只读分析还支持事务一致性,提供轻量级MVCC,并且对Final操作进行优化,提供基于快照的优越查询性能。

                                        GaussDB(for MySQL)只读分析具备良好的复制链路监控,能够检测复制链路状态。且在全量复制过程中,如果遭遇MySQL重启,支持断开重连。

                                        很期待GaussDB(for MySQL)只读分析特性上线商用。


                                        墨天轮原文链接:https://www.modb.pro/db/374776?sjhy(复制到浏览器或者点击“阅读原文”立即查看)

                                        关于作者
                                        黄江平,云和恩墨MySQL DBA, Oracle OCP。现服务于金融证券行业,负责MySQL数据库SQL优化、数据库故障处理、备份恢复、迁级升级、性能优化,有10年的数据库运维经验。

                                        END

                                        推荐阅读:331页!2021年度数据库技术年刊

                                        推荐下载:2021数据技术嘉年华视频回放及PPT下载


                                        2021数据技术嘉年华50余个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2021DTC”获得!

                                        你知道吗?我们的视频号里已经发布了很多有趣的内容,精彩活动也将在这里直播,快快关注吧!↓↓↓


                                        点击下图查看更多 ↓

                                        云和恩墨大讲堂 | 一个分享交流的地方

                                        长按,识别二维码,加入万人交流社群


                                        请备注:云和恩墨大讲堂

                                          点个“在看” 

                                        你的喜欢会被看到❤

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

                                        评论