- 需求
在使用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集群、表容量相关信息。