2.39 HTAP 快速上手指南

2.39.1 介绍

随着MySQL发展为世界上最为流行的开源数据库系统,用户在其中存储了大量的数据,并且运行着关键的业务逻辑,对这些数据进行实时分析成为一个日益增长的需求。当MySQL不能满足需求时,用户寻求一个更好的解决方案。
DBLE采用的方案是在只有以OLTP为主的MySQL数据库的基础上,引入处理OLAP型需求擅长的Clickhouse数据库,两套数据库系统可实现TP/AP负载的完全隔离,并通过数据同步工具等进行数据的实时同步; 另外DBLE会将前端发送过来的业务SQL根据SQL类型等规则自动将TP型负载路由到MySQL上,而将AP型负载路由到Clickhouse上,实现TP/AP负载自动识别下发

2.39.2 配置

  1. user.xml:配置HTAP型需求的用户hybridTAUser
    <hybridTAUser name="htap_user1" password="111111" schemas="testdb"/>
    
  2. sharding.xml:配置hybridTAUser对应的schema
    <!--这里apNode指向的Clickhouse的节点,shardingNode指向的MySQL的节点-->
    <schema name="testdb" apNode="apNode1" shardingNode="dn1">
    ....
    </schema>
    <shardingNode name="dn1" dbGroup="dbGroup1" database="db_1"/>
    <apNode name="apNode1" dbGroup="dbGroup2" database="ap_db1"/>
    
  3. db.xml:配置HTAP对应的MySQL和Clickhouse节点
    <!--MySQL-->
    <dbGroup name="dbGroup1" rwSplitMode="0" delayThreshold="100">
     <heartbeat>select 1</heartbeat>
     <dbInstance name="hostM1" url="ip:port" user="root" password="123456" maxCon="100" minCon="10" primary="true"/>
    </dbGroup>
    <!--Clickhouse-->
    <dbGroup name="dbGroup2" rwSplitMode="0" delayThreshold="100">
    <heartbeat>select 1</heartbeat>
    <dbInstance name="hostM2" url="ip:port" user="default" password="123456" maxCon="100" minCon="10" primary="true" databaseType="clickhouse"/>
    </dbGroup>
    
  4. 数据同步:自行配置,这里推荐Clickhouse官方提供的以binlog方式实现的MaterializedMySQL方案
配置限制
  1. shardingUser对应的schema中不能配置apNode
  2. hybridTAUser对应的schema中必须配置apNode
  3. hybridTAUser涉及apNode对应的dbGroup的databaseType必须是clickhouse
  4. analysisUser的dbGroup可以与hybridTAUser的apNode共用同一个
  5. shardingNode和apNode的name不能重复

2.39.3 使用案例

前提:MySQL和Clickhouse数据库中数据是同步的,数据都为:

mysql> select * from table_1;
+----+---------+
| id | column1 |
+----+---------+
|  1 | abc     |
|  2 | def     |
|  3 | ghi     |
+----+---------+
3 rows in set (0.01 sec)

case 1: OLTP

#由于SQL未包含聚合函数等AP的规则,所以被判定为OLTP负载,也就拆分下发给了dn节点对应的MySQL数据库
mysql> explain select id from table_1;
+---------------+----------+------------------------+
| SHARDING_NODE | TYPE     | SQL/REF                |
+---------------+----------+------------------------+
| dn1           | BASE SQL | select id from table_1 |
| dn2           | BASE SQL | select id from table_1 |
| dn3           | BASE SQL | select id from table_1 |
| dn4           | BASE SQL | select id from table_1 |
+---------------+----------+------------------------+
4 rows in set (0.00 sec)

mysql> select id from table_1;
+----+
| id |
+----+
|  3 |
|  1 |
|  2 |
+----+
3 rows in set (0.01 sec)

case 2: OLAP

#由于SQL包含group by语法,所以被判定为OLAP负载,也就下发给了ap1节点对应的Clickhouse数据库
mysql> explain select id from table_1 group by id;
+---------------+----------+------------------------------------+
| SHARDING_NODE | TYPE     | SQL/REF                            |
+---------------+----------+------------------------------------+
| ap1           | BASE SQL | select id from table_1 group by id |
+---------------+----------+------------------------------------+
1 row in set (0.00 sec)

mysql> select id from table_1 group by id;
+------+
| id   |
+------+
|    3 |
|    2 |
|    1 |
+------+
3 rows in set (0.01 sec)

2.39.4 具体说明

SQL路由

支持智能路由和手动路由

智能路由

根据SQL类型、事务等情况判定SQL下发给AP或TP:

  1. 包含聚合函数的SELECT需要下发给AP
    具体指的是:min、sum、count、avg、max、STDDEV_POP、STDDEV_SAMP、VAR_POP、VAR_SAMP、group by
  2. 事务
    ClickHouse不支持事务,所以针对事务的情况都需要发给TP
  3. 增删改
    根据数据同步机制,Clickhouse使用binlog同步mysql数据,可以认为ck作为从,mysql作为主,这样的结构也就限制DML只能下发给TP
手动路由

前侧业务已经区分是AP/TP型,TP业务和AP业务区分不同的应用程序,不同的应用程序通过不同的用户连接到DBLE来实现业务隔离:
纯OLTP型应用:可使用shardingUser(见1.3 user.xml 配置
纯OLAP型应用:可使用analysisUser(见1.3 user.xml 配置

拆分粒度

应用发送给DBLE的SQL(称之为完整SQL),经过DBLE解析后可能会被拆分成多个SQL(称之为子SQL),后续会按照路由规则把这些SQL下发给具体的后端节点
这里DBLE在选择SQL进行智能路由时,会针对子SQL进行智能判断并下发给对应的TP/AP型的数据库

查看配置

  • 查看hybridTAUser的配置
    mysql> select * from dble_entry a join dble_entry_schema b on a.id = b.id where user_type = 'hybridTAUser'\G
    *************************** 1. row ***************************
                  id: 4
                type: username
           user_type: hybridTAUser
            username: apuser1
    password_encrypt: hWj/raQ08POPSUZykAbUnQVvzwl1IdbQw4fbZxmocW71BW6Y0He0Z0nIZfRkXsbQ4KMPegG4D2KkQnwZpbYMpA==
    encrypt_configured: false
       conn_attr_key: NULL
     conn_attr_value: NULL
           white_ips: NULL
            readonly: -
      max_conn_count: no limit
           blacklist: NULL
                  id: 4
              schema: aptest
    1 row in set (0.01 sec)
    
  • 查看apNode的配置
    mysql> select * from dble_ap_node;
    +------+----------+----------------+
    | name | db_group | db_schema      |
    +------+----------+----------------+
    | ap1  | dbGroup4 | mysql_db_test2 |
    +------+----------+----------------+
    2 rows in set (0.00 sec)
    

2.39.5 不支持场景

  • 跨Clickhouse库的SQL目前未做支持,只能路由到MySQL数据库
  • 由于Clickhouse在支持隐式UNION语法上(Clickhouse UNION Clause)和MySQL不兼容,所以使用UNION时应该显式的写明是UNION ALL还是UNION DISTINCT,不然下发给Clickhouse会报错

results matching ""

    No results matching ""