目录
前言
1.本文搭建基于3台服务器的clickhouse分布式集群
2.zk和clickhouse版本可能存在适配性问题,本文使用版本能成功搭建,若其他版本在clickhouse分布式部署时有相关报错,可能是版本问题。
1.JDK环境
不做赘述,查看是否安装
java -version
2.zk环境
本文使用的是 apache-zookeeper-3.8.3-bin.tar.gz
注:
1.zk需要奇数服务器搭建,方便支持投票机制
2.以下操作每台服务器都操作一遍
2.1 下载解压
下载地址:Index of /apache/zookeeper/zookeeper-3.8.3 或 apache-zookeeper-3.8.3-bin.tar.gz
(1)下载并上传到服务器指定文件夹,如:/opt/soft/ 下
(2)tar -zxvf apache-zookeeper-3.8.3-bin.tar.gz
2.2 配置环境变量
vim /etc/profile
export ZK_HOME=/opt/soft/apache-zookeeper-3.8.3-bin
export PATH=$PATH:$ZK_HOME/bin
##使环境变量生效
source /etc/profile
##查看是否生效
echo $ZK_HOME
2.3 集群配置
1)创建相关目录
mkdir /opt/soft/apache-zookeeper-3.8.3-bin/data
mkdir /opt/soft/apache-zookeeper-3.8.3-bin/log
2)修改zk配置
cd apache-zookeeper-3.8.3-bin/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
<!-- 修改此处指定位置 -->
dataDir=/opt/soft/apache-zookeeper-3.8.3-bin/data
dataLogDir=/opt/soft/apache-zookeeper-3.8.3-bin/log
<!-- 末尾添加内容 -->
server.174=10.35.36.174:2888:3888
server.175=10.35.36.175:2888:3888
server.176=10.35.36.176:2888:3888
server.xx=ip:2888:3888
xx:自定义序列号,标识服务器
3)添加myid到刚才新建的data目录下
此处174为server.xx中的xx,每台服务器不一样,注意修改
echo 174 >/opt/soft/apache-zookeeper-3.8.3-bin/data/myid
2.4 启动测试zk集群
zkServer.sh start
zkServer.sh status
三台服务器启动后查看启动状态,如下表示正常,一个leader,两个follower。
可尝试连接
zkCli.sh -server 10.35.36.176:2181,10.35.36.175:2181,10.35.36.176:2181
3.clickhouse环境
3.1 下载安装
本文中使用的是23.9.1.1854版本
方式一:
wget https://packages.clickhouse.com/rpm/stable/clickhouse-server-23.9.1.1854.x86_64.rpm
wget https://packages.clickhouse.com/rpm/stable/clickhouse-common-static-23.9.1.1854.x86_64.rpm
wget https://packages.clickhouse.com/rpm/stable/clickhouse-client-23.9.1.1854.x86_64.rpm
方式二:
clickhouse-client-23.9.1.1854.x86-64.rpm
clickhouse-common-static-23.9.1.1854.x86-64.rpm
clickhouse-server-23.9.1.1854.x86-64.rpm
(1)下载到指定文件夹,如:/opt/soft/clickhouse下
(2)rpm -ivh *.rpm,过程中会要求输入密码,可自行输入亦可不输入,本文直接回车不输入
3.2 集群配置
1)查看端口是否被占用,lsof -i:9000
clickhouse默认9000端口通常会和Python冲突
2)vim /etc/clickhouse-server/config.xml
<!-- 若第一步中9000端口被占用,则可以更改端口 -->
<tcp_port>6000</tcp_port>
<!-- 取消注释,更改监听让所有正常ip可连接 -->
<listen_host>0.0.0.0</listen_host>
<!-- 修改remote_servers中的内容如下 -->
<remote_servers>
<!-- 可自定义clickhouse集群名 -->
<ck_cluster>
<!-- 数据分片1 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>10.35.36.174</host>
<port>6000</port> <!-- 注意端口是否更改,默认9000 -->
</replica>
</shard>
<!-- 数据分片2 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>10.35.36.175</host>
<port>6000</port> <!-- 注意端口是否更改,默认9000 -->
</replica>
</shard>
<!-- 数据分片3 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>10.35.36.176</host>
<port>6000</port> <!-- 注意端口是否更改,默认9000 -->
</replica>
</shard>
</ck_cluster>
</remote_servers>
<!-- 新增,每个机器shard分别为01,02,03,replica也为对应服务器地址174,175,176 -->
<macros>
<layer>ck_cluster</layer>
<shard>01</shard>
<replica>10.35.36.176</replica>
</macros>
<zookeeper>
<!-- index内容为server.xxx:ip:2888:3888中的xxx -->
<node index="174">
<host>10.35.36.174</host>
<port>2181</port>
</node>
<node index="175">
<host>10.35.36.175</host>
<port>2181</port>
</node>
<node index="176">
<host>10.35.36.176</host>
<port>2181</port>
</node>
</zookeeper>
3.3 启动clickhouse集群
systemctl start clickhouse-server
systemctl status clickhouse-server
启动成功,登录clickhouse集群:
#注:若未更改9000端口,则 clickhouse-client 即可
clickhouse-client --port 6000 -m
SELECT * from system.clusters;
SELECT * FROM system.zookeeper WHERE path = '/clickhouse';
如上表示clickhouse分布式部署成功,若返回KEEPER EXCEPTION之类的,则部署有问题。
3.4 测试
1)创建数据库
# 在自定义的ck_cluster集群上创建数据库,一台服务器执行即可部署clickhouse集群
CREATE DATABASE cluster_test ON CLUSTER ck_cluster;
2)创建表
# 创建测试表,每台服务器自己的本地表
CREATE TABLE cluster_test.cktest_local ON CLUSTER ck_cluster
(
`id` Int64,
`name` String,
`age` Int32
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/cktest_local', '{replica}')
ORDER BY id;
# 创建测试表,分布式表(所有数据)
CREATE TABLE cluster_test.cktest_all ON CLUSTER ck_cluster
(
`id` Int64,
`name` String,
`age` Int32
)
ENGINE = Distributed('ck_cluster', 'cluster_test', 'cktest_local', rand());
3)插入数据
# 服务器174中,连接clickhouse,插入测试数据
insert into cktest_local 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);
# 服务器175中,连接clickhouse,插入测试数据
insert into cktest_local values (14,'100',14),(15,'100',15);
# 服务器176中,连接clickhouse,插入测试数据
insert into cktest_local values (11,'100',11),(12,'100',12),(13,'100',13);
4)查询
# 在不同服务器中只能看到在本服务器上插入的数据
SELECT * FROM cktest_local;
# 无论在哪台服务器执行,都可看到三次插入的所有数据
SELECT * FROM cktest_all;
4.过程中遇到的问题
Coordination::Exception: Unexpected handshake length received: 37 (Marshalling error): while receiving handshake from ZooKeeper. (KEEPER_EXCEPTION) (version 22.6.3.35 (official build))
不清楚是不是版本问题,换了版本就行了,有知道的大佬可以说下。