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

posted @ 2023-10-11 16:46  RAmenLCH  阅读(1873)  评论(0)    收藏  举报