clickhouse集群部署以及分布式表引擎使用

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)

三个服务器同样的操作
<!-- 修改 -->
<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. 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值