精华 用DNS轮询,均衡写入多个ClickHouse节点时,是否要禁用ClickHouse JDBC的http连接池?

发布于 5 年前 作者 kikanjuu 9262 次浏览 来自 问答

我想实现的效果是,按2万条记录为一个批次,写入ClickHouse。 各个批次的数据,通过域名解析到不同的ClickHouse节点,均衡地写入集群中的各个节点。

我看到ClickHouse JDBC的源代码中,在构建http client时,使用了http连接池。 如果http连接被长期缓存、复用,那么域名解析就不会频繁发生,数据也就不会频繁通过DNS轮询,分散写入到各个节点。

所以,这种场景下,我需要禁用http连接池吗?

12 回复

JDBC好像可以这样指定多个IP或者域名

host=ip1,ip2,ip3,ip4

而且会主动帮你做故障检测

@jackpgao 你们的写入时DNS轮询是如何实现的?

@kikanjuu

假如有4个节点,我们会每个节点有一个1对1的域名,用于做集群的配置,同时还有1个1对4的总域名,用于DNS做负载均衡。

在JDBC环境下,是存在你说的问题的,所以,JDBC连接里,写的是逗号分隔的4个域名,人肉做了LB。

如果是Python或者Golang,用的是总域名,用DNS做LB。

@jackpgao JDBC和Python, Golang本质上都是http客户端,JDBC有没有办法改改,达到Python, Golang一样的效果?

@kikanjuu Golang是TCP原生协议。JDBC已经有人开发了:https://github.com/houseflys/ClickHouse-Native-JDBC 张健搞的,你可以试试。

@jackpgao 谢谢。我们用Spark分区,实现了均衡写入集群各个节点。DNS轮询的均衡性和网络有关,并不靠谱,放弃了这个做法。

@jackpgao 这种方式做不到故障检测,会出现单点故障(针对一楼的回复)

@kikanjuu 你好,麻烦问下,一个或多个分区对应一个节点么?

@moxiaofan 是这样的。

话说有没有php的原生PDO

@moxiaofan 一张分布式表对应多个节点,每个节点对应一个shard,一个shard里有多个分区。

回到顶部