在使用clickhouse的时候,可能会有不同集群间迁移数据需求,这里可以使用如下几种方式:
DETACH/FREEZE分区,进行SCP拷贝,然后再ATTACH
alter table db.table DETACH PARTITION [partition]; #下线分区
alter table db.table FREEZE PARTITION [partition]; #备份分区
alter table db.table ATTACH PARTITION [partition]; #上线分区
利用remote函数
insert into ... select * from remote('ip',db.table,'user','password')
clickhouse-copier工具
这个工具是标准发布的clickhouse server的一部分,它可以在完全并行的模式下工作, 并以最有效的方式分发数据
三种方式的优缺点:
方式 | 优点 | 缺点 |
DETACH/FREEZE | 适用小表; | 源和目标集群分区数量需要一样; 操作较繁琐; |
remote | 适用小表; 操作方便; |
大表速度较慢; |
clickhouse-copier | 并行操作; 可以变更表名主键; 可以变更分区; |
配置繁琐; 需要借助zookeeper使用; |
本文主要介绍Clickhouse-copier的使用方式
Clickhouse-copier是在安装clickhouse软件后自带的工具命令。
> clickhouse-copier --help
usage: clickhouse-copier --config-file Copies tables from one cluster to another |
|
--daemon | ★守护进程 |
--umask=mask | 设置守护进程的umask |
--pidfile=path | Pid文件路径 |
-C |
★配置文件,zookeeper等信息 |
-L |
日志文件 |
-E |
错误日志文件 |
-P |
Pid文件 |
--task-path=task-path | ★Zookeeper中的任务路径 |
--safe-mode | ★禁止ALTER DROP PARTITION |
--copy-fault-probability=copy-fault-probability | 指定分区时,测试分区状态 |
--log-level=log-level | 日志级别,debug |
--base-dir=base-dir | ★默认当前路径,生成目录clickhouse-copier_日期_Pid |
--help | 查看帮助 |
标★的比较重要,通常情况只需指定--daemon、--config和--task-path ,其他采用默认即可。
使用Clickhouse-copier需要借助zookeeper,为减少网络流量,建议clickhouse-copier在源数据所在的服务器上运行。
一、首先需要准备一个schema.xml配置
包括源和目标的集群分片信息,以及需要同步的表信息
1
10.10.1.1
user
password
9000
1
10.10.1.2
user
password
9000
1
10.10.1.3
user
password
9000
1
10.10.1.4
user
password
9000
2
1
0
3
1
source_cluster
default
test1
destination_cluster
default
test1
ENGINE=ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/default/test1', '{replica}')
PARTITION BY toMonday(EventDate)
ORDER BY (ID, EventDate)
rand()
关于schema.xml配置格式可参考: https://clickhouse.yandex/docs/en/operations/utils/clickhouse-copier/
二、完成schema.xml配置后,需要将此配置上载至 Zookeeper 节点的特定路径下 (/
可以创建多个任务
在zookeeper随便一个节点机器执行以下命令:
> ./zkCli.sh create /clickhouse/copytasks ""
> ./zkCli.sh create /clickhouse/copytasks/task1 ""
> ./zkCli.sh create /clickhouse/copytasks/task1/description "`cat schema.xml`"
三、准备zookeeper.xml配置文件
10.1.1.5
2181
trace
./log/log.log
./log/log.err.log
1000M
10
./log/stderr.log
./log/stdout.log
四、在clickhouse机器启动
源和目标都可以,为减少网络流量,建议clickhouse-copier在源数据所在的服务器上运行。
> clickhouse-copier --config zookeeper.xml --task-path /clickhouse/copytasks/task1 --daemon
工具启动后,需要一段时间才能完成任务,具体取决于要复制的表的大小。若未指定--base-dir,则在当前所在目录下生成 clickhouse-copier_时间_pid 格式的目录,目录下包含两个日志文件,可以通过这两个日志文件查看复制错误及详情。
log.err.log #记录错误,此错误是目标没有表,但会自动创建
log.log #记录执行详细信息
五、注意事项
1、源和目标集群名称不能一样,会把源覆盖掉(重要)
2、如果目标没有库,不会自动创建库,需要提前建库
3、如果目标没有表,会自动创建表
4、复制表,副本需要手动创建表
5、目标库可以更改表名、分区、排序等
六、性能
源 | 目标 | 数据量 | 数据大小 | 时间 |
1片 | 1片 | 60亿 | 80G | 180分钟 |
1片 | 2片 | 60亿 | 80G | 180分钟 |
2片 | 2片 | 60亿 | 80G | 60分钟 |
6片 | 6片 | 60亿 | 80G | 40分钟 |
七、结论
Clickhouse-copier可以在不同集群间迁移数据,还可以用于重新分片或更改表名及主键。在一个1对1的环境中,它的性能与insert ... select相同,但当它应用于大型ClickHouse集群时,它的性能拷贝速度会有很大提升,并且规避了并行复制任务带来的诸多问题。
————————————————
版权声明:本文为CSDN博主「MYSQL轻松学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liang_0609/article/details/86707834