clickhouse 三种高可用方案

article/2025/10/12 15:33:26
  1. 简介

 

本文介绍三种高可用使用,及验证clickhouse的高可用性,三种方案分别如下:

不管是多分片还是多副本都是以集群方式部署,那么对外暴露多台Clickhouse服务,通常会通过LB方式使每台服务器能够均匀的接受到客户端的请求,另外一点就是在其中一台服务发生故障,仍然能通过故障转移方式正常对外提供服务。

 

  1. nginx代理
    客户端连接clickhouse的时候通过nginx做负载均衡,因为本身clickhouse支持http协议,端口号为http端口,所以此种方案直接使用nginx的http代理即可。
  2. clickhouse驱动
    Clickhouse-jdbc是使用负载均衡客户端ru.yandex.clickhouse.BalancedClickhouseDataSource来保证的,本质上是通过后台启动一个线程定时去探测clickhouse服务端,生成可用的地址列表。然后获取连接的时候从可用地址列表中随机选择一个节点来建立连接。
  3. 通过chproxy
    chproxy即专为clickhouse使用的代理,功能更为强大。

测试服务器地址

ip

服务

10.0.10.2:8123clickhouse(与10.0.10.3互为为主备)
10.0.10.3:8123clickhouse (与10.0.10.2互为为主备)
10.0.10.5:8123chproxy  
10.0.10.5:18123nginx

测试点:

  1. 两台clickhouse服务运行正常,查询分布到2台机器
  2. 任意一台宕机,程序执行正常
  3. 当宕机机器恢复正常,数据能从恢复
前置条件

    创建本地表

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',321,'2021-05-01 09:09:00'),('04W002',321,'2021-06-01 09:09:00'),('05K001',123,'2021-05-01 09:09:00'),('06K002',123,'2021-06-01 09:09:00'),('07M001',321,'2021-05-01 09:09:00'),('08M002',321,'2021-06-01 09:09:00'),('09S001',123,'2021-05-01 09:09:00'),('10S002',123,'2021-06-01 09:09:00'),('11G001',321,'2021-05-01 09:09:00'),('12G002',321,'2021-06-01 09:09:00');

1.使用nginx代理

 

  在nginx中增加配置

upstream clickhouse {
    server 10.0.10.2:8123 max_fails=3 fail_timeout=10s;
    server 10.0.10.3:8123 max_fails=3 fail_timeout=10s;
}

server {
    listen       18123;
    location / {
        proxy_pass   http://clickhouse;
    }
}

使用systemctl stop clickhouse 模拟一台clickhouse 宕机,返回数据正常。

上述java测试代码 url 更改为 

String url = "jdbc:clickhouse://10.0.10.5:8123/default";

在任意一台clickhouse模拟宕机,测试是否查询正常。

    #systemctl stop clickhouse

 

模拟数据写入和恢复

执行

insert into repl_abc_all values('001',123,now());

成功,并且可以查询到数据。

重新启动宕机的clickhouse,从宕机的clickhouse再次查询,刚才插入的数据。数据返回正常,说明数据恢复成功。

select * from repl_abc where id='001';

 

2. 使用官方的客户端做高可用

    基本逻辑如下:

  • 1.通过配置的url串,来切分构造url列表;
  • 2.通过一个定时线程任务,来不断的去ping url列表,来更新可用的url列表;
  • 3.在可用列表中随机返回一个可用url;
 示例代码:
package com.example.clickhousedemo;import ru.yandex.clickhouse.BalancedClickhouseDataSource;
import ru.yandex.clickhouse.settings.ClickHouseProperties;import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Clickhouse_JDBC_test {public static void main(String[] args) throws Exception {exeSql("select count(1) from repl_abc_all");}public static void exeSql(String sql) throws SQLException {String url = "jdbc:clickhouse://10.0.10.2:8123,10.0.10.3:8123/default";ClickHouseProperties clickHouseProperties = new ClickHouseProperties();clickHouseProperties.setUser("default");clickHouseProperties.setPassword("");BalancedClickhouseDataSource balanced = new BalancedClickhouseDataSource(url, clickHouseProperties);//对每个host进行ping操作, 排除不可用的连接balanced.actualize();Connection connection = balanced.getConnection();Statement statement = null;ResultSet results = null;try {statement = connection.createStatement();long begin = System.currentTimeMillis();results = statement.executeQuery(sql);long end = System.currentTimeMillis();System.out.println("执行("+sql+")耗时:"+(end-begin)+"ms");ResultSetMetaData rsmd = results.getMetaData();List<Map> list = new ArrayList();while(results.next()){Map map = new HashMap();for(int i = 1;i<=rsmd.getColumnCount();i++){map.put(rsmd.getColumnName(i),results.getString(rsmd.getColumnName(i)));}list.add(map);}for(Map map : list){System.err.println(map);}} catch (Exception e) {e.printStackTrace();}finally {//关闭连接try {if(results!=null){results.close();}if(statement!=null){statement.close();}if(connection!=null){connection.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

3. 使用chproxy做高可用

chproxy介绍 https://www.chproxy.org/cn

chproxy 安装
从https://github.com/ContentSquare/chproxy/releases 下载二进制包
下载地址: wget -c https://github.com/Vertamedia/chproxy/releases/download/v1.14.0/chproxy-linux-amd64-v1.14.0.tar.gz

编辑配置文件 /data/chproxy/config.yml

log_debug: false # debug日志
hack_me_please: true

# cache设置,可设置长期缓存或者短期缓存,按组区分
caches: # 缓存设置
- name: "longterm"
dir: "/data/chproxy/longterm/cachedir"
max_size: 100Gb
expire: 1h
grace_time: 20s

- name: "shortterm"
dir: "/data/chproxy/shortterm/cachedir"
max_size: 100Mb
expire: 10s

# 网络白名单组,按组区分
network_groups: # 白名单组,可设置多个白名单组
- name: "cluster_internal"
networks: ["10.0.10.0/8"]

- name: "office_addrs"
networks: ["172.17.0.0/16"]

# 参数设置,按组区分
param_groups: # 参数组,可设置多个参数
- name: "cron-job"
params:
- key: "max_memory_usage"
value: "40000000000"

- key: "max_bytes_before_external_group_by"
value: "20000000000"

- name: "web"
params:
- key: "max_memory_usage"
value: "5000000000"

- key: "max_columns_to_read"
value: "30"

- key: "max_execution_time"
value: "30"

# chproxy server相关设置,一般分为http、https、metrics
server:
http:
listen_addr: ":8123" # chproxy 服务监听端口
allowed_networks: ["office_addrs", "cluster_internal"] # 允许访问chproxy服务白名单
read_timeout: 5m
write_timeout: 10m
idle_timeout: 20m

metrics:
allowed_networks: ["office_addrs", "cluster_internal"] # 暴露给prometheus使用的白名单

# 用户设置,按组区分
users:
- name: "default" # chproxy 用户名
password: "" # chproxy 密码
to_cluster: "cluster1" # 用户可访问的cluster名称
to_user: "default" # chproxy用户对应的ck用户
deny_http: false # 是否允许http请求
allow_cors: true
requests_per_minute: 20 # 限制该用户每分钟请求次数
# cache: "longterm" # 使用缓存,若使用缓存,查询优先走缓存,而不是按照规则轮询
params: "web" # 应用“web”指定的参数集
max_queue_size: 100 # 最大队列数
max_queue_time: 35s # 队列最大等待时间

- name: "default1" # chproxy 用户
to_cluster: "cluster2" # 不同的chproxy用户,可对应不同的cluster集群
to_user: "default"
allowed_networks: ["office_addrs", "cluster_internal", "172.16.104.12"]
max_concurrent_queries: 4
max_execution_time: 1m
deny_https: false

# 逻辑集群设置,按组区分
clusters:
- name: "cluster1" # chproxy 集合名称
scheme: "http" # 请求类型,http/https
nodes: ["node02.tusvn.nw:8123","node03.tusvn.nw:8123"] # 集群可访问节点,http使用端口默认为8123,https使用端口默认为8443,查看ck服务的config.xml配置文件查询
heartbeat: # 集群内部心跳检测定义
interval: 1m
timeout: 10s
request: "/?query=SELECT%201%2B1"
response: "2\n"

kill_query_user: # 达到上限自动执行kill用户
name: "default"
password: ""

users:
- name: "default" # 集群对应chproxy用户信息
password: ""
max_concurrent_queries: 512
max_execution_time: 1m

- name: "cluster2" # chproxy 集群2名称,可从逻辑上定义多个集群
scheme: "http"
replicas: # 集群可访问节点
- name: "replica1"
nodes: ["10.0.10.2:8123"]
- name: "replica2"
nodes: ["10.0.10.3:8123"]

users:
- name: "default"
max_concurrent_queries: 512
max_execution_time: 1m

chproxy安装好的地址  10.0.10.5:8123

程序目录  /data/chproxy

启动chproxy

#systemctl start chproxy 

  

启动chproxy 通过客户端,执行数据库增删改查,验证正常。

关闭一台clickhouse,故障切换正常。

结论:

       •BalancedClickhouseDataSource:使用简单;但是内部随机方式,可能会导致负载不均匀,虽然有定时检测机制,但是经测试,节点挂掉,请求直接报错;

•Nginx: 支持多种请求策略、自动故障转移,扩容新增节点只需要修改其配置即可

chproxy 拥有更多更灵活的配置权限,完善的健康检查,更好的性能。

推荐使用chproxy实现高可用。

 


http://chatgpt.dhexx.cn/article/pJmbacuk.shtml

相关文章

【RocketMQ】集群的搭建与高可用

RocketMQ分布式集群是通过Master和Slave的配合达到高可用性的。 Master和Slave的区别&#xff1a;在Broker的配置文件中&#xff0c;参数brokerId的值为0表明这个Broker是Master&#xff0c;大于0表明这个Broker是Slave&#xff0c;同时brokerRole参数也会说明这个Broker是Mas…

Sentry 高可用部署

Sentry 高可用部署&#xff0c;部署分析基于Sentry 10.1.0.dev 05e720a7 对应dockerhub镜像版本分别为&#xff1a; getsentry/snuba:31c967e774759c0548652d986645fdff844e0a39 getsentry/sentry:8549f2a492c803bab77af26e7417272975b9369a getsentry/symbolicator:94cdbb7b54…

HA高可用

什么事应用程序的高可用 高可用性(high availability)通常用来描述一个系统经过专门的设计,从而减少停工的时间,而保持其服务的高度可用性 高可用程序的类型 主从方式(冷备) 两个相同的应用程序,一个对外提供服务,成为主程序,另一个平时不运行为备程序,就是一个主程序的备份,…

harbor高可用部署

harbor高可用简介 harbor目前有两种主流的高可用方案&#xff1a; 双主复制&#xff0c;harbor自带的镜像复制功能多harbor实例共享后端存储 双主复制架构在遇到大镜像时有同步延迟&#xff0c;并且一个实例故障后需要手动重新开启复制策略才能再次同步&#xff0c;下面以阿里…

HADOOP 高可用搭建

首先先说一下大概的步骤&#xff0c;就用四台为例&#xff0c;简单适合新手操作。 流程是&#xff1a;创建虚拟机&#xff0c;配置好&#xff1b;搭建linux系统&#xff1b;安装jdk&#xff08;因为后面好多都依赖jkd&#xff09;&#xff1b;免密登录ssh&#xff1b;安装zook…

高可用详细概念及三种决策方式分析

文章目录 1.基本概念1.计算高可用2.存储高可用高可用状态决策1.独裁式2.协商式3.民主式 1.基本概念 这个定义的关键在于“无中断”&#xff0c;但恰好难点也在“无中断”上面&#xff0c;因为无论是单个硬件还是单 个软件&#xff0c;都不可能做到无中断&#xff0c;硬件会出故…

Nacos实现高可用

由于Nacos暂不支持Arm架构芯片的Mac集群搭建&#xff0c;本小节用Linxu云主机&#xff08;Nacos比较吃内存&#xff0c;2个Nacos服务器集群&#xff0c;至少2G内存&#xff09;环境演示。 通过前面的学习&#xff0c;我们已经了解了如何使用Nacos以及Nacos的功能等&#xff0c;…

浅谈高可用测试

前言 现今的互联网产品越来越注重可靠性&#xff0c;尤其是在生产环境中使用的系统&#xff0c;对高可用性都有一定的要求。而作为产品的提供方&#xff0c;在交付产品之前&#xff0c;也会对高可用进行验收测试。近期跟进过两个产品曾有高可用测试的需求&#xff0c;在此简单…

nginx高可用

Nginx高可用 为什么要使用nginx的高可用&#xff1a;因为nginx作为反向代理服务器时&#xff0c;有可能出现宕机的情况&#xff0c;而由于其反向代理的特性&#xff0c;就会导致其他服务器&#xff08;tomcat等&#xff09;无法被访问&#xff0c;这样项目就停止工作了。但是使…

RabbitMQ高可用

RabbitMQ高可用 各种消息队列对比使用推荐 RabbitMQ 高可用普通集群模式镜像集群模式保证消息队列的幂等性(消息不被重复消费)消息队列的可靠性传输生产者丢失数据RabbitMQ丢失数据消费者丢失数据 保证消息的顺序性消息积压问题 各种消息队列对比 特性ActiveMQRabbitMQRocketM…

系统高可用

系统高可用 1. 什么是高可用&#xff1f;可用性的判断标准是啥&#xff1f;1.1 可用性的判断标准是啥&#xff1f; 2. 哪些情况会导致系统不可用&#xff1f;3. 有哪些提高系统可用性的方法&#xff1f;3.1 注重代码质量&#xff0c;定时Review代码3.2 使用集群&#xff0c;减少…

HBase高可用

一、HBase高可用简介 HBase集群如果只有一个master&#xff0c;一旦master出现故障&#xff0c;将导致整个集群无法使用&#xff0c;所以在实际的生产环境中&#xff0c;需要搭建HBase的高可用&#xff0c;也就是让HMaster高可用&#xff0c;也就是需要再选择一个或多个节点也…

你管这破玩意儿叫高可用

大家好&#xff0c;我是坤哥 今天我们来聊一下互联网三高&#xff08;高并发、高性能、高可用&#xff09;中的高可用&#xff0c;看完本文相信能解开你关于高可用设计的大部分困惑 前言 高可用&#xff08;High availability&#xff0c;即 HA&#xff09;的主要目的是为了保障…

什么是高可用?高可用介绍:

前言&#xff1a; 高可用&#xff08;High availability&#xff0c;即 HA&#xff09;的主要目的是为了保障「业务的连续性」&#xff0c;即在用户眼里&#xff0c;业务永远是正常&#xff08;或者说基本正常&#xff09;对外提供服务的。高可用主要是针对架构而言&#xff0c…

HTML Responsive Web Page

注&#xff1a;参考网站 https://www.w3schools.com HTML Responsive Web Page index.html <!DOCTYPE html> <html><head><link rel"stylesheet" href"style.css"><title>Responsive web page</title><meta lan…

响应式布局【Responsive】 与 自适应布局 【adaptive】、单页面【SPA】 和多页面【MPA】

1、响应式布局 是一个网址能兼容多个terminate【终端】&#xff0c;而不是为每个终端做一个特定的版本 优点&#xff1a; 用户体验好节约开发时间、节省设计seo友好可以适用所有设备屏幕 缺点 设计与风格有局限性《自由度太低&#xff0c;局部性较大》灵活性有所欠缺 基于不…

Bootstrap:Responsive Design with Bootstrap(一)

1.Use Responsive Design with Bootstrap Fluid Containers 现在让我们回到我们的Cat Photo应用。这次&#xff0c;我们将用流行的响应式框架Bootstrap来美化它。 Bootstrap将会根据你的屏幕的大小来调整HTML元素的大小 —— 强调 响应式设计的概念。 通过响应式设计&#x…

responsive tables

以上内容原本是整理为ppt格式的&#xff0c;贴过来格式有点乱&#xff0c;请见谅。 其他responsive tables参考&#xff1a; http://gergeo.se/RWD-Table-Patterns/ 3种类型的代码参考 unseen column&#xff1a; http://runjs.cn/code/zrhodpx5 flip scroll&#xff1a; ht…

CSS之responsive image gallery

responsive image gallery 这次实例主要是练习如何讲不同的图片设置为一个栏目&#xff0c;并且能够根据屏幕的大小进行自适应的变换。需要注意的是&#xff0c;本次实例中运用到的重要的关键的内容是&#xff1a;float-left&#xff1b;box-sizing; media screen and (max-wi…

html5 响应式表格插件,响应式表格jQuery插件 – Responsive tables

响应式表格jQuery插件 – Responsive tables 4月 24, 2014 评论 (1) Sponsor 这个Responsive tables jQuery插件依赖于Bootstrap 3使用&#xff0c;比BS自带的自适应多了一些好用的功能&#xff0c;比如筛选显示&#xff0c;Focus选定、Table头滑动固定等&#xff0c;下来看看介…