使用clickhouse-copier在ClickHouse表间快速同步数据

  |   0 评论   |   1,088 浏览

背景

在小表之间同步数据,我们可以直接使用INSERT INTO xxx SELECT * FROM yyy的方式

但是对于比较大的表,或者在不同集群之间同步数据,使用这种方式就会有以下问题:

  • 比较慢

  • 直接写本地表的话,就需要在所有节点上都执行这个语句,操作太复杂;

  • 无法完成集群间的数据同步

因此我们尝试clickhouse-copier工具

步骤

准备配置文件

zookeeper的配置文件

vim /usr/local/clickhouse-copier/zookeeper.xml


<yandex>
    <logger>
        <level>trace</level>
        <size>100M</size>
        <count>3</count>
    </logger>
    <zookeeper>
        <node index="1">
            <host>zoo1</host>
            <port>2181</port>
        </node>
    </zookeeper>
</yandex>

任务描述文件

先创建一个xml

vim /usr/local/clickhouse-copier/cxy7_order_replica.xml


<yandex>
    <!-- Configuration of clusters as in an ordinary server config -->
    <remote_servers>
        <source_cluster>
            <!-- 数据分片1  -->
            <shard>
                <internal_replication>false</internal_replication>
                <replica>
                    <host>cxy7.com</host>
                    <port>9123</port>
                    <user>xxx</user>
                    <password>xxx</password>
                </replica>
            </shard>
            <!-- 数据分片2  -->
            ...
        </source_cluster>
        <destination_cluster>
        <!-- 数据分片1  -->
            <shard>
                <internal_replication>false</internal_replication>
                <replica>
                    <host>cxy7.com</host>
                    <port>9123</port>
                    <user>xxx</user>
                    <password>xxx</password>
                </replica>
            </shard>
            <!-- 数据分片2  -->
            ...
        </destination_cluster>
    </remote_servers>
    <!-- How many simultaneously active workers are possible. If you run more workers superfluous workers will sleep. -->
    <max_workers>4</max_workers>
    <!-- Setting used to fetch (pull) data from source cluster tables -->
    <settings_pull>
        <readonly>1</readonly>
    </settings_pull>
    <!-- Setting used to insert (push) data to destination cluster tables -->
    <settings_push>
        <readonly>0</readonly>
    </settings_push>
    <!-- Common setting for fetch (pull) and insert (push) operations. Also, copier process context uses it.
         They are overlaid by <settings_pull/> and <settings_push/> respectively. -->
    <settings>
        <connect_timeout>3</connect_timeout>
        <!-- Sync insert is set forcibly, leave it here just in case. -->
        <insert_distributed_sync>1</insert_distributed_sync>
    </settings>
    <!-- Copying tasks description.
         You could specify several table task in the same task description (in the same ZooKeeper node), they will be performed
         sequentially.
    -->
    <tables>
        <!-- A table task, copies one table. -->
        <table_hits>
            <!-- Source cluster name (from <remote_servers/> section) and tables in it that should be copied -->
            <cluster_pull>source_cluster</cluster_pull>
            <database_pull>cxy7_db</database_pull>
            <table_pull>cxy7_order</table_pull>
            <!-- Destination cluster name and tables in which the data should be inserted -->
            <cluster_push>destination_cluster</cluster_push>
            <database_push>cxy7_db</database_push>
            <table_push>cxy7_order_replica</table_push>
            <!-- Engine of destination tables.
                 If destination tables have not be created, workers create them using columns definition from source tables and engine
                 definition from here.
                 NOTE: If the first worker starts insert data and detects that destination partition is not empty then the partition will
                 be dropped and refilled, take it into account if you already have some data in destination tables. You could directly
                 specify partitions that should be copied in <enabled_partitions/>, they should be in quoted format like partition column of
                 system.parts table.
            -->
            <engine>
            ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/cxy7_db/cxy7_order_replica', '{replica}')
            PARTITION BY date
            ORDER BY (event)
            </engine>
            <!-- Sharding key used to insert data to destination cluster -->
            <sharding_key>sipHash64(uuid)</sharding_key>
            <!-- Optional expression that filter data while pull them from source servers -->
            <!-- This section specifies partitions that should be copied, other partition will be ignored.
                 Partition names should have the same format as
                 partition column of system.parts table (i.e. a quoted text).
                 Since partition key of source and destination cluster could be different,
                 these partition names specify destination partitions.
                 NOTE: In spite of this section is optional (if it is not specified, all partitions will be copied),
                 it is strictly recommended to specify them explicitly.
                 If you already have some ready paritions on destination cluster they
                 will be removed at the start of the copying since they will be interpeted
                 as unfinished data from the previous copying!!!
            -->
            <enabled_partitions>
                <partition>'2019-10-13'</partition>
            </enabled_partitions>
        </table_hits>
    </tables>
</yandex>

将任务描述文件上传到zookeeper

cd /opt/cloudera/parcels/CDH/lib/zookeeper
bin/zkCli.sh -server cxy7.com:2181 create /clickhouse/copytasks ""
bin/zkCli.sh -server cxy7.com:2181 create /clickhouse/copytasks/task1 ""
bin/zkCli.sh -server cxy7.com:2181 create /clickhouse/copytasks/task1/description "`cat /usr/local/clickhouse-copier/cxy7_order_replica.xml`"

如果要更新任务描述信息,可以使用

bin/zkCli.sh -server cxy7.com:2181 set /clickhouse/copytasks/task1/description "`cat /usr/local/clickhouse-copier/cxy7_order_replica.xml`"

启动clickhouse-copier

clickhouse-copier copier --daemon --config /usr/local/clickhouse-copier/zookeeper.xml --task-path /clickhouse/copytasks/task1 --base-dir /data/clickhouse-copier

查看任务同步状态

在/data/clickhouse-copier目录下会创建一个当前任务的子目录,可以通过查看下面的日志来了解任务同步状态


读后有收获可以支付宝请作者喝咖啡