clickhouse 集群的部署
0.clickhouse集群和其他大数据集群很不一样,每个clickhouse 节点更加独立,每个节点可以单独当作一个独立的数据库服务,并且官网的教程也比较坑爹,这导致对hadoop系比较了解的人比较难适应.
1.服务器信息
| 服务器ip | 服务器hostname |
|---|---|
| 192.168.1.101 | ck01 |
| 192.168.1.102 | ck02 |
| 192.168.1.103 | ck03 |
部署3台虚拟机,centos7的环境,并且更改/etc/hostname和/etc/hosts文件
为了方便以下都是使用root用户
2.安装单机版的clickhouse节点
版本是: v22.12.6.22
可以从github下载:
https://github.com/ClickHouse/ClickHouse/releases/tag/v22.12.6.22-stable
下载以下三个文件到每个虚拟机的/root目录
clickhouse-client-22.12.6.22.x86_64.rpm
clickhouse-common-static-22.12.6.22.x86_64.rpm
clickhouse-server-22.12.6.22.x86_64.rpm
执行过程仅需要设置下数据库用户default的密码即可
rpm -ivh clickhouse-*
启动数据库服务命令
clickhouse start
通过客户端登录本地单机版的clickhouse
clickhouse-client --password
以上需要每个服务器都正常安装
以下是需要注意的其他地方
/etc/clickhouse-server/ 是ck的配置文件目录
[root@ck01 ~]# cd /etc/clickhouse-server/
[root@ck01 clickhouse-server]# ll
总用量 80
dr-x------. 2 clickhouse clickhouse 25 10月 10 17:23 config.d
-rw-rw-rw-. 1 clickhouse clickhouse 70907 10月 10 11:28 config.xml
dr-x------. 2 clickhouse clickhouse 34 10月 10 10:52 users.d
-rw-rw-rw-. 1 clickhouse clickhouse 5370 3月 28 2023 users.xml
通过更改config.xml的内容可以更改clickhouse的配置
通过在config.d 里新增 anyname.xml 可以覆盖config.xml的内容
建议有啥配置在config.d 修改,这样对自己更改了什么配置比较清晰
配置集群的前提条件是
<listen_host>0.0.0.0</listen_host>
3.集群配置
3.1 前置知识
<<clickhouse原理解析和应用实践>>这一块写得有点烂,有种玄而又玄的感觉,其实很简单
分片和副本是集群的配置,主要用于指定在集群中如何分布与保存一份数据,需要在配置文件中指定(3.5 示例)
1.分片
一张表一共999行,分成3个分片,一共3个节点,那么就是每个节点可分得333行数据.clickhouse可通过分片机制将数据均匀的分发到集群的各个节点.
2.副本
clickhouse没有所谓正本和副本的概念,如果将副本数设置成1那么代表着整个集群就只保存了一份完整的数据,所以在clickhouse中一份数据至少有一个副本.我觉得clickhouse用Replica去形容这个概念不是很贴切,可以将副本数理解成数据份数.
3.分片和副本以及集群的设置
分片和副本需要同时指定,比如说有3个分片,我们配置时需要指定:
分片1 使用1个副本保存在ck01上
分片2 使用1个副本保存在ck02上
分片3 使用1个副本保存在ck03上
这样就是典型的3分片1副本的设置,也可以使用1分片3副本的形式 比如:
分片1 使用3个副本保存在ck01,ck02,ck03 上
使用1分片3副本的话数据更加安全,三台机器上都有完整的数据,但同时占用磁盘和数据同步时的带宽也是3分片1副本的3倍
3.2 clickhouse-keeper配置
clickhouse需要zookeeper为数据复制和分布式DDL查询执行提供协调系统.
所以在大多数clickhouse的集群部署教程中都是需要额外安装zookeeper的,这对于学习来说很不友好,所幸clickhouse开发了内置的zookeeper替代品(clickhouse-keeper),并同步安装在clickhouse-server中.官方建议clickhouse-keeper在生产环境额外安装在其他服务器上,但我们是学习使用,不需要额外下载clickhouse-keeper的rpm包.
我们需要通过设置<keeper-server>去启用clickhouse-keeper
在 /etc/clickhouse-server/config.d 文件夹中新增 cluster.xml文件
注:cluster.xml 名字可以随便起
<clickhouse>
<!-- 添加keeper_server设置后自带的ck-keeper会生效-->
<keeper_server>
<tcp_port>9181</tcp_port>
<!-- 这个需要每个服务唯一 ck01=1 ck02=2-->
<server_id>1</server_id>
<log_storage_path>/data/clickhouse/lib/coordination/log</log_storage_path>
<snapshot_storage_path>/data/clickhouse/lib/coordination/snapshots</snapshot_storage_path>
<coordination_settings>
<operation_timeout_ms>10000</operation_timeout_ms>
<session_timeout_ms>30000</session_timeout_ms>
<raft_logs_level>warning</raft_logs_level>
</coordination_settings>
<raft_configuration>
<server>
<id>1</id>
<hostname>ck01</hostname>
<port>9234</port>
</server>
<server>
<id>2</id>
<hostname>ck02</hostname>
<port>9234</port>
</server>
<server>
<id>3</id>
<hostname>ck03</hostname>
<port>9234</port>
</server>
</raft_configuration>
</keeper_server>
</clickhouse>
3.3 配置服务端连接keeper集群
我这边在 </keeper_server> 之后添加了以下配置,这样clickhouse-server就可以连接到3.2配置的clickhouse-keeper 集群了
<zookeeper>
<node>
<host>ck01</host>
<port>9181</port>
</node>
<node>
<host>ck02</host>
<port>9181</port>
</node>
<node>
<host>ck03</host>
<port>9181</port>
</node>
</zookeeper>
3.4 Macros 宏配置
和后续的DDL语句分布式设置有关
我这边续在</zookeeper> 后面,
shard值和replica值每台机器都是唯一的
如ck01上的配置就是
<macros>
<shard>ruby_3S_1R_01</shard>
<replica>ck01</replica>
</macros>
3.5 集群设置
设定一个抽象的集群,这部分我续在</macros>之后
如3.1描述的一样,这是配置一个3分片1副本的集群
<remote_servers replace="true">
<!-- 这个标签是集群名 -->
<ruby_3S_1R>
<!-- 这个是集群节点之间通信的密钥 -->
<secret>mysecretphrase</secret>
<shard>
<replica>
<host>ck01</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>ck02</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>ck03</host>
<port>9000</port>
</replica>
</shard>
</ruby_3S_1R>
</remote_servers>
如果要配置一个1分片3副本的集群则这样配置
<remote_servers replace="true">
<!-- 这个标签是集群名 -->
<ruby_1S_3R>
<!-- 这个是集群节点之间通信的密钥 -->
<secret>mysecretphrase</secret>
<shard>
<replica>
<host>ck01</host>
<port>9000</port>
</replica>
<replica>
<host>ck02</host>
<port>9000</port>
</replica>
<replica>
<host>ck03</host>
<port>9000</port>
</replica>
</shard>
</ruby_1S_3R>
</remote_servers>
如果想在3台机器上配置3分片 2副本的形式,则会报错
3.DB::Exception: There are two exactly the same ClickHouse instances
每个分片每个副本需要配置在单独的节点上。(CK officially supports only one shard/replica per node. )
4.测试使用
启动3台机器 并在其中一台上执行
[root@ck01 ~]# clickhouse-client --password
ClickHouse client version 22.12.6.22 (official build).
Password for user (default):
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 22.12.6 revision 54461.
Warnings:
* Linux transparent hugepages are set to "always". Check /sys/kernel/mm/transparent_hugepage/enabled
ck01 :) show clusters
SHOW CLUSTERS
Query id: d617ab34-9f4b-4cd4-b382-812459efa7da
┌─cluster────┐
│ ruby_3S_1R │
└────────────┘
1 row in set. Elapsed: 0.001 sec.
创建数据库
ck01 :) create database ruby_db01 on cluster ruby_3S_1R
创建普通表,这样创建的表只能在当前节点上select到
create table ruby_db01.mgtree_l(
id Int,
label String,
dt Date
)engine = MergeTree()
partition by toYYYYMMDD(dt)
order by id
创建集群本地表,这样创建的表可以在集群的所有节点上select到
create table ruby_db01.c_mgtree_l (
id Int,
label String,
dt Date
)engine = MergeTree()
partition by toYYYYMMDD(dt)
order by id
创建分布式表
CREATE TABLE ruby_db01.c_mgtree_c ON CLUSTER ruby_3S_1R
(
`id` Int,
`label` String,
`dt` Date
)ENGINE = Distributed('ruby_3S_1R', 'ruby_db01', 'c_mgtree_l', rand())
插入4亿条数据进去
cat test.csv |clickhouse-client --password --query "insert into ruby_db01.c_mgtree_c FORMAT CSV"
查询分布式表
ck01 :) select count(1) from ruby_db01.c_mgtree_c;
SELECT count(1)
FROM ruby_db01.c_mgtree_c
Query id: 68431cbf-b36b-4b51-b203-d84ad9ea601e
┌───count()─┐
│ 399991688 │
└───────────┘
1 row in set. Elapsed: 0.023 sec.
查询本地表
ck01 :) select count(1) from ruby_db01.c_mgtree_l;
SELECT count(1)
FROM ruby_db01.c_mgtree_l
Query id: 8279f383-aa39-48a5-81b4-1573c0f0f89e
┌───count()─┐
│ 133332054 │
└───────────┘
1 row in set. Elapsed: 0.001 sec.
真快!
参考资料:
https://clickhouse.com/docs/en/architecture/introduction ps:查看官网deploy这块最好按顺序看,不要跳过去看Cluster Deployment
https://blog.csdn.net/wlj15059332248/article/details/129931603

浙公网安备 33010602011771号