手把手教你:将ClickHouse集群迁至云上
1. 前言
随着云上ClickHouse服务完善,越来越多的用户将自建ClickHouse服务迁移至云上。对于不同数据规模,我们选择不同的方案:
- 对于数据量比较小的表,通常小于10GB情况下,可以将数据到处为CSV格式,在云上集群重新写入数据;
- 使用clickhouse发行版自带工具clickhouse-copier 来完成。
本文详解clickhouse-copier 完成跨ClickHouse集群数据迁移(当然也可以用户集群内部数据不同表间数据迁移)。
2. Zookeeper集群准备
如果已经有Zookeeper集群,请忽略本章节。
由于clickhouse-copier 需要Zookeeper存储数据迁移任务信息,需要部署一个Zookeeper集群。
Zookeeper集群到源ClickHouse集群与目标ClickHouse集群之间的网络是正常的。
在本文中,我们部署一个单节点的Zookeeper集群。
步骤1: 准备可执行文件
$ wget http://apache.is.co.za/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1.tar.gz
$ tar -xvf zookeeper-3.6.1.tar.gz
$ chown hadoop:hadoop -R zookeeper-3.6.1
步骤2:切换到hadoop账号
su hadoop
步骤3: 准备配置文件 conf/zoo.cfg,填写配置,举例如下:
tickTime=2000
dataDir=/var/data/zookeepe
clientPort=2181
步骤4:增加myid文件
echo 1 > /var/data/zookeeper/myid
步骤5:启动Zookeeper进程
$ bin/zkServer.sh start
后续,我们可以用该Zookeeper存储数据迁移任务信息。
3. 定义迁移任务
在任务迁移数据前,需要定义迁移任务。迁移任务信息定义在xml文件中。具体包含如下信息:
- 源集群,包含数据分片信息
- 目的集群,包含数据分片信息
- 执行数据迁移任务的线程数量
- 定义待迁移的表信息,有tables字段指定,包括:
- 数据源集群名称,由cluster_pull指定
- 数据源数据库名称,由database_pull指定
- 数据源表名称,由table_pull指定
- 目的集群名称,由cluster_push指定
- 目的数据库名称,由database_push指定
- 目的表名称,由table_push指定
- 目的表引擎定义,由engine指定
- 待迁移的partition列表,由enabled_partitions指定。未指定,则全表迁移
如果目标集群数据库不存在,则不会自动创建。故迁移数据前,确保目标集群数据库存在。源表和目标表的Schema相同,表引擎可以不相同。
举例如下:
<yandex>
<!-- Configuration of clusters as in an ordinary server config -->
<remote_servers>
<source_cluster>
<shard>
<internal_replication>false</internal_replication>
<replica>
<host>172.16.0.72</host>
<port>9000</port>
</replica>
</shard>
</source_cluster>
<destination_cluster>
<shard>
<internal_replication>false</internal_replication>
<replica>
<host>172.16.0.115</host>
<port>9000</port>
</replica>
<replica>
<host>172.16.0.47</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>false</internal_replication>
<replica>
<host>172.16.0.138</host>
<port>9000</port>
</replica>
<replica>
<host>172.16.0.49</host>
<port>9000</port>
</replica>
</shard>
</destination_cluster>
</remote_servers>
<!-- How many simultaneously active workers are possible. If you run more workers superfluous workers will sleep. -->
<max_workers>8</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>
<settings>
<connect_timeout>300</connect_timeout>
<!-- Sync insert is set forcibly, leave it here just in case. -->
<insert_distributed_sync>1</insert_distributed_sync>
</settings>
<tables>
<!-- A table task, copies one table. -->
<table_lineorder>
<!-- Source cluster name (from <remote_servers/> section) and tables in it that should be copied -->
<cluster_pull>source_cluster</cluster_pull>
<database_pull>default</database_pull>
<table_pull>lineorder</table_pull>
<!-- Destination cluster name and tables in which the data should be inserted -->
<cluster_push>destination_cluster</cluster_push>
<database_push>default</database_push>
<table_push>lineorder_7</table_push>
<engine>
ENGINE=ReplicatedMergeTree('/clickhouse/tables/{shard}/lineorder_7','{replica}')
PARTITION BY toYear(LO_ORDERDATE)
ORDER BY (LO_ORDERDATE, LO_ORDERKEY)
</engine>
<!-- Sharding key used to insert data to destination cluster -->
<sharding_key>rand()</sharding_key>
<!-- Optional expression that filter data while pull them from source servers -->
<!-- <where_condition></where_condition> -->
<!--
<enabled_partitions>
</enabled_partitions>
-->
</table_lineorder>
</tables>
</yandex>
准备完成配置文件后,在Zookeeper上准备路径,并将定义任务文件上传到Zookeeper中。假设配置文件为task.xml, 执行如下指令:
$ bin/zkCli.sh create /clickhouse/copytasks ""
$ bin/zkCli.sh create /clickhouse/copytasks/task ""
$ bin/zkCli.sh create /clickhouse/copytasks/task/description "`cat ./task.xml`"
4. 启动任务
定义好迁移任务后,就可以启动clickhouse-copier来迁移数据了。在此之前,需要准备的配置文件, 配置文件中描述了Zookeeper地址,以及日志配置。举例如下:
<yandex>
<logger>
<level>trace</level>
<size>100M</size>
<count>3</count>
</logger>
<zookeeper>
<node index="1">
<host>172.16.0.139</host>
<port>2181</port>
</node>
</zookeeper>
</yandex>
假设该文件命名为config.xml
可以使用如下命令启动clickhouse-copier:
$ clickhouse-copie
--config ./config.xml
--task-path /clickhouse/copytasks/task
--base-dir ./clickhouse
其中,--task-path指定数据迁移任务在Zookeeper上的路径,即第3节中创建的路径。需要主要的是,路径下必现包含description文件。
如果数据量比较多,可以部署多个clickhouse-copier并发执行迁移任务。
5. 总结
clickhouse-copier是ClickHouse发行版自带的工具,在稳定性可靠性上是有保证的。在使用过程中,需要注意的问题:
- 在迁移过程中,源集群的表需要停止写入;
- 在迁移过程中,占用源,目的集群网络带宽,需要仔细评估;
- clickhouse-copier提供了较多灵活性,包括数据分片算法,指定迁移表的partitions;
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 贷款违约预测-Task2 数据分析
- Redis 最牛实践:业务层面和运维层面优化!
- 一个 randomkey 命令导致的 Redis 事故。。
- 分布式锁(数据库、Redis、ZK)拍了拍你
- 贷款违约预测-Task3 特征工程
- 用SQL代替DSL查询ElasticSearch怎样?
- 面试造飞机:面对Redis持久化连环Call,你还顶得住吗?
- 体验spring-boot-devtools热部署,流畅且不失强大,Jrebel呢?
- 贷款诈骗 x 摸版0day + 实战预警脚本
- 你不知道的 Linux 使用技巧
- 一文详解 Websocket 的前世今生
- 实例 | 教你用Python写一个电信客户流失预测模型
- OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测
- 看了这个总结,其实 Matplotlib 可视化,也没那么难!
- 使用OpenCV进行模糊检测(拉普拉斯算子)