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 配置
- user.xml:配置HTAP型需求的用户hybridTAUser
<hybridTAUser name="htap_user1" password="111111" schemas="testdb"/>
- 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"/>
- 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>
- 数据同步:自行配置,这里推荐Clickhouse官方提供的以binlog方式实现的MaterializedMySQL方案
配置限制
- shardingUser对应的schema中不能配置apNode
- hybridTAUser对应的schema中必须配置apNode
- hybridTAUser涉及apNode对应的dbGroup的databaseType必须是clickhouse
- analysisUser的dbGroup可以与hybridTAUser的apNode共用同一个
- 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:
- 包含聚合函数的SELECT需要下发给AP
具体指的是:min、sum、count、avg、max、STDDEV_POP、STDDEV_SAMP、VAR_POP、VAR_SAMP、group by - 事务
ClickHouse不支持事务,所以针对事务的情况都需要发给TP - 增删改
根据数据同步机制,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会报错