ClickHouse数据迁移工具之clickhouse-copier

ClickHouse数据迁移工具之clickhouse-copier

clickhouse需要从单节点迁移至副本集群中,表结构统一修改为副本表

网上搜到的迁移方式大致为三种。

  • 一、拷贝数据目录

    操作流程

    1. 在源集群的硬盘上打包好对应数据库或表的 data 和 metadata 数据

    2. 拷贝到目标集群对应的目录

    3. 重启 clickhouse-server

  • 二、remote函数

    INSERT INTO <local_database>.<local_table>
    SELECT * FROM remote('remote_clickhouse_addr', <remote_database>, <remote_table>, '', '')
    
  • 三、clickhouse-copier

    clickhouse-copier是 ClickHouse 官方提供的一款数据迁移工具,可用于把表从一个集群迁移到另一个(也可以是同一个)集群。Clickhouse-copier 使用 Zookeeper 来管理同步任务,可以同时运行多个 clickhouse-copier 实例

由于数据迁移后的每个表需要在集群上创建一份副本集,因此将迁移后的所有表引擎需要修改为ReplicatedMergeTree家族。

这里使用clickhouse-copier和remote(用来同步没有分区的表)进行数据迁移

clikhouse-copier

  • 优点

    • 支持并发同步,可以运行多个clickhouse-copier实例
    • 使用zookeeper同步写入状态,支持增量同步
    • 可以在配置文件内重新定义写入的表引擎
    • 表名与数据库名不需要相同
    • 可指定source与sink的shard,replica
  • 缺点

    • 配置文件较为繁琐,每个不同实例clickhouse-copier任务的配置文件都需要上传至zookeeper相应实例节点上
    • 慢。相比于直接迁移文件,clickhouse-copier相当于多次执行insert into操作,因此迁移速度较慢
  • 使用clickhouse-copier需要注意的点

    • source表需要定义了partition,不然任务同步报错
    • zookeeper内存储的是已处理过的partition信息,再次运行clickhouse-copier,同步的仅是未处理过的partition数据。对于已经同步后的partition,即使partition内有新增数据,也不会同步到目标集群上。
    • clickhouse-copier无法同步普通视图,但可以同步物化视图,若同步物化视图,需要在source的表名前加上.inner.,不然会提示找不到table
    • 使用Clickhouse-copier需要借助zookeeper,为减少网络流量,建议clickhouse-copier在源数据所在的服务器上运行。
  • clickhouse-copier --config test.xml --task-path /clickhouse/copier_task2/download_task

    • 常用参数

      daemon — 后台运行copier工具,进程将在后台启动。 
      
      config — zookeeper.xml的存放路径,用来连接zookeeper集群。
      
      task-path — zookeeper上的存储节点路径,例如:/clickhouse/copier_task/task1;该路径中的内容用来存储任务,以及多个copier进程间的协调信息,建议不同的数据任务,路径不要重名,例如:/clickhouse/copier_task/task2,task3,task4,或者每天同步做一次数据copy的话,也可以以当天日期命名,task-2021-01-27,但同一任务的不同copier进程要保持一致的配置路径。
      
      task-file — 指向配置了任务的配置文件,例如:copy-job.xml,该文件内容会上传到zookeeper的/clickhouse/copier_task/task1/description节点。
      
      task-upload-force — 若设置为true,那么将根据task-file文件的内容,强制刷新覆盖上个参数提到的zookeeper的description节点。
      
      base-dir — 会存储一些日志以及相关的辅助型文件,copier工具进程启动后,会在$base-dir创建copier_YYYYMMHHSS_<PID>格式的子目录(日志文件会在该子目录下,以及辅助型分布式表的相关信息在data目录下),若没有传该参数,则在copier运行的当前目录创建。
      

clickhouse-copier同步流程

1.创建zookeeper.xml配置信息

<yandex>
    <logger>
        <level>tracelevel>
        <log>./log/clickhouse-copier/copier/log.loglog>
        <errorlog>./log/clickhouse-copier/copier/log.err.logerrorlog>
        <size>100Msize>
        <count>3count>
    logger>

    <zookeeper>
    	<node>
        	<host>data-hadoop-1host>
        	<port>2181port>
    	node>
    	<node>
        	<host>data-hadoop-2host>
        	<port>2181port>
    	node>
    	<node>
        	<host>data-hadoop-3host>
        	<port>2181port>
    	node>
        <node>
        	<host>data-hadoop-4host>
        	<port>2181port>
    	node>
        <node>
        	<host>data-hadoop-5host>
        	<port>2181port>
    	node>
	zookeeper>
yandex>

2.在zookeeper上创建任务路径

zkCli -server hadoop-110:2181 create /clickhouse/copier_task

zkCli -server hadoop-110:2181 create /clickhouse/copier_task/${task_name}

3.创建对应的${task_name}.xml配置信息

<yandex>
    
    <remote_servers>
         
        <test_shard_localhost>
            <shard>
                <internal_replication>falseinternal_replication>
                    <replica>
                        <host>data-hadoop-5host>
                        <port>9000port>
                        <user>defaultuser>
                        <password>testpassword>
                    replica>
            shard>
        test_shard_localhost>
		 
        <bigdata_one_shard_two_replication>
          <shard>
            <internal_replication>trueinternal_replication>
            <replica>
                <host>data-clickhouse-1host>
                <port>9000port>
                <user>defaultuser>
            replica>
            <replica>
                <host>data-clickhouse-2host>
                <port>9000port>
                <user>defaultuser>
            replica>
          shard>
        bigdata_one_shard_two_replication>
    remote_servers>
     
    <max_workers>4max_workers>
	 
    <tables>
         
        <table_test>
            
            <cluster_pull>test_shard_localhostcluster_pull>
            <database_pull>dwdatabase_pull>
            <table_pull>testtable_pull>
            
            <cluster_push>bigdata_one_shard_two_replicationcluster_push>
            <database_push>dwdatabase_push>
            <table_push>testtable_push>
            
            <engine>
            ENGINE=ReplicatedMergeTree('/clickhouse/tables/{shard}/dw/test', '{replica}')
            PARTITION BY toYYYYMMDD(toDateTime(trace_download_ts))
			ORDER BY tuple()
            SETTINGS index_granularity = 8192 
            engine>
            
            <sharding_key>01sharding_key>
            
            
            
            
        table_test>
        
    tables>
yandex>

4.将相应的${task_name}.xml上传到相应zookeeper路径的${path}/description节点上,有两种方法。

  • 一种是直接将文件内容上传至description节点上

    zkCli -server hadoop-110:2181 create /clickhouse/copier_task/${task_name}/description "`cat ${task_name}.xml`"

  • 一种是利用参数上传文件

    clickhouse-copier --config zookeeper.xml --task-path /clickhouse/copier_task/${task_name} --task-file=${task_name}.xml

5.执行clickhouse-copier

clickhouse-copier --config zookeeper.xml --task-path /clickhouse/copier_task/${task_name}

你可能感兴趣的:(ClickHouse,大数据)