-
简介
本文介绍三种高可用使用,及验证clickhouse的高可用性,三种方案分别如下:
不管是多分片还是多副本都是以集群方式部署,那么对外暴露多台Clickhouse服务,通常会通过LB方式使每台服务器能够均匀的接受到客户端的请求,另外一点就是在其中一台服务发生故障,仍然能通过故障转移方式正常对外提供服务。
- nginx代理
客户端连接clickhouse的时候通过nginx做负载均衡,因为本身clickhouse支持http协议,端口号为http端口,所以此种方案直接使用nginx的http代理即可。 - clickhouse驱动
Clickhouse-jdbc是使用负载均衡客户端ru.yandex.clickhouse.BalancedClickhouseDataSource来保证的,本质上是通过后台启动一个线程定时去探测clickhouse服务端,生成可用的地址列表。然后获取连接的时候从可用地址列表中随机选择一个节点来建立连接。 - 通过chproxy
chproxy即专为clickhouse使用的代理,功能更为强大。
测试服务器地址
ip |
服务 |
---|---|
10.0.10.2:8123 | clickhouse(与10.0.10.3互为为主备) |
10.0.10.3:8123 | clickhouse (与10.0.10.2互为为主备) |
10.0.10.5:8123 | chproxy |
10.0.10.5:18123 | nginx |
测试点:
- 两台clickhouse服务运行正常,查询分布到2台机器
- 任意一台宕机,程序执行正常
- 当宕机机器恢复正常,数据能从恢复
前置条件
创建本地表
CREATE TABLE repl_abc on cluster cluster1
(
`id` String,
`price` Float64,
`create_time` DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/repl_abc','{replica}')
PARTITION BY toYYYYMM(create_time)
ORDER BY id;
创建分布式表
CREATE TABLE repl_abc_all on cluster cluster1
(
`id` String,
`price` Float64,
`create_time` DateTime
)
ENGINE = Distributed('cluster1','default','repl_abc', rand());
插入测试数据
insert into repl_abc_all values('01X001',123,'2021-05-01 09:09:00'),('02X002',123,'2021-06-01 09:09:00'),('03W001