查看: 77|回复: 0

MySQL到ClickHouse数据的迁移和复制

[复制链接]

2

主题

8

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2023-1-12 12:21:25 | 显示全部楼层 |阅读模式
Altinity开发了一个开源的clickhouse-mysql工具,该工具可帮助将现有的MySQL表迁移到ClickHouse并设置将更改从MySQL实时复制到ClickHouse(仅适用于INSERTS)。在这里,我们通过一个简单的示例演示如何做到这一点。
我们将使用航空公司准时测试数据集的子集:
mysql> select count(*) from airline.ontime;    +----------+    | count(*) |    +----------+    |  1289551 |    +----------+
迁移过程包括三个步骤:

创建CH表
将现有数据从MySQL复制到CH
设置MySQL到ClickHouse的复制

先决条件
clickhouse-mysql是Python脚本,因此需要安装Python> = 3.5。“ pypy”比预期的效果更好。
MySQL和ClickHouse集成需要以下模块:

pip install mysqlclient
pip install mysql-replication
pip install clickhouse-driver
MySQL应该为复制启用了binlog。

1.创建ClickHouse表。
clickhouse-mysql有几种模式。我们从ClickHouse表创建助手开始。
pypy clickhouse-mysql.py --log-file=/dev/null --src-host=127.0.0.1 --src-user=root --src-only-tables=airline.ontime --table-templates
这将生成需要手动编辑的ClickHouse表DDL模板。
CREATE TABLE `airline`.`ontime` (     `Year` Nullable(UInt16), ... CUT ...     `Div5TailNum` Nullable(String) ) ENGINE = MergeTree(<PRIMARY_DATE_FIELD>,  (<COMMA_SEPARATED_INDEX_FIELDS_LIST>), 8192)
需要手动进行以下更改:

指定分区列(<PRIMARY_DATE_FIELD>)。
指定主键列(<COMMA_SEPARATED_INDEX_FIELDS_LIST>)
确保分区和主键列不可为空。
例如,它看起来像
CREATE TABLE `airline`.`ontime` (     `Year` UInt16, ...CUT...     `Div5TailNum` Nullable(String) ) ENGINE = MergeTree(FlightDate, (FlightDate, Year, Month), 8192)
准备好表定义后,运行clickhouse-client将其创建为交互模式或从文件创建。

2.将现有数据从MySQL复制到ClickHouse
可以使用标准MySQL和ClickHouse命令执行数据复制。
sudo mysqldump \ -u root \ --tz-utc \ --quick \ --fields-terminated-by=, \ --fields-optionally-enclosed-by=\" \ --fields-escaped-by=\\ \ --tab="$CSV_FILES_DIR"/ \ airline ontime  sudo cat "$CSV_FILES_DIR"/ontime.txt | clickhouse-client --query="INSERT INTO airline.ontime FORMAT CSV"
如果没有错误,您可以检查clickhouse-client中的表:
:) select count() from airline.ontime;  SELECT count() FROM airline.ontime  ┌─count()─┐ │ 1289551 │ └─────────┘

3.设置MySQL到ClickHouse的复制
可以通过示例shell脚本启动ontime数据库的复制日志读取器:
./examples/run_airline_ontime_data_mysql_to_ch_reader.sh
如果您好奇它的作用,它将使用以下参数运行“ clickhouse-mysql”:
pypy clickhouse-mysql \ --src-resume \ --src-wait \ --nice-pause=1 \ --log-level=info \ --log-file=ontime.log \ --src-host=127.0.0.1 \ --src-user=root \ --dst-host=127.0.0.1 \ --csvpool \ --csvpool-file-path-prefix=qwe_ \ --mempool-max-flush-interval=60 \ --mempool-max-events-num=10000
现在让我们测试如何将插入内容从MySQL传播到ClickHouse。我们将在MySQL中复制数据。
mysql> insert into airline.ontime select * from airline.ontime;   mysql> select count(*) from airline.ontime; +----------+ | count(*) | +----------+ |  2579102 | +----------+
并检查ClickHouse一侧。
:) select count() from airline.ontime;  SELECT count() FROM airline.ontime  ┌─count()─┐ │ 2579102 │ └─────────┘
插入的记录已填充到ClickHouse。
结论
几个月前,ProxySQL 引入了ClickHouse支持,允许通过MySQL协议访问ClickHouse。我们对此进行了进一步介绍,并证明可以使用MySQL Binlog读取技术在ClickHouse中实时获取MySQL数据。有多种方法可以做到这一点。像Altinity'clickhouse-mysql'原型这样的自定义实现是一种方法,或者可以使用更多通用技术,例如Uber的StorageTapper从MySQL二进制日志生成Kafka流,然后可以使用Kafka引擎或专用使用者将其插入ClickHouse。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表