快捷搜索: 王者荣耀 脱发

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

    需求

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

经验分享 程序员 微信小程序 职场和发展