clickhouse(三、查询同步远程集群)

本文详细介绍使用ClickHouse的remote函数进行跨集群数据传输的方法,通过实例展示如何查询远程表行数及高效传输大量数据,平均速率可达132万行/秒。
  • 需求

在使用ck时,我们难免会遇到跨集群的数据传输,比如数据备份,不同环境同步数据等。之前试过查询出来再写入,数据量少的情况还能接受,超过10w这样效率就显得很低了,而大数据环境下10w当然是不能接受的。所以ck也提供了一种比较高效的方式,直接跨集群传输,减少了io次数,进而大幅度提升效率。

  • 方案

ck提供remote函数,允许我们去查询远程的服务。(这里要吐槽下ck的文档,目录结构的划分实在是很难找到相关函数)

remote('addresses_expr', db, table[, 'user'[, 'password']])
remote('addresses_expr', db.table[, 'user'[, 'password']])
  • 示例

文档里面没有测试用例,这里我再补充一个查询远程表行数命令:

SELECT count(*) FROM 
remote('ip:port', 'database', 'test', 'user', 'password');

其中remote()函数就可以理解为远程表名,需要注意的是port是指TCP端口,也是就默认的9000端口。那么如何传输数据了,其实就和本地表一样,只需要insert into test select ...就行了。当然select部分是可以多层嵌套加条件的,而remote函数就可以理解为一个表名使用。我们在内网用一个测试表在测试集群传输。

dc_sit_02 :) select count(*) from test_all;

SELECT count(*)
FROM test_all

┌───count()─┐
│ 180990246 │
└───────────┘

条数180990246,约等于1.8亿。

dc_sit_02 :) insert into test_all SELECT * FROM remote('ip:9000', 'default', 'test_all', 'default', '');

INSERT INTO test_all SELECT *
FROM remote('ip:9000', 'default', 'test_all', 'default', '')

Ok.

Elapsed: 137.199 sec. Processed 180.99 million rows, 16.41 GB (1.32 million rows/s., 119.59 MB/s.) 

可以看到执行了137秒,约等于2分钟,数据大小16.4G,实际速率和集群资源决定。平均132w行/s,查询并且插入,速度已经算很快了。
如果你也有数据传输需求,不防试一试这个利器。下一节 介绍一个运维重要知识点,查看clickhouse集群、表容量相关信息。

# 普通文本型回答 要快速将 ClickHouse A 集群的数据同步ClickHouse B 集群,推荐使用以下高效方案: --- ### ✅ 推荐方式一:`Distributed` 表 + `ON CLUSTER` + 远程读写(最快) 利用 ClickHouse 内置的 `remote()` 函数和分布式能力直接跨集群复制。 #### 步骤: 1. 在目标集群 B 上创建与源表结构一致的表(如使用 `ReplicatedMergeTree`)。 2. 使用 `INSERT INTO ... SELECT FROM remote()` 语句直接拉取数据: ```sql INSERT INTO db_b.target_table SELECT * FROM remote('A-cluster-node-addr', 'db_a.source_table', 'user', 'password'); ``` > 可结合 `ON CLUSTER` 在所有分片上批量建表。 3. 支持并行传输多个分片,速度极快。 #### 优点: - 无需中间存储 - 利用 ClickHouse 原生向量化执行引擎 - 网络带宽利用率高 --- ### ✅ 推荐方式二:`clickhouse-copier`(官方推荐,适合大表迁移) `clickhouse-copier` 是 Yandex 开发的专用数据迁移工具,支持断点续传、多线程、压缩传输。 #### 使用步骤: 1. 准备 ZooKeeper 配置(用于任务协调) 2. 编写配置文件 `config.xml`: ```xml <yandex> <remote_servers> <source_cluster> ... </source_cluster> <dest_cluster> ... </dest_cluster> </remote_servers> <shard> <source_replicas>...</source_replicas> <destination_replicas>...</destination_replicas> </shard> </yandex> ``` 3. 编写任务描述 `description.xml`: ```xml <yandex> <tables> <table> <name>table_name</name> <structure> ... </structure> <source_cluster>src</source_cluster> <destination_cluster>dst</destination_cluster> </table> </tables> </yandex> ``` 4. 启动 copier: ```bash clickhouse-copier --config /path/to/config.xml \ --task-path /copier/task/path \ --base-dir /tmp/copier ``` #### 优点: - 支持千万级分区大表 - 自动切分任务、失败重试 - 可控并发、限速 --- ### ✅ 推荐方式:导出导入法(适合小规模或网络隔离环境) #### 方法: 1. 在 A 集群导出数据为压缩格式: ```sql SELECT * FROM db_a.table FORMAT Native ``` 或使用命令行: ```bash clickhouse-client --query="SELECT * FROM db_a.table" --format=Native > data.dump ``` 2. 在 B 集群导入: ```bash clickhouse-client --query="INSERT INTO db_b.table FORMAT Native" < data.dump ``` > 支持 `gz`, `xz` 等压缩提升效率。 --- ### ✅ 推荐方式四:Kafka Engine 中转(实时+批量混合场景) 若需持续同步,可借助 Kafka: 1. A 集群写入 Kafka: ```sql CREATE TABLE kafka_source ( id UInt64, name String ) ENGINE = Kafka() SETTINGS kafka_broker_list = '...', kafka_topic_list = 'sync_topic', kafka_group_name = 'group1'; ``` 2. B 集群消费 Kafka: ```sql CREATE MATERIALIZED VIEW mv TO db_b.target_table AS SELECT * FROM kafka_source; ``` > 实现近实时同步。 --- ### 📌 总结:选择建议 | 场景 | 推荐方式 | |------|----------| | 一次性批量迁移大表 | ✅ `clickhouse-copier` | | 小表快速复制 | ✅ `remote()` + `INSERT SELECT` | | 实时/增量同步 | ✅ Kafka 引擎中转 | | 网络隔离环境 | ✅ 导出 Native 格式再导入 | --- ✅ 最佳实践建议: > 对于**首次全量同步**,优先使用 `clickhouse-copier`; > 对于**临时快速拷贝**,使用 `INSERT INTO ... SELECT remote(...)` 更加简洁高效。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值