clickhouse-copier操作指南

在这里插入图片描述

前言

ClickHouse作为目前最炙手可热的OLAP引擎,早已被国内外大厂纷纷“翻牌子”。其优秀的性能早已被大家首肯。
不过clickhouse也存在一些不足,其中之一就是本身没有提供数据再平衡的能力。这在集群扩缩容方面成为一项棘手的问题。
好在clickhouse提供了一项十分有用的工具:clickhouse-copier。下面就来介绍一下。

一、clickhouse-copier介绍

clickhouse-copier工具是标准发布的clickhouse server的一部分:

  1. 可以在完全并行的模式下工作,zookeeper负责协调同步各处理进程
  2. 以最有效的方式在集群内或集群间迁移数据
  3. 为了减少网络拥塞,建议在源数据所在的服务器上运行clickhouse-copier

二、clickhouse-copier命令参数简介

在使用clickhouse-copier时,可以指定具体的参数。

参数说明
–daemon★守护进程
–umask=mask设置守护进程的umask
–pidfile=pathPid文件路径
-C[file], --config-file=[file]★配置文件,zookeeper等信息
-L[file], --log-file=[file]日志文件
-E[file], --errorlog-file=[file]错误日志文件
-P[file], --pid-file=[file]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查看帮助
–task-file=task-file上载至zookeeper任务路径的任务文件
–task-upload-force=task-upload-force强制上载任务文件即使已经存在
–move-fault-probability=move-fault-probability移动分区时,测试分区状态
–experimental-use-sample-offset=true/false使用SAMPLE OFFSET查询代替 cityHash64(PRIMARY KEY) % n == k

标★的比较重要,通常情况只需指定config-file和task-path,其他参数采用默认即可。

三、使用clickhouse-copier

1.确认源数据

  1. 创建分布式表
    ch_sit是3分片1副本的集群
CREATE TABLE hy_db.test_copier_all ON CLUSTER ch_sit
(
    ID String,
    URL String,
    EventTime Date
)
ENGINE = Distributed(ch_sit, hy_db, test_copier_local,rand());
  1. 创建分片表
create table hy_db.test_copier_local on cluster ch_sit
(
    ID String,
    URL String,
    EventTime Date
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}/{shard}/test_copier_local','{replica}')
partition by toYYYYMM(EventTime)
ORDER BY ID;
  1. 插入一些数据
insert into hy_db.test_copier_all values
('H001','www.baidu.com','2019-03-09'),
('H002','www.sina.com','2020-4-18'),
('H003','www.baidu.com','2019-03-19'),
('H003','www.tencent.com','2019-03-20');

2.创建目的表

  1. 创建待迁移的集群的分布式表
    rep_sit是一个1分片3副本的集群
CREATE TABLE test_replic.dis_copier_all ON CLUSTER rep_sit
(
    ID String,
    URL String,
    EventTime Date
)
ENGINE = Distributed(rep_sit, test_replic, dis_copier_local,rand());
  1. 创建待迁移的集群的本地表
create table test_replic.dis_copier_local on cluster rep_sit
(
    ID String,
    URL String,
    EventTime Date
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}/1/dis_copier_local','{replica}')
partition by toYYYYMM(EventTime)
ORDER BY ID;

注:目的表也可以不事先创建,只要在下文提到的schema.xml中配置后,clickhouse-copier工具也会在迁移数据时创建(不过这种情况下只有本地表,没有分布式表。如有需要可手工创建分布式表)。

3.准备一个迁移任务的配置文件

这里自定义命名为schema.xml。(这里因介绍加入一些注释,通常推荐不写)
为保护隐私,host标签中应该填IP地址或者域名,这里脱敏之。

<yandex>
    <!-- 配置源和目的集群信息 -->
    <remote_servers>
        <source_cluster >                        <!-- 源集群配置 -->
            <shard>                           <!-- 分片1信息 -->
                <weight>1</weight>
                <replica>
                    <host>IP1</host>
                    <port>10115</port>
                    <user>default</user>
                </replica>
            </shard>
            <shard>                           <!-- 分片2信息 -->
                <weight>1</weight>
                <replica>
                    <host>IP2</host>
                    <port>10115</port>
                    <user>default</user>
                </replica>
            </shard>
            <shard>                           <!-- 分片3信息 -->
                <weight>1</weight>
                <replica>
                    <host>IP3</host>
                    <port>10115</port>
                    <user>default</user>
                </replica>
            </shard>
        </source_cluster>

        <destination_cluster>                    <!-- 目的集群配置 -->
            <shard>                           <!-- 分片1信息 -->
                <weight>1</weight>
                <replica>                      <!-- 副本1信息 -->
                    <host>IP2</host>
                    <port>10115</port>
                    <user>default</user>
                </replica>
                <replica>                      <!-- 副本2信息 -->
                    <host>IP3</host>
                    <port>10115</port>
                    <user>default</user>
                </replica>
                <replica>                      <!-- 副本3信息 -->
                    <host>IP1</host>
                    <port>10115</port>
                    <user>default</user>
                </replica>
            </shard>
        </destination_cluster>
</remote_servers>

<!-- 配置并发worker数 -->
<max_workers>1</max_workers>

<!-- 源集群数据处理方式 -->
<settings_pull>
    <readonly>1</readonly>                 <!-- 只读 -->
</settings_pull>

<!-- 目的集群数据处理方式 -->
<settings_push>
    <readonly>0</readonly>                 <!-- 可读可写 -->
</settings_push>

<!—迁移任务配置 -->
<tables>
<!-- 一个迁移任务 -->
        <table_test>
            <cluster_pull>source_cluster</cluster_pull>        <!-- 源集群名 -->
            <database_pull>hy_db</database_pull>           <!-- 源数据库名 -->
            <table_pull>test_copier_local</table_pull>         <!-- 源表名 -->
            
            <cluster_push>destination_cluster</cluster_push>   <!-- 目的集群名 -->
            <database_push>test_replic</database_push>      <!-- 目的数据库名 -->
            <table_push>dis_copier_local</table_push>        <!-- 目的表名 -->
            <engine>                                     <!-- 目的表存储引擎 -->
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}/1/dis_copier_local','{replica}')
partition by toYYYYMM(EventTime)
ORDER BY ID
</engine>                  
            
<!-- 向目标集群插入时指定的分片键 -->
<sharding_key>rand()</sharding_key>

            <!-- 原表抽取时可选的过滤表达式 -->
            <where_condition>ID != 0</where_condition>

            <!-- 设置要拷贝的分区,未指定的会忽略 -->
            <enabled_partitions>
                <partition>'2018-02-26'</partition>
                <partition>'2018-03-05'</partition>
                ...
            </enabled_partitions>
        </table_test>

<!-- 另一个迁移任务 -->
        <table_event></table_event>
    </tables>
</yandex>

4.将配置文件上载至Zookeeper节点的特定路径下

clickhouse-copier是可以创建多个任务的。下面介绍创建一个任务的方式:
在zookeeper任意一个节点上执行以下命令:

> ./zkCli.sh create /clickhouse/copytasks ""
> ./zkCli.sh create /clickhouse/copytasks/task1 ""            
> ./zkCli.sh create /clickhouse/copytasks/task1/description "`cat schema.xml`"

以上命令用于创建zookeeper文件目录,即第2节中提到的task-path参数所需要指定的路径,同时将之前准备的schema.xml中配置内容写入到description中。(这里注意“`”是在英文输入状态下tab键上面的那个小点键,不是单引号)。
补充:如果在执行clickhouse-copier时,指定了参数–task-file,则可以不用执行上述命令手工上传。

5.准备zookeeper.xml配置文件

这里准备的配置文件就是第2节中提到的config-file参数所需要指定的配置文件。这里主要是指定zookeeper的一些信息。如下:

<yandex>
<!-- zookeeper配置信息 -->
    <zookeeper>
        <node index="1">
                <host>ch01-sit.xxx.com</host>
                <port>2181</port>
        </node>
        <node index="2">
                <host>ch02-sit.xxx.com</host>
                <port>2181</port>
        </node>
        <node index="3">
                <host>ch03-sit.xxx.com</host>
                <port>2181</port>
        </node>
    </zookeeper>

<!-- 日志相关配置 -->
    <logger>
        <level>trace</level>
        <size>1000M</size>
        <count>10</count>
    </logger>
</yandex>

6.执行clickhouse-copier命令迁移数据

在源数据所在服务器上执行如下命令:

./clickhouse-copier --daemon --config=zookeeper.xml --task-path=/clickhouse/copytasks/task1

在不指定base-dir参数的情况下,会在当前目录下生成一个“clickhouse-copier_时间_pid”格式的目录。里面包含log.err.log和log.log两个日志文件,可以供我们查看复制错误和详情。
至此,我们等待迁移完成即可。完成后可用select语句查询目的表验证迁移结果。

四、案例与场景介绍

clickhouse-copier功能强大,很多大厂声称自己服务可以实现扩缩容等,其实内部都是使用clickhouse-copier。下面提供一下扩展我们思路的场景

1.切分数据

假设有这样一个场景。集群1有A、B两个分片,A分片上的表的ID字段值为1-5;B分片上的表的ID字段为6-10。现在希望将他们迁移到集群2上的3个分片中,且1分片上表的ID字段值为1-3,2分片为4-6,3分片为7-10。如下图:
在这里插入图片描述
这个场景给我们几点启示:

  • 使用clickhouse-copier做迁移时,可以不必使用已存在的集群;
  • 在之前提到的配置文件中,可以灵活配置源集群和目的集群,甚至是点对点迁移;
  • 利用where_condition设置,可以让我们做到对数据的切分迁移
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值