clickhouse集群部署方案
以三台服务器为例,做3分片0副本部署
主机 | 端口 | 备注 |
---|---|---|
10.16.5.217 | 9000 | 1分片,0副本 |
10.16.5.218 | 9000 | 1分片,0副本 |
10.16.5.219 | 9000 | 1分片,0副本 |
clickhouse安装步骤
安装包下载
(1)官网:https://packages.clickhouse.com/rpm/stable/
(2) 以23.8.2.7ARM版本为例,下载如下四个rpm安装包
clickhouse-client-23.8.2.7.x86_64.rpm
clickhouse-common-static-23.8.2.7.x86_64.rpm
clickhouse-common-static-dbg-23.8.2.7.x86_64.rpm
clickhouse-server-23.8.2.7.x86_64.rpm
安装
(1)安装包上传至服务器(在三台服务器/opt目录下创建clickhouse目录,存放安装包)
mkdir /opt/clickhouse
(2)解压安装 (在三台服务器执行如下操作)
rpm -ivh /opt/clickhouse/*.rpm
# 解压后文件存放位置
# bin --> /usr/bin
# conf --> /etc/clickhouse-server
# lib --> /var/lib/clickhouse
# log --> /var/log/clickhouse-server
注:在安装过程中会出现密码输入,可根据需求进行设置
clickhouse配置文件修改
创建目录与文件
(在三台服务器同时进行)
# 数据目录
mkdir /data/clickhouse
# 日志目录
mkdir /data/clickhouse/log/
# 配置文件
touch /etc/clickhouse-server/metrika.xml
编辑config.xml文件
(vim /etc/clickhouse-server/config.xml)
三个服务器同样的操作
<!-- 修改 -->
<path>/data/clickhouse/</path>
<tmp_path>/data/clickhouse/tmp/</tmp_path>
<log>/data/clickhouse/log/clickhouse-server.log</log>
<errorlog>/data/clickhouse/log/clickhouse-server.err.log</errorlog>
<listen_host>::1</listen_host>
<listen_host>0.0.0.0</listen_host>
<user_files_path>/data/clickhouse/user_files/</user_files_path>
<user_directories>
<local_directory>
<path>/data/clickhouse/access/</path>
</local_directory>
</user_directories>
<!-- incl="remote_servers" 与 metrika.xml 标签对应 -->
<remote_servers incl="remote_servers">
<!-- 添加incl="remote_servers",清空内容 -->
</remote_servers>
<format_schema_path>/data/clickhouse/format_schemas/</format_schema_path>
<!-- 添加 -->
<zookeeper incl="zookeeper-servers" optional="true"></zookeeper>
<include_from>/etc/clickhouse-server/metrika.xml</include_from>
<macros incl="macros" optional="true"></macros>
编辑metrika.xml
(vim /etc/clickhouse-server/metrika.xml 三台服务器有区别)
<yandex>
<!--集群分片副本配置 3分片1副本 -->
<remote_servers>
<!-- ck_cluster是我自己建的集群名 -->
<ck_cluster>
<!-- 第1个分片 -->
<shard>
<!-- 是否写入1副本,然后集群间数据同步 默认为false-->
<internal_replication>true</internal_replication>
<!-- 1分片的1副本 -->
<replica>
<host>10.16.5.217</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>10.16.5.218</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>10.16.5.219</host>
<port>9000</port>
</replica>
</shard>
</ck_cluster>
</remote_servers>
<!--zookeeper配置-->
<zookeeper-servers>
<node index="1">
<host>10.16.5.217</host>
<port>2181</port>
</node>
<node index="2">
<host>10.16.5.218</host>
<port>2181</port>
</node>
<node index="3">
<host>10.16.5.219</host>
<port>2181</port>
</node>
</zookeeper-servers>
<!--压缩策略-->
<clickhouse_compression>
<case>
<min_part_size>10000000000</min_part_size>
<min_part_size_ratio>0.01</min_part_size_ratio>
<method>lz4</method>
</case>
</clickhouse_compression>
<!-- 本机绑定地址 -->
<networks>
<ip>::/0</ip>
</networks>
<!-- 注:macros配置三台服务器不同 -->
<!-- 10.16.5.217 -->
<!-- 配置分片macros变量,在用client创建表的时候回自动带入 -->
<macros>
<layer>ck_cluster</layer> <!-- 集群标识 上述定义的集群名-->
<shard>01</shard> <!-- 集群分片标识 -->
<replica>cluster01</replica> <!--集群副本标识 当前集群节点的名字或者IP -->
</macros>
<!-- 10.16.5.218 -->
<macros>
<layer>ck_cluster</layer>
<shard>02</shard>
<replica>cluster02</replica>
</macros>
<!-- 10.16.5.219 -->
<macros>
<layer>ck_cluster</layer>
<shard>03</shard>
<replica>cluster03</replica>
</macros>
</yandex>
标签解释:
<ck_cluster>
: cluster名称,任意填写,在后面通过这个名字引用如 on cluster ck_cluster
<shard>
:分片,有几个分片就配置几个<shard>
标签
<replica>
:副本,有几个副本就有几个<replica>
标签.
修改文件、目录的所属用户与所属组
( 三台服务器同样操作)
chown -R clickhouse:clickhouse /data/clickhouse/
chown -R clickhouse:clickhouse /etc/clickhouse-server/metrika.xml
chown -R clickhouse:clickhouse /etc/clickhouse-server/config.xml
clickhouse启动
三台服务器启动命令
systemctl start clickhouse-server.service # 启动服务
systemctl status clickhouse-server.service # 查看状态
systemctl stop clickhouse-server.service # 关闭服务
访问客户端,查看集群信息
clickhouse-client -m
# 通过系统表可以查看cluster集群信息
SELECT * from system.clusters;
注:查询信息字段
cluster
:集群名
shard_num
:分片的编号
shard_weight
:分片的权重
replica_num
:副本的编号
host_name
:服务器的host名称
host_address
:服务器的ip地址
port
:clickhouse集群的端口
is_local
:是否为你当前查询本地
user
:创建用户
访问客户端,系统配置表查询
select * from system.macros;
clickHouse-Keeper部署
简介
ClickHouse服务为了副本和分布式DDL查询执行使用ClickHouse Keeper协调系统
安装
无需额外安装,安装clickhouse时已经携带,只需配置即可!
创建目录
(三台服务器同样操作)
# 创建clickhouse-keeper数据存放目录
mkdir /data/clickhouse-keeper
# 赋予权限
chown -R clickhouse:clickhouse /data/clickhouse-keeper
修改配置文件
(三台服务器同样操作,vim /etc/clickhouse-server/config.xml)
<!-- 包裹在 <clickhouse></clickhouse> 标签中 -->
<!-- 添加 -->
<keeper_server>
<!-- 与metrika.xml文件内zookeeper-servers的port一致 -->
<tcp_port>2181</tcp_port>
<!-- 注:server_id 配置三台服务器不同 -->
<!-- 10.16.5.219、10.16.5.218与10.16.5.217配置的其它相同,只需更改此项 -->
<server_id>1</server_id>
<log_storage_path>/data/clickhouse-keeper/coordination/log</log_storage_path>
<snapshot_storage_path>/data/clickhouse-keeper/coordination/snapshots</snapshot_storage_path>
<coordination_settings>
<operation_timeout_ms>10000</operation_timeout_ms>
<session_timeout_ms>30000</session_timeout_ms>
<raft_logs_level>trace</raft_logs_level>
</coordination_settings>
<raft_configuration>
<server>
<id>1</id>
<hostname>10.16.5.217</hostname>
<port>9444</port>
</server>
<server>
<id>2</id>
<hostname>10.16.5.218</hostname>
<port>9444</port>
</server>
<server>
<id>3</id>
<hostname>10.16.5.219</hostname>
<port>9444</port>
</server>
</raft_configuration>
</keeper_server>
10.16.5.218、10.16.5.219服务器配置:
<!-- 10.16.5.218与10.16.5.217其它相同,只需更改此项 -->
<server_id>2</server_id>
<!-- 10.16.5.219与10.16.5.217其它相同,只需更改此项 -->
<server_id>3</server_id>
启动clickhouse-keeper
(1)正常重启clickhouse即可使用clickhouse-keeper
systemctl restart clickhouse-server.service # 重新启动服务
(2)检查clickhouse-keeper是否启动,通过telnet或nc在客户端端口向ClickHouse Keeper发出命令
echo mntr | nc localhost 2181
clickhouse分布式表
基于集群实现分布式 DDL
在默认情况下,创建多张副本表需要在不同服务器上进行创建,这是因为 create、drop、rename和 alter 等 ddl 语句不支持分布式执行,而在集群配置后,就可以使用新的语法实现分布式DDL 执行了
create / drop / rename / alter table on cluster cluster_name
-- cluster_name 对应为配置文件中的汲取名称,clickhouse 会根据集群的配置,去各个节点执行 DDL 语句
分布式创建本地表
-- 在 ck_cluster 集群 创建测试表
CREATE TABLE default.cktest_local ON CLUSTER ck_cluster
(
`id` Int64,
`name` String,
`age` Int32
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/cktest_local', '{replica}')
ORDER BY id
-- clickhouse 会根据 ck_cluster 的配置在 10.16.5.217、10.16.5.218 和 10.16.5.219 中创建 cktest_local 数据表
我们在创建表的时候指定了ReplicatedMergeTree(xxxx)
,里面传递了两个参数,我们对这两个参数一一描述
/clickhouse/tables/
这一部分指定的是在ZK上创建的路径地址,可随意变换只要记得即可{shard}
指的是分片的标志,同一个分片内的所有机器应该保持相同。建议使用使用的是集群名+分片名的配置也就是{layer}-{shard}
,这里的数据就是在macros
中配置的属性cktest_local
建议使用表名称{replica}
参数建议在macros
配置成机器的hostname,因为每台机器的hostname都是不一样的,因此就能确保每个表的识别符都是唯一的了
删除表
-- 删除 cktest_local 表
drop table cktest_local on cluster ck_cluster;
注意:
在日常使用clickhouse的时候,肯定会遇到删除表的操作,删除表的命令:DROP TABLE IF EXISTS default.test。有时候删除后表又想马上重建表,这时候你会发现相同表结构的表创建不了。
ClickHouse分布式表的本质并不是一张表,而是一些本地物理表(分片)的分布式视图,本身并不存储数据。在我们删除本地表和分布式表后,立即重建是没有问题的。唯一有问题的就是复制表,因为复制表需要在zookeeper上建立一个路径,存放相关数据。clickhouse默认的库引擎是原子数据库引擎,删除Atomic数据库中的表后,它不会立即删除。
创建分布式表
Distributed 解析
Distributed 表引擎是分布式表的代名词,他自身不存储任何数据,而是作为数据分片的代理,能够自动路由数据至集群中的各个节点,所以 DIstributed 表引擎需要和其他表引擎一起协同工作。
从上图可以看出一个表分为两个部分
- 本地表:通常以
_local
后缀进行命名。本地表是承接数据的载体,可以使用 非 Distributed 的任意表引擎 - 分布式表:通常以
_all
为后缀进行命名,分布式表只能使用 Distributed 表引擎,他们与本地表形成一对多的映射关系,以后通过分布式表代理操作多张本地表。
对于分布式表与本地表之间表结构的一致性检查,Distributed 表引擎采用了读时检查的机制,这意味着如果他们的表结构不兼容,需要在查询时才会抛出异常,而在创建表引擎时不会进行检查,不同 clickhouse 节点上的本地表之间使用不同表引擎也是可行的,但是通常不会这么做,保持他们的结构一致,有利于后期的维护避免造成不可预计的后果。
创建表
-- 创建分布式表 cktest_all 代理 ck_cluster 集群的 drfault.cktest_local 表
CREATE TABLE default.cktest_all ON CLUSTER ck_cluster
(
`id` Int64,
`name` String,
`age` Int32
)
ENGINE = Distributed('ck_cluster', 'default', 'cktest_local', rand())
-- 这里用的是 on cluster 分布式 DDL, 所以在 ck_cluster 集群中每个节点都会创建一张分布式表
-- 写入数据时会根据 rand() 随机函数的取值决定写入那个分片,
查询分类
- 作用于本地表的查询:对应 select 和 insert 分布式表会以分布式的方式作用于 local 本地表
- 只会影响分布式表自身,不会作用于本地表的查询,分布式表支持部分元数据操作,包括 create、drop、rename 和 alter,其中 alter 并不包括分区的操作(attach partition 和 replace partition等)。这些操作只会修改分布式表自身,并不会修改 local 本地表
- 如果想要彻底删除一张分布式表,需要分别删除分布式表和本地表
- 不支持的操作:分布式表不支持任何的 mutation 类型的操作,包括 alter delete 和 alter update。
-- 删除分布式表
drop table cktest_all on cluster ck_cluster;
-- 删除本地表
drop table cktest_local on cluster ck_cluster;
分片规则
分片键要求返回一个整型类型的取值,包括 Int和 UInt 类型的系列
-- Distributed( 服务器配置文件中的集群名 , 远程数据库名 , 远程表名 , 数据分片键(可选))
-- 分片键可以是一个具体的整型字段
-- 按照用户 ID 划分
Distributed(cluster,database,table,id)
-- 分片键也可以是返回整型的表达式
-- 按照随机数划分
Distributed(cluster,database,table,rand())
-- 按照用户 ID 的散列值划分
Distributed(cluster,database,table,intHash64(userid))
插入数据
-- 10.16.5.217服务 插入全局表数据
insert into cktest_all values(1,'zhang',18),(2,'li',22),(3,'zhao',23),(4,'qian',24),(5,'sun',25),(6,'wang',26),(7,'tian',27),(8,'he',28),(9,'zheng',29),(10,'dong',30);
-- 10.16.5.219服务 插入本地数据
insert into cktest_local values (14,'100',14),(15,'100',15);
-- 10.16.5.218服务 插入本地数据
insert into cktest_local values (11,'100',11),(12,'100',12),(13,'100',13);
查看数据
操作10.16.5.217 服务
-- 查询数据
T-ITARCH-DB-fff17c52 :) SELECT * from cktest_local;
SELECT *
FROM cktest_local
Query id: 6a99ef9a-a394-40d0-8f81-4325ec9401b2
┌─id─┬─name──┬─age─┐
│ 1 │ zhang │ 18 │
│ 8 │ he │ 28 │
└────┴───────┴─────┘
2 rows in set. Elapsed: 0.003 sec.
-- 查询全局表数据
T-ITARCH-DB-fff17c52 :) SELECT * from cktest_all;
SELECT *
FROM cktest_all
Query id: 389b1827-0c89-468e-ad08-bb0177228216
┌─id─┬─name──┬─age─┐
│ 1 │ zhang │ 18 │
│ 8 │ he │ 28 │
└────┴───────┴─────┘
┌─id─┬─name─┬─age─┐
│ 11 │ 100 │ 11 │
│ 12 │ 100 │ 12 │
│ 13 │ 100 │ 13 │
└────┴──────┴─────┘
┌─id─┬─name──┬─age─┐
│ 2 │ li │ 22 │
│ 3 │ zhao │ 23 │
│ 6 │ wang │ 26 │
│ 9 │ zheng │ 29 │
│ 10 │ dong │ 30 │
└────┴───────┴─────┘
┌─id─┬─name─┬─age─┐
│ 4 │ qian │ 24 │
│ 5 │ sun │ 25 │
│ 7 │ tian │ 27 │
└────┴──────┴─────┘
┌─id─┬─name─┬─age─┐
│ 14 │ 100 │ 14 │
│ 15 │ 100 │ 15 │
└────┴──────┴─────┘
15 rows in set. Elapsed: 0.046 sec.
操作10.16.5.218 服务
-- 查询数据
T-ITARCH-DB-acf73179 :) SELECT * from cktest_local;
SELECT *
FROM cktest_local
Query id: 42a85aef-e620-4d08-b69c-43f988d08926
┌─id─┬─name──┬─age─┐
│ 2 │ li │ 22 │
│ 3 │ zhao │ 23 │
│ 6 │ wang │ 26 │
│ 9 │ zheng │ 29 │
│ 10 │ dong │ 30 │
└────┴───────┴─────┘
┌─id─┬─name─┬─age─┐
│ 11 │ 100 │ 11 │
│ 12 │ 100 │ 12 │
│ 13 │ 100 │ 13 │
└────┴──────┴─────┘
8 rows in set. Elapsed: 0.003 sec.
-- 查询全局表数据
T-ITARCH-DB-acf73179 :) SELECT * from cktest_all;
SELECT *
FROM cktest_all
Query id: 8758fb94-2e8b-48e3-ae33-0a473bfde1db
┌─id─┬─name─┬─age─┐
│ 11 │ 100 │ 11 │
│ 12 │ 100 │ 12 │
│ 13 │ 100 │ 13 │
└────┴──────┴─────┘
┌─id─┬─name──┬─age─┐
│ 2 │ li │ 22 │
│ 3 │ zhao │ 23 │
│ 6 │ wang │ 26 │
│ 9 │ zheng │ 29 │
│ 10 │ dong │ 30 │
└────┴───────┴─────┘
┌─id─┬─name──┬─age─┐
│ 1 │ zhang │ 18 │
│ 8 │ he │ 28 │
└────┴───────┴─────┘
┌─id─┬─name─┬─age─┐
│ 14 │ 100 │ 14 │
│ 15 │ 100 │ 15 │
└────┴──────┴─────┘
┌─id─┬─name─┬─age─┐
│ 4 │ qian │ 24 │
│ 5 │ sun │ 25 │
│ 7 │ tian │ 27 │
└────┴──────┴─────┘
操作10.16.5.219 服务
-- 查询数据
T-IS-APP-ae5e913b :) SELECT * from cktest_all;
SELECT *
FROM cktest_all
Query id: a13d570d-0395-463a-83dd-98d667ab37ef
┌─id─┬─name─┬─age─┐
│ 14 │ 100 │ 14 │
│ 15 │ 100 │ 15 │
└────┴──────┴─────┘
┌─id─┬─name─┬─age─┐
│ 4 │ qian │ 24 │
│ 5 │ sun │ 25 │
│ 7 │ tian │ 27 │
└────┴──────┴─────┘
┌─id─┬─name──┬─age─┐
│ 2 │ li │ 22 │
│ 3 │ zhao │ 23 │
│ 6 │ wang │ 26 │
│ 9 │ zheng │ 29 │
│ 10 │ dong │ 30 │
└────┴───────┴─────┘
┌─id─┬─name─┬─age─┐
│ 11 │ 100 │ 11 │
│ 12 │ 100 │ 12 │
│ 13 │ 100 │ 13 │
└────┴──────┴─────┘
┌─id─┬─name──┬─age─┐
│ 1 │ zhang │ 18 │
│ 8 │ he │ 28 │
└────┴───────┴─────┘
15 rows in set. Elapsed: 0.048 sec.
-- 查询全局表数据
T-IS-APP-ae5e913b :) SELECT * from cktest_local;
SELECT *
FROM cktest_local
Query id: 8d32646a-b2d5-4d00-acdf-69fba61a6706
┌─id─┬─name─┬─age─┐
│ 4 │ qian │ 24 │
│ 5 │ sun │ 25 │
│ 7 │ tian │ 27 │
└────┴──────┴─────┘
┌─id─┬─name─┬─age─┐
│ 14 │ 100 │ 14 │
│ 15 │ 100 │ 15 │
└────┴──────┴─────┘
5 rows in set. Elapsed: 0.003 sec.