[SQL系列]从零开始学Clickhouse——集群篇

        在上一篇中,我们通过Docker构建了一个简单的单点Clickhouse,但是如果要做大数据的处理的话,Clickhouse集群是必不可少的,今天我们先用Docker简单地搭建一个Clickhouse集群。

容器逐个部署

        使用Docker部署ClickHouse集群涉及几个步骤,包括创建Docker网络、配置ClickHouse容器以及设置集群的各个节点。

1. 创建Docker网络

首先,需要创建一个Docker网络,以确保ClickHouse容器可以相互通信。

docker network create --subnet=172.18.0.0/16 clickhouse_network

        如果遇到了这个问题“Error response from daemon: Pool overlaps with other one on this address space”,那说明docker已经建立了对应的子网,占据了地址,我们可以改一下,比如说--subnet=172.16.0.0/16,如果此处冲突了。下一步的docker run指定的ip也需要修改。

2. 启动ClickHouse服务器

接着,启动ClickHouse服务器实例。假设我们要部署一个具有三个节点的集群。

对于每个节点,运行一个ClickHouse容器,并加入之前创建的网络:

docker run -d --name clickhouse-server-1 \--ip 172.18.0.2 \--network clickhouse_network \-p 8123:8123 \-p 9000:9000 \-v /path/to/configs:/var/lib/clickhouse \yandex/clickhouse-serverdocker run -d --name clickhouse-server-2 \--ip 172.18.0.3 \--network clickhouse_network \yandex/clickhouse-serverdocker run -d --name clickhouse-server-3 \--ip 172.18.0.4 \--network clickhouse_network \yandex/clickhouse-server

这里-p 8123:8123-p 9000:9000表示将容器的端口映射到宿主机,这样可以通过宿主机的端口访问ClickHouse服务。-v参数用于将宿主机的配置文件目录挂载到容器中,以自定义配置。

上面的格式是在bash下的格式,如果在Powershell,需要把斜杠去掉。 上面的容器是yandex/clickhouse-server,也可以修改成clickhouse/clickhouse-server,这个容器上一篇文章中下载过了。

3. 配置ClickHouse集群

每个ClickHouse节点都需要在其配置文件config.xml中设置集群配置。你需要编辑每个节点的config.xml文件,添加集群配置信息。

docker exec -it clickhouse-server-1 bash
cd /etc/clickhouse-server//下载vim
apt-get update
apt-get install vimvim config.xml
//按照下面的内容修改,修改完后
//先按Esc,:wq回车就保存好了

以下是示例配置:

<clickhouse><!-- Other configurations... --><remote_servers><cluster_1><shard><internal_replication>true</internal_replication><replica><host>clickhouse-server-1</host><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>clickhouse-server-2</host><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>clickhouse-server-3</host><port>9000</port></replica></shard></cluster_1></remote_servers><!-- Other configurations... -->
</clickhouse>

确保<host>标签中的值与Docker容器名称一致。

修改结束之后,可以用exit退出当前容器,也可以ctrl+p+q退出

4. 重启ClickHouse服务器

配置完成后,需要重启所有ClickHouse服务器以使配置生效。

docker restart clickhouse-server-1 clickhouse-server-2 clickhouse-server-3

5. 验证集群

使用ClickHouse客户端连接到任意一个节点,并运行以下命令来验证集群是否配置正确:

docker exec -it clickhouse-server-1 clickhouse-client --query "SELECT * FROM system.clusters"

这个查询应该返回你配置的集群信息。

6. 删除集群

docker stop clickhouse-server-1 clickhouse-server-2 clickhouse-server-3docker rm clickhouse-server-1 clickhouse-server-2 clickhouse-server-3docker network rm clickhouse_network

使用Docker-compose部署

1. 编写yaml文件

使用docker-compose来搭建ClickHouse集群会更加简单和方便,因为docker-compose允许你在一个YAML文件中定义所有的服务,并且管理它们的生命周期。

version: '3'services:clickhouse-server-1:image: yandex/clickhouse-servercontainer_name: clickhouse-server-1networks:- clickhouse_networkports:- "8123:8123"- "9000:9000"volumes:- /path/to/configs-1:/var/lib/clickhouseclickhouse-server-2:image: yandex/clickhouse-servercontainer_name: clickhouse-server-2networks:- clickhouse_networkvolumes:- /path/to/configs-2:/var/lib/clickhouseclickhouse-server-3:image: yandex/clickhouse-servercontainer_name: clickhouse-server-3networks:- clickhouse_networkvolumes:- /path/to/configs-3:/var/lib/clickhousenetworks:clickhouse_network:driver: bridgeipam:driver: defaultconfig:- subnet: 172.18.0.0/16

         上面的volumns可以不带,如果不想挂载主机路径的话,上面的network里面的subnet地址也可以因为冲突修改掉。

        在这个配置文件中,我们定义了三个ClickHouse服务(clickhouse-server-1clickhouse-server-2clickhouse-server-3),它们都使用yandex/clickhouse-server镜像。每个服务都挂载了一个卷,用于存储配置文件和数据。此外,我们创建了一个名为clickhouse_network的网络,用于服务之间的通信。

2. 修改配置文件

        与直接使用Docker容器一样,你需要为每个ClickHouse节点配置集群设置。编辑每个节点的config.xml文件,添加集群配置信息。由于我们使用了卷挂载,你可以在宿主机的相应路径下编辑这些配置文件。

        如果没有使用-v进行挂载的话,还是得进入到每个容器里面进行修改。

3. 启动集群        

        配置完成后,使用以下命令启动集群:

docker-compose up -d

        这将根据docker-compose.yml文件定义启动所有服务。

4. 验证集群

使用ClickHouse客户端连接到任意一个节点,并运行以下命令来验证集群是否配置正确:

docker-compose exec clickhouse-server-1 clickhouse-client --query "SELECT * FROM system.clusters"

这个查询应该返回你配置的集群信息。

5. 删除集群

docker-compose down -v --rmi all

Go使用Clickhouse

package mainimport ("database/sql""fmt""log"_ "github.com/ClickHouse/clickhouse-go"
)func main() {// 连接到ClickHouse单点connectToSingleNode()// 连接到ClickHouse集群connectToCluster()
}func connectToSingleNode() {conn, err := sql.Open("clickhouse", "tcp://localhost:9000?debug=true")if err != nil {log.Fatal(err)}defer conn.Close()var version stringif err := conn.QueryRow("SELECT version()").Scan(&version); err != nil {log.Fatal(err)}fmt.Printf("Single Node Version: %s\n", version)
}func connectToCluster() {conn, err := sql.Open("clickhouse", "tcp://localhost:9000,tcp://localhost:9001,tcp://localhost:9002?debug=true")if err != nil {log.Fatal(err)}defer conn.Close()var version stringif err := conn.QueryRow("SELECT version()").Scan(&version); err != nil {log.Fatal(err)}fmt.Printf("Cluster Version: %s\n", version)
}

        上述分别定义了连接单点和连接集群的方法,主要是在连接地址的不同,其余的对于开发者而言都是透明的,包括切片的选取和副本。

  • connectToSingleNode函数连接到单个ClickHouse实例,它使用tcp://localhost:9000作为连接字符串。
  • connectToCluster函数连接到ClickHouse集群,它使用tcp://localhost:9000,tcp://localhost:9001,tcp://localhost:9002作为连接字符串,这样就可以连接到多个分片。

在ClickHouse中,当你连接到集群时,通常不需要手动选择分片。ClickHouse的查询处理器会自动处理分布式查询,根据查询语句和集群配置将查询分发到适当的分片上。你只需要连接到集群中的任何一个节点,ClickHouse就会负责将查询分发到所有相关的分片上,并合并结果。

然而,如果你想要手动控制查询在哪些分片上执行,你可以在查询中使用ON CLUSTER子句来指定集群的名称,以及使用SHARDREPLICA子句来指定特定的分片和副本。例如:

SELECT * FROM my_table ON CLUSTER my_cluster WHERE shard = 1

这个查询只会在集群my_cluster中编号为1的分片上执行。

在Go程序中,你仍然使用相同的连接字符串来连接到集群,无论你是在所有分片上执行查询还是在特定的分片上执行查询。ClickHouse的Go驱动会处理与集群的通信,并将查询发送到正确的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.认识USB协议

目录 前言 在嵌入式场景的具体体现 USB通信协议 总结 前言 在这之前&#xff0c;我们需要认识USB是什么东西&#xff0c;它是一种通信协议&#xff0c;协议只是规定数据的&#xff0c;在物理层面上&#xff0c;它可以有多种表现形式。在我们日常生活中也非常常见&#xff0…

FebHost:什么是挪威.no域名,如何注册?

挪威国家域名介绍 挪威是一个位于北欧的国家&#xff0c;北面和西面是大西洋和北海&#xff0c;东面和南面则与瑞典、芬兰接壤。挪威是一个高度发达的经济体&#xff0c;其政府在经济管理和可持续发展方面也取得了很多成就。挪威的人均GDP在世界范围内排名非常靠前&#xff0c…

【Unity】 使用代码分析(Roslyn Analyzers)实现自动代码审查(Code Review)

索引 Roslyn AnalyzersCode Review自动 Code Review 案例1.public、internal权限的字段建议以大写字母开头。2.private、protected权限的字段建议以下划线小写字母开头。3.不建议直接继承 MonoBehaviour&#xff0c;建议继承至 HTBehaviour。4.不建议使用 Input 判断输入或获取…

命令执行。

命令执行 在该项目的readme中&#xff0c;描述了怎么去调用的flink 通过java原生的runtime来调用flink&#xff0c;下一步就是去看看具体的调用过程了&#xff0c;是否存在可控的参数 找到具体提交命令的类方法CommandRpcClinetAdapterImpl#submitJob() 这里要确定command&am…

C++-6

使用模板类&#xff0c;实现顺序栈。 #include <iostream>using namespace std; template <typename T> class Seqlite {T data[30];int len0; public:void head_inst(T date);void head_dele();void show(); }; template <typename T> …

Phi-3-mini-4k-instruct 的功能测试

Model card 介绍 Phi-3-Mini-4K-Instruct 是一个 3.8B 参数、轻量级、最先进的开放模型&#xff0c;使用 Phi-3 数据集进行训练&#xff0c;其中包括合成数据和经过过滤的公开可用网站数据&#xff0c;重点是 高品质和推理密集的属性。 该型号属于 Phi-3 系列&#xff0c;Mini…

Django框架之ORM操作

一、选择数据库 1、默认数据库 Django默认的数据库是sqlite3数据库 DATABASES {default: {ENGINE: django.db.backends.sqlite3,NAME: BASE_DIR / db.sqlite3,} }2、指定数据库 修改连接到MySQL数据库 DATABASES {default: {ENGINE: django.db.backends.mysql,# 数据库名…

一、安装Redis并运行

Windows安装Redis 1.打开网址下载 下载地址&#xff1a;https://github.com/tporadowski/redis/releases。 Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择 我选择的是 然后一步步安装 可以参考&#xff1a;https://blog.csdn.net/zbx931197485/article/d…

李廉洋:4.29黄金原油最新走势分析,做单必看策略,

传统定价框架下&#xff0c;黄金兼具货币、商品和金融三重属性&#xff0c;对应货币、抗通胀和避险价值&#xff0c;因此通常与美元、美债利率反向变动。但近期这一定价规律“失灵”了&#xff0c;黄金、利率和美元同涨。三者同涨后&#xff0c;一个月后续转为下跌的频率超过一…

【JS】节流与防抖技术

JavaScript: 节流与防抖技术 当用户进行滚动、调整窗口大小或进行频繁的键盘输入时&#xff0c;页面上的某些事件处理器可能会被频繁触发。如果每次事件触发都执行函数&#xff0c;可能会对性能产生显著影响。在这种情况下&#xff0c;我们可以利用节流&#xff08;Throttle&a…

JS - 以工厂模式和原型模式方式建造对象、JS的垃级回收机制、数组的使用

创建对象的方式 使用工厂方法来建造对象 在JS中我们可以通过以下方式进行创建对象&#xff1a; var obj {name:"孙悟空",age:18,gender:"男",sayName:function(){alert(this.name);}};var obj2 {name:"猪八戒",age:28,gender:"男",…

Glide添加token和userId

方法一&#xff1a; GlideUrl glideUrl new GlideUrl(url, new LazyHeaders.Builder().addHeader("userId", userId).addHeader("token", token).build());FutureTarget<File> target Glide.with(context).asFile().load(glideUrl).submit(); 方法…

【Java EE】总结12种锁策略以及synchronized的实现原理

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

基于yolov5实时实例分割

是一个结合了最新技术进展&#xff08;State-of-the-Art, SOTA&#xff09;的实时实例分割项目&#xff0c;基于著名的YOLOv5目标检测架构&#xff0c;并对其进行扩展以实现对图像中每个对象实例的精确像素级分割。以下是该项目的中文介绍&#xff1a; YOLOv5&#xff1a; YOL…

精选20个大模型高频面试题

我精选20个大模型高频面试题&#xff0c;分享给大家 简述GPT和BERT的区别讲一下GPT系列模型是如何演进的&#xff1f;为什么现在的大模型大多是decoder-only的架构&#xff1f;讲一下生成式语言模型的工作机理哪些因素会导致LLM的偏见&#xff1f;LLM中的因果语言建模与掩码语…

代码随想录算法训练营第五十五天|392.判断子序列、115.不同的子序列

动态规划 文章目录 一、判断子序列二、不同的子序列总结 一、判断子序列 和之前的公共子序列相同&#xff0c;增加一个判断序列长度是否等于字串长度的操作即可 class Solution { public:bool isSubsequence(string s, string t) {//保持相对位置vector<vector<int>…

Java后端利用百度地图全球逆地理编码,获取地址

声明&#xff1a;本人是在实习项目的时候遇到的问题 一.使用Api分为四步骤全球逆地理编码 rgc 反geo检索 | 百度地图API SDK 步骤1,2自行完成 接下来去获取AK 二.申请AK 登录百度账号 点击创建应用&#xff0c;选择自己想用的服务&#xff0c;我只单选了逆地理编码&#xff…

【ARMv9 DSU-120 系列 9.2 -- Cluster 和 Cores CTI 详细介绍】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 DebugBlock subcomponentsARM DSU_120 CTI外部 interfaceCTI input triggers from each PECTI output triggers from each PEAllocation of cluster CTI trigger inputsAllocation of cluster CTI trigger outputsDebu…

2024年创业意识培训考试题库及答案

一、选择题 11.不属于你企业优势的是&#xff08;&#xff09;。 A.产品同质化 B.产品差异化 C.产品品牌化 D.产品个性化 答案&#xff1a;A 12.一个人的工作经验、&#xff08;&#xff09;、企业实践经验、爱好、社会交往和家庭背景等对于企业成功都是很重要的因素。 …

go语言实现简单认证样例

目录 1、代码实现样例 2、postman调用 1、代码实现样例 package mainimport ("net/http""strings""github.com/dgrijalva/jwt-go""github.com/gin-gonic/gin" )var (// 密钥&#xff0c;用于验证 JWT 令牌signingKey []byte("…