在生产环境中,经常遇到将数据库中的数据写入ClickHouse集群中。本文介绍2种将MySQL数据库中的数据导入到ClickHouse集群的方案。
其一,利用ClickHouse支持MySQL外表的特性来实现;其二,使用Altinity提供的clickhouse-mysql-data-reader
工具来实现数据导入。
本文示例中,将MySQL数据表test.clickhouse_test中的数据导入到ClickHouse集群中,该表的Schema如下:
ClickHouse 的MySQL表引擎可以对存储在远程 MySQL 服务器上的数据执行 SELECT 查询。基于这样能力,利用
"CREATE ... SELECT FROM"或者" INSERT INTO ... SELECT FROM"语句即可完成数据导入。
具体步骤:
还可以将步骤2/3合并成一个步骤,即采用CREATE TABLE AS SELECT * FROM 方式来达到同样效果。
讨论
Altinity提供了一个工具clickhouse-mysql-data-reader来实现数据导入。该工具可以实现MySQL的存量数据导出,和增量数据的导出。
按照官网推荐,使用pypy工具能够显著提升clickhouse-mysql-data-reader导入数据的性能。
工具准备
pypy/bin/pypy3 -m ensurepip
pypy/bin/pip3 install mysql-replication
和pypy/bin/pip3 install clickhouse-driver
pypy/bin/pip3 install clickhouse-mysql
, 执行pypy/bin/clickhouse-mysql --install
yum install -y clickhouse-client
yum install -y mysql-community-devel
如果是在腾讯云ClickHouse集群,上述工具已经集成,开箱即用,无需配置。
需要注意的是,如果是自行安装,请主要pymsql版本,需要安装0.9.3
准备工作完成后,即可使用该工具完成数据从MySQL导入到ClickHouse集群中。
本文以导入MySQL中clickhouse_mysql.message表至ClickHouse为例。
MySQL中表clickhouse_mysql.message Schema如下:
ClickHouse中表clickhouse_msyql.message Schema如下:
具体步骤如下:
```
create database clickhouse_mysql;
create table message (id Int64, content String) engine=MergeTree() order by tuple();
```
```
clickhouse-mysql --src-host=172.30.0.44 \
--src-user=root \
--src-password=cloud \
--migrate-table \
--src-tables=clickhouse_mysql.message \ --dst-host=172.30.0.39 \
--dst-port=9000 \
--dst-user=default \ --dst-table=message
```
步骤3: 导入增量数据
步骤3.1 创建导入数据账号以及配置权限。为了完成数据导入,所创建的用户至少需要```SELECT, REPLICATION SLAVE```权限。
假设我们创建用户 ```reader```:
```
CREATE USER 'reader'@'%' IDENTIFIED BY 'cloud';
GRANT SELECT, REPLICATION SLAVE, ON *.* TO 'reader'@'172.30.0.39';
```
步骤3.2,制作binlog位置标记文件。在mysql 中执行``` show master status```
例如输出如下:
执行 ```echo "mysql-bin.000003:326892" > /root/bin.pos```
步骤3.3,使用clickhouse-mysql工具完成增量数据导入,执行
```
clickhouse-mysql \
--src-server-id=1 \
--src-resume \
--src-host=172.30.0.44 \
--src-user=reader \
--src-password=cloud \
--binlog-position-file=/root/bin.pos \
--src-wait \
--nice-pause=1 \
--log-level=info \
--src-tables=clickhouse_mysql.message \
--dst-host=172.30.0.39 \
--dst-port=9000 \
--dst-user=default \
--dst-table=message \
--pump-data
```
其中, 参数含义如下:
src-host: MySQL数据库IP
src-user: MySQL数据库用户名
src-password:MySQL数据库密码
create-table-sql-template: 生产ClickHouse的建表脚本
with-create-database: 建表脚本中增加创建数据库语句
src-tables: 源表(MySQL表)
mempool-max-flush-interval mempool flush 的时间周期
src-server-id: 源MySQL 是否为master节点
src-resume: 断点续传
src-wait: 等待数据
nice-pause: 如果没有数据,睡眠的时间间隔
本文介绍了MySQL数据库中数据导入ClickHouse集群的步骤。
**注意**
需要注意的是,本次实验环境使用的ClickHouse版本为19.16.10.44,其中select * from mysql() 无法正确工作,是已知issue.
官方建议使用MySQL Engine来替代,也就是本文中的简易方案中提到的。
更多的ClickHouse技术交流问题,请留言,拉您进群。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。