clickhouse集群部署方案
以三台服务器为例,做3分片0副本部署
主机端口备注10.16.5.21790001分片,0副本10.16.5.21890001分片,0副本10.16.5.21990001分片,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)
三个服务器同样的操作
编辑metrika.xml
(vim /etc/clickhouse-server/metrika.xml 三台服务器有区别)
标签解释:
修改文件、目录的所属用户与所属组
( 三台服务器同样操作)
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)
10.16.5.218、10.16.5.219服务器配置:
启动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.
参考链接
发表评论