当前位置: 代码网 > it编程>数据库>Mysql > ClickHouse使用MySQL数据库引擎的实现

ClickHouse使用MySQL数据库引擎的实现

2026年01月11日 Mysql 我要评论
clickhouse使用mysql数据库引擎mysql作为一种关系型数据库管理系统,主要擅长oltp(在线事务处理)场景,能高效处理增删改查等事务操作,保证数据一致性和可靠性。而clickhouse是

clickhouse使用mysql数据库引擎

mysql作为一种关系型数据库管理系统,主要擅长oltp(在线事务处理)场景,能高效处理增删改查等事务操作,保证数据一致性和可靠性。

而clickhouse是一种列式存储的olap(在线分析处理)数据库,专为高性能分析而设计,能够快速处理大规模数据的复杂分析查询。

两者结合的关联主要体现在:

  1. 数据同步:可以将mysql中的事务数据实时同步到clickhouse中进行分析处理,例如配置mysql数据表与clickhouse表的实时同步。
  2. 优势互补:mysql处理日常事务操作,clickhouse处理大规模数据分析,各自发挥所长。
  3. 一站式htap解决方案:通过云平台(如阿里云rds)的整合,使得用户可以在一个平台上同时获得事务处理和分析处理的能力,简化了运维和管理。

这种组合能够支持各种业务场景:业务报表统计、交互式运营分析、对账以及实时数仓等。数据可以在mysql中进行事务处理,然后同步到clickhouse中进行快速分析,从而实现"事务在线处理和在线分析的一体化"。

mysql 数据库引擎介绍

mysql 数据库引擎是 clickhouse 提供的一种集成引擎,这不是指 clickhouse 本身使用的存储引擎(如 mergetree),它允许你直接在 clickhouse 中查询存储在远程 mysql 服务器上的数据。

核心概念:

  • 外部数据源: mysql 数据库引擎视远程 mysql 服务器为一个外部数据源。
  • 代理查询: 当你查询使用 mysql 引擎创建的 clickhouse 数据库或表时,clickhouse 会将查询(或其一部分)转发给远程 mysql 服务器执行。
  • 数据不存储在 clickhouse: 使用这个引擎时,数据仍然物理存储在 mysql 中。clickhouse 只是充当了一个查询代理或网关。

工作原理:

  1. 创建连接: 你在 clickhouse 中创建一个使用 mysql 引擎的数据库或表,并提供连接到远程 mysql 服务器所需的信息(主机、端口、数据库名、用户名、密码)。
  2. 查询执行: 当你在 clickhouse 中对这个 mysql 引擎支持的表或数据库执行 select 查询时:
    • clickhouse 解析查询。
    • 它将查询中需要从 mysql 获取数据的部分,尽可能地转换为 mysql 兼容的 sql 语句。
    • clickhouse 连接到远程 mysql 服务器。
    • 它将转换后的 sql 查询发送给 mysql 执行。
    • mysql 执行查询并返回结果集给 clickhouse。
    • clickhouse 接收数据,并在需要时进行后续处理(例如,与其他 clickhouse 本地表进行 join,或者进行 clickhouse 支持的聚合/函数计算)。

主要用途和优势:

  1. 数据联合查询 (data federation): 可以在单个 clickhouse 查询中,联合查询 clickhouse 本地表和远程 mysql 表的数据。这对于需要整合分析来自不同系统的数据非常有用。
  2. 平滑迁移/数据探索: 在将数据完全迁移到 clickhouse 之前,可以使用 clickhouse 强大的分析能力来查询和分析现有的 mysql 数据。
  3. 简化 etl: 对于某些简单的只读场景,可以避免构建复杂的数据抽取、转换、加载(etl)流程,直接查询 mysql。
  4. 利用 clickhouse 的查询功能: 可以利用 clickhouse 的 sql 方言和函数来处理从 mysql 获取的数据(注意:数据的 获取 速度受限于 mysql 和网络)。

如何使用:

有两种主要的使用方式:

方式一:创建 mysql 数据库引擎的数据库 (推荐)

这种方式更方便,clickhouse 会自动映射指定 mysql 数据库中的所有表。

create database mysql_db_alias -- clickhouse 中的数据库别名
engine = mysql('mysql_host:port', 'mysql_database_name', 'mysql_user', 'mysql_password');
  • mysql_db_alias: 你在 clickhouse 中为这个远程 mysql 数据库起的名称。
  • mysql_host:port: mysql 服务器的主机名和端口(例如 ‘localhost:3306’ 或 ‘mysql.example.com:3306’)。
  • mysql_database_name: 要连接的 mysql 数据库的名称。
  • mysql_user: 连接 mysql 的用户名。
  • mysql_password: 连接 mysql 的密码。

创建成功后,你可以像查询普通 clickhouse 数据库一样查询它:

-- 查看 mysql 数据库中的表
show tables from mysql_db_alias;

-- 查询 mysql 中的某个表
select * from mysql_db_alias.some_mysql_table where condition limit 10;

-- 与 clickhouse 本地表进行 join
select c.data, m.name
from clickhouse_local_table as c
join mysql_db_alias.users as m on c.user_id = m.id;

方式二:创建 mysql 引擎的表

这种方式允许你只映射 mysql 中的单个表到 clickhouse 中。你需要显式定义 clickhouse 表的结构,并且这个结构需要与 mysql 中的表结构兼容。

create table mysql_table_alias -- clickhouse 中的表别名
(
    -- 定义列名和 clickhouse 数据类型,需要与 mysql 表兼容
    id uint64,
    name string,
    created_at datetime
    -- ... 其他列
)
engine = mysql('mysql_host:port', 'mysql_database_name', 'actual_mysql_table_name', 'mysql_user', 'mysql_password');
  • mysql_table_alias: 你在 clickhouse 中为这个远程 mysql 表起的名称。
  • 列定义:你需要定义列名和 clickhouse 的数据类型。clickhouse 会尝试进行类型映射,但最好确保类型兼容(例如 mysql int -> clickhouse int32uint32varchar -> stringdatetime -> datetime)。
  • actual_mysql_table_name: 远程 mysql 中实际的表名。
  • 其他参数同上。

查询方式:

select * from mysql_table_alias where id > 100;

场景演示示例

准备一台linux服务器,以ubuntu 22.04为例,已安装docker和docker-compose环境。

目标场景:

  1. 运行一个 mysql 容器,并创建一个示例数据库和表。
  2. 运行一个 clickhouse 容器。
  3. 在 clickhouse 中,创建一个指向 mysql 容器中数据库的 mysql 数据库引擎实例。
  4. 能够通过 clickhouse 查询 mysql 中的数据。

1. 创建项目目录结构:

在你喜欢的位置创建一个项目文件夹,例如 ch_mysql_demo

mkdir ch_mysql_demo
cd ch_mysql_demo

2. 创建 docker-compose.yml 文件:

ch_mysql_demo 目录下创建 docker-compose.yml 文件,内容如下:

name: 'ch_mysql_demo'

services:
  mysql-server:
    image: mysql:8.0 # 使用 mysql 8.0 镜像
    container_name: mysql-server
    hostname: mysql-server # 容器主机名,clickhouse 将使用它连接
    restart: always
    environment:
      mysql_root_password: testpassword!@#$ # 设置 root 密码 (生产环境请使用更安全的方式)
      mysql_database: demo_db          # 创建一个名为 demo_db 的数据库
      mysql_user: demo_user           # 创建一个用户
      mysql_password: userpassword123   # 设置用户的密码 (生产环境请使用更安全的方式)
    volumes:
      - mysql_data:/var/lib/mysql     # 持久化 mysql 数据
      - ./mysql_init:/docker-entrypoint-initdb.d # 挂载初始化脚本目录
    ports:
      - "3306:3306" # 将 mysql 端口映射到宿主机,方便调试
    networks:
      - ch_mysql_network

  clickhouse-server:
    image: clickhouse/clickhouse-server:latest # 使用最新的 clickhouse 镜像
    container_name: clickhouse-server
    hostname: clickhouse-server
    restart: always
    ports:
      - "8123:8123" # clickhouse http 接口
      - "9000:9000" # clickhouse 原生 tcp 接口
    volumes:
      - clickhouse_data:/var/lib/clickhouse/ # 持久化 clickhouse 数据
      - clickhouse_logs:/var/log/clickhouse-server/ # 持久化 clickhouse 日志
    networks:
      - ch_mysql_network
    depends_on:
      - mysql-server # 确保 mysql 容器先启动
    ulimits: # 推荐为 clickhouse 提高文件描述符限制
      nofile:
        soft: 262144
        hard: 262144

volumes:
  mysql_data: # docker 管理的数据卷
  clickhouse_data:
  clickhouse_logs:

networks:
  ch_mysql_network: # 自定义桥接网络,让容器可以通过服务名通信
    driver: bridge

3. 创建 mysql 初始化脚本 (可选但推荐):

为了方便演示,我们可以在 mysql 启动时自动创建一些示例数据。在 ch_mysql_demo 目录下创建一个名为 mysql_init 的子目录,并在其中创建一个 .sql 文件,例如 init.sql

mkdir mysql_init

创建 mysql_init/init.sql 文件,内容如下:

-- 这个脚本会在 mysql 容器第一次启动时自动执行
-- 使用我们通过环境变量创建的数据库
use demo_db;

-- 创建一个示例表
create table products (
    id int auto_increment primary key,
    name varchar(255) not null,
    price decimal(10, 2),
    created_at timestamp default current_timestamp
);

-- 插入一些示例数据
insert into products (name, price) values
('laptop', 1200.50),
('mouse', 25.00),
('keyboard', 75.99),
('monitor', 300.00);

-- 可以添加更多表和数据...

-- 确保 demo_user 对 demo_db 有权限 (通常环境变量创建用户时会自动授权,但显式添加更保险)
-- grant all privileges on demo_db.* to 'demo_user'@'%'; -- 在某些 mysql 镜像版本可能需要
-- flush privileges;

4. 启动容器:

ch_mysql_demo 目录下运行:

docker-compose up -d

这会以后台模式下载镜像(如果本地没有)并启动 mysql 和 clickhouse 容器。mysql 会运行初始化脚本。

查看运行的容器

root@localhost:~/ch_mysql_demo# docker compose ps
name                image                                 command                  service             created          status          ports
clickhouse-server   clickhouse/clickhouse-server:latest   "/entrypoint.sh"         clickhouse-server   14 minutes ago   up 14 minutes   0.0.0.0:8123->8123/tcp, :::8123->8123/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 9009/tcp
mysql-server        mysql:8.0                             "docker-entrypoint.s…"   mysql-server        14 minutes ago   up 14 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
root@localhost:~/ch_mysql_demo# 

5. 在 clickhouse 中连接 mysql:

等待几秒钟让 mysql 完全启动并初始化。然后,连接到 clickhouse 容器:

docker exec -it clickhouse-server clickhouse-client

进入 clickhouse 命令行后,执行以下 sql 命令来创建 mysql 数据库引擎:

-- 创建一个 clickhouse 数据库,它映射到远程 mysql 的 demo_db
create database mysql_remote_db
engine = mysql('mysql-server:3306', 'demo_db', 'demo_user', 'userpassword123');
--^-- mysql 容器的服务名和端口
--^-- mysql 数据库名
--^-- mysql 用户名
--^-- mysql 密码 (与 docker-compose 中设置的一致)

6. 通过 clickhouse 查询 mysql 数据:

现在你可以像查询 clickhouse 本地数据库一样查询 mysql_remote_db 了:

-- 查看 mysql 数据库中的表 (通过 clickhouse)
show tables from mysql_remote_db;

/* 预期输出类似:
┌─name─────┐
│ products │
└──────────┘
*/

-- 查询 mysql 的 products 表
select * from mysql_remote_db.products;

/* 预期输出:
┌─id─┬─name─────┬──price─┬──────────created_at─┐
│  1 │ laptop   │ 1200.50 │ 2023-10-27 10:00:00 │
│  2 │ mouse    │   25.00 │ 2023-10-27 10:00:00 │
│  3 │ keyboard │   75.99 │ 2023-10-27 10:00:00 │
│  4 │ monitor  │  300.00 │ 2023-10-27 10:00:00 │
└────┴──────────┴─────────┴─────────────────────┘
(created_at 时间会是你运行时的实际时间)
*/

-- 使用 clickhouse 的函数处理来自 mysql 的数据
select
    name,
    round(todecimal64(price, 2)) as rounded_price,
    upper(name) as upper_name
from mysql_remote_db.products
where todecimal64(price, 2) > 50;

/* 预期输出:
┌─name─────┬─rounded_price─┬─upper_name─┐
│ laptop   │          1201 │ laptop     │
│ keyboard │            76 │ keyboard   │
│ monitor  │           300 │ monitor    │
└──────────┴───────────────┴────────────┘
*/

-- 退出 clickhouse 客户端
exit;

7. 清理环境:

当你完成实验后,可以停止并移除容器、网络和数据卷:

docker-compose down -v

-v 参数会同时删除关联的数据卷(mysql_data, clickhouse_data, clickhouse_logs),如果你想保留数据,则不加 -v

这个 docker-compose 文件和相关步骤提供了一个基础的 clickhouse + mysql 集成环境,可以在此基础上进行更复杂的查询和实验。在生产环境中使用更安全的密码管理方式(例如 docker secrets 或环境变量注入)。

到此这篇关于clickhouse使用mysql数据库引擎的实现的文章就介绍到这了,更多相关clickhouse mysql数据库引擎内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com