上述规则的意思是,当SELECT语句中包含 "+CLICKHOUSE" 关键字时,就会自动转发到 ClickHouse 后端去处理,其余的都发送到MySQL后端处理。例如下面这两条SQL就会分别转发到MySQL和ClickHouse后端:

#SQL #1
[root@yejr.run]> SELECT * FROM sbtest1 WHERE id=1;

#SQL #2
[root@yejr.run]> SELECT /*+CLICKHOUSE*/ * FROM sbtest1 WHERE id=1; 

第二条SQL利用MySQL的注释语法巧妙地实现规则HINT。

查询 stats_mysql_query_digest 表的结果予以确认:

roxysql> select hostgroup, schemaname, username, digest, digest_text from stats_mysql_query_digest;

+-----------+------------+----------+--------------------+----------------------------------+
| hostgroup | schemaname | username | digest | digest_text |
+-----------+------------+----------+--------------------+----------------------------------+
| 0 | sbtest | app_user | 0x5662D7CF0442E794 | select * from sbtest1 where id=? |
| 1 | sbtest | app_user | 0x5662D7CF0442E794 | select * from sbtest1 where id=? |
+-----------+------------+----------+--------------------+----------------------------------+

可以看到,两条SQL看起来一样,但分别转发到不同的hostgroup了。

最后配置ProxySQL的监控服务(可选,非必须):

proxysql> set mysql-monitor_enabled="true";
proxysql> set mysql-monitor_username="monitor";
proxysql> set mysql-monitor_password="monitor";

proxysql> save mysql variables to disk; load mysql variables to runtime;

至此,一个全部基于开源应用的简易HTAP系统就构建好了。

4. 性能对比

在这里,我选用ClickHouse官方提供的benchmark方案:Star Schema Benchmark。

编译完成后先是利用ssb-dbgen生成测试数据(指定参数 -s 50):

./dbgen -s 50 -T c &
./dbgen -s 50 -T l &
./dbgen -s 50 -T p &
./dbgen -s 50 -T s &
./dbgen -s 50 -T d &

再创建几个测试库表,自行修改建表的DDL以适应MySQL语法。而后导入测试数据,最后根据文档并生成 lineorder_flat 表。

[root@yejr.run]> show table status;
+----------------+--------+---------+------------+-----------+----------------+--------------+
| Name           | Engine | Version | Row_format | Rows      | Avg_row_length | Data_length  |
+----------------+--------+---------+------------+-----------+----------------+--------------+
| customer       | InnoDB |      10 | Dynamic    |   1378209 |            120 |    166363136 |
| lineorder      | InnoDB |      10 | Dynamic    | 297927870 |            100 |  29871833088 |
| lineorder_flat | InnoDB |      10 | Dynamic    | 292584926 |            430 | 125952851968 |
| part           | InnoDB |      10 | Dynamic    |   1192880 |            111 |    132792320 |
| supplier       | InnoDB |      10 | Dynamic    |     99730 |            110 |     11026432 |
+----------------+--------+---------+------------+-----------+----------------+--------------+

数据全部加载完毕后,再在ClickHouse中创建MaterializeMySQL复制通道:

clickhouse :) CREATE DATABASE ssb ENGINE = MaterializeMySQL('172.24.10.10:3380', 'ssb', 'repl', 'repl');

数据量比较大,耐心静待它复制完成即可。

然后连接 ProxySQL,先简单执行大表count(),观察耗时的不同:

#直接执行count(),会转发到后端 MySQL 实例
[root@yejr.run]> select count(*) from lineorder_flat;
+-----------+
| count(*)  |
+-----------+
| 300005811 |
+-----------+
1 row in set (3 min 2.14 sec)

#加上HINT规则,会转发到后端 ClickHouse 实例
[root@yejr.run]> select /+CLICKHOUSE/ count(*) from lineorder_flat;
+-----------+
| count(*)  |
+-----------+
| 300005811 |
+-----------+
1 row in set (5.67 sec)

光是 count(*) 就差了好多倍。

再选取其中前4个SQL测试,记录的耗时如下:

Query MySQL ClickHouse(从库) ClickHouse(原生)
Q1.1 308.388684 0.149 0.107
Q1.2 320.373203 0.280 0.027
Q1.3 279.673361 0.346 0.030
Q2.1 286.451062 1.246 0.489

很明显,直接在MySQL上查询的效率实在太低了,而作为从库的MaterializeMySQL和ClickHouse原生的MergeTree表虽然也有一定差距,但相差也没那么大了,还算是很快的。

4. 其他说明

  • ClickHouse的MaterializeMySQL中不支持 create like 语法。例如执行 create table db2.a like db1.a,其中db1是要复制到ClickHouse的,而db2是留在MySQL端,即便这样也会导致ClickHouse端复制报错,需要重启才行。
  • ClickHouse的MaterializeMySQL中也不支持函数索引
  • 偶尔发现ProxySQL的监控模块连接到ClickHouse后,会发送 SET wait_timeout=N 命令,会导致ClickHouse报错,但不影响正常使用。重启ProxySQL,或者重启监控开关都可以解决

Enjoy it :)

            </div>

基于开源应用快速构建HTAP系统(2)-阿里云开发者社区相关推荐

  1. mysql htap 开源_基于开源应用快速构建HTAP系统

    原标题:基于开源应用快速构建HTAP系统 利用ProxySQL.MySQL.ClickHouse快速构建HTAP系统1. 关于ClickHouse 企业里随着数据量的增加,以及日趋复杂的分析性业务需求 ...

  2. 基于八叉树的空间划分及搜索操作-阿里云开发者社区

    原理 建立空间索引在点云数据处理中有着广泛的应用,常见的空间索引一般 是自顶而下逐级划分空间的各种空间索引结构. 比较有代表性的包括 BSP树 KD树 KDB树 R树 四叉树 八叉树 这些结构中,KD ...

  3. mysql异地多活方案_基于MGR高可用异地多活方案-阿里云开发者社区

    一.概述 主要目的实现MySQL高可用解决方案,实现异地多活. 二.实现构思 基于MGR实现高可用异地多活 首先要基于位置信息进行分片,例如华北 华中,华南,程序层要进行ip过滤和判断, 针对不同的i ...

  4. mysql 轨迹数据存储_基于Tablestore实现海量运动轨迹数据存储-阿里云开发者社区...

    前言 现在越来越多的人都开始关心自己的运动数据,比如每日的计步.跑步里程.骑行里程等.运动APP与运动类的穿戴设备借助传感器.地图.GPS定位等技术,收集好运动数据以后,通过与互联网社交功能结合,产生 ...

  5. abaqus实例手册_《ABAQUS 6.14超级学习手册》——1.6 实例快速入门-阿里云开发者社区...

    本节书摘来自异步社区<ABAQUS 6.14超级学习手册>一书中的第1章,第1.6节,作者: 齐威 更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.6 实例快 ...

  6. ubuntu下amd超频工具_Ubuntu 16.04 LTS 推荐开源 AMDGPU 和 Radeon 驱动程序-阿里云开发者社区...

    Ubuntu 16.04 LTS 将不支持 AMD 催化剂驱动作为 AMD GPU(图形处理单元)的驱动程序,相反 Canonical 建议用户采用开源的 Radeon 和 AMDGPU 作为替代. ...

  7. boot spring 解析csv_文件系统(02):基于SpringBoot框架,管理Xml和CSV文件类型-阿里云开发者社区...

    一.文档类型简介 1.XML文档 XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如数据结构,格 ...

  8. python可视化库matplotlib_环境搭建 | Python 数据可视化库 Matplotlib 快速入门之一-阿里云开发者社区...

    数据挖掘基础环境安装与使用 [学习目标] 完成数据挖掘基础阶段的所有环境安装 应用jupyter notebook完成代码编写运行 库的安装 学习目标 目标 搭建好数据挖掘基础阶段的环境 应用 无 整 ...

  9. 阿里云 mysql 100_MySQL服务进程占用系统CPU达100%-阿里云开发者社区

    故障现象:ping云主机严重丢包,丢包率达99%,仅有一两个包可到达:更无法远程: 排查:云主机 CentOS6.4 后台查看CPU占用高达99% 还好能登入系统,操作也并不卡顿: top查看 mys ...

最新文章

  1. 阿里巴巴宣布成立人工智能治理与可持续发展实验室
  2. WP老杨解迷:开发生态两极化和榜单乱象
  3. word2vec模型评估_特征工程(下)—特征评估
  4. 【机器视觉】 dev_set_line_width算子
  5. HttpResponse对象
  6. 【英语学习】【Level 08】U03 My Choice L5 The star that shines the brightest
  7. 华为路由器防火墙配置命令总结(上)
  8. python 百度搜索结果_Python洗涤百度搜索结果
  9. 模拟登录,发送amf类型数据
  10. oracle clob 导出csv,在Apex把csv导入数据库Clob字段再导入到各自对应列的解决方法...
  11. c语言题库及答案(选择题,C语言题库及答案(选择题).doc
  12. 【Paddle 入门打卡】用Paddle做MINIST手写数据集识别
  13. 带下拉菜单截图 巧用PrtSc截图键
  14. 8.使用xshell上传文件
  15. Spring Cloud Netflix之Euraka Server注册中心
  16. 开源帮助:什么是退出代码 137,你能修复它吗?
  17. 法国 计算机金融 大学,法国金融硕士专业大学排名(2020年QS)_快飞留学
  18. Android手机无法识别SD卡的处理方法
  19. 阿拉伯文变形规范,阿拉伯语变形规则,阿拉伯文组合规则
  20. Power BI 案例篇之大屏展示

热门文章

  1. 数据拯救单身狗!助攻两性相处的6个小数据
  2. VMware虚拟机黑屏不显示画面
  3. css a标签去除下划线
  4. Pandas中to_excel实现数据追加或者覆盖到Excel工作表
  5. matplotlib 文档:Pyplot tutorial
  6. 学习人工智能可以从事哪些职业,有哪些就业前景和薪资待遇?
  7. Open3D Mesh 网格
  8. 如何在编译时判断是否支持SSE/SSE2/AVX/AVX2/AVX-512
  9. 基于概率论的分类方法:朴素贝叶斯及CSDN_RSS源分析
  10. 堆(heap):先进先出,栈(stack)先进后出