目前Clickhouse在线上使用,不管是多分片还是多副本都是以集群方式部署,那么对外暴露多台Clickhouse服务,通常会通过LB方式使每台服务器能够均匀的接受到客户端的请求,另外一点就是在其中一台服务发生故障,仍然能通过故障转移方式正常对外提供服务。接下来会介绍关于Clickhouse通常使用的两种LB方案。
BalancedClickhouseDataSource
BalancedClickhouseDataSource是官方提供的一种负载数据源,只需要填写多个地址即可,使用方式如下:
connection是以http方式与服务端建立请求链接,每一次调用getConnection 都会建立一次新的链接,并且是以随机的方式与集群中的一台服务建立链接,如果其中一个服务挂掉,BalancedClickhouseDataSource在默认情况下是无法检测出来的,需要打开如下设置:
将会以定期的方式检查集群中每一台服务是否正常可用,将可用的服务加入到待请求列表。但是检查周期是多少,是无法衡量的,假如在检查周期之间服务发生故障,而这个时候请求也正好需要发送到该服务上,经过实际测试,对于这种情况客户端是直接抛出连接失败异常,这种方式对于使用来说不是很友好,我们希望的是能够在请求故障时自动将请求转移到正常的服务上去,接下来介绍使用Nginx做LB方式。
Nginx
Nginx是比较常用的一种LB方式, 只需要配置一个nginx服务,并且配置对应的clickhouse地址,对外就是nginx地址即可,其有多种负载算法,轮询、权重等方式。
nginx本身支持从客户端到nginx、从nginx到clickhouse服务长链接的方式,从而避免了请求链接的频繁创建开销,在实际使用中通过离线导入clickhouse出现了所有的数据都写入到一个clickhouse节点上,排查发现是由于客户端与nginx维持了一个长链接,每次写入并没有均匀的写入所有节点,那么在客户端到nginx可以通过每次获取连接方式发送请求或者是配置写入多少次之后后台链接断开写入到一个新的节点上。
两种方式对比
•BalancedClickhouseDataSource:使用简单;但是内部随机方式,可能会导致负载不均匀,虽然有定时检测机制,但是经测试,节点挂掉,请求直接报错;
•Nginx: 支持多种请求策略、自动故障转移,扩容新增节点只需要修改其配置即可
领取专属 10元无门槛券
私享最新 技术干货