ClickHouse数据库集群(分片+复制)安装部署
背景
ClickHouse 由俄罗斯第一大搜索引擎 Yandex 发布,是一个基于列的,面向 OLAP 的开源轻量级数据库管理系统,能够使用 SQL 查询实时生成分析数据报告,适合 PB 数据量级的实时大数据分析。
ClickHouse特性
- 快速:ClickHouse 会充分利用所有可用的硬件,以尽可能快地处理每个查询。单个查询的峰值处理性能超过每秒 2 TB(解压缩后,仅使用的列)。在分布式设置中,读取是在健康副本之间自动平衡的,以避免增加延迟。
- 容错:ClickHouse 支持多主机异步复制,并且可以跨多个数据中心进行部署。所有节点都相等,这可以避免出现单点故障。单个节点或整个数据中心的停机时间不会影响系统的读写可用性。
- 可伸缩:ClickHouse 可以在垂直和水平方向上很好地缩放。ClickHouse 易于调整以在具有数百或数千个节点的群集上或在单个服务器上,甚至在小型虚拟机上执行。当前,每个单节点安装的数据量超过数万亿行或数百兆兆字节。
- 易用:ClickHouse 简单易用,开箱即用。它简化了所有数据处理:将所有结构化数据吸收到系统中,并且立即可用于构建报告。SQL 允许表达期望的结果,而无需涉及某些 DBMS 中可以找到的任何自定义非标准 API。
- 充分利用硬件:ClickHouse 与具有相同的可用 I/O 吞吐量和 CPU 容量的传统的面向行的系统相比,其处理典型的分析查询要快两到三个数量级。列式存储格式允许在 RAM 中容纳更多热数据,从而缩短了响应时间。
- 提高 CPU 效率:向量化查询执行涉及相关的 SIMD 处理器指令和运行时代码生成。处理列中的数据会提高 CPU 行缓存的命中率。优化磁盘访问:ClickHouse 可以最大程度地减少范围查询的次数,从而提高了使用旋转磁盘驱动器的效率,因为它可以保持连续存储数据。
- 最小化数据传输:ClickHouse 使公司无需使用专门针对高性能计算的专用网络即可管理其数据
环境准备
架构: zookeeper + clickhouse
主机名及IP
152-cs1 10.55.2.152
178-cs2 10.2.4.178
179-cs3 10.2.4.179
主机规划:
主机 | Clickhouse服务和端口 | ZK服务和端口 |
152-cs1 | Sharding1-9000 | ZK-2181 |
178-cs2 | Sharding2-9000 | ZK-2181 |
179-cs3 | Sharding3-9000 | ZK-2181 |
部署配置zookeeper
所有节点下载和安装JDK环境1.8以上
[root@152-cs1 ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
所有节点下载和安装zookeeper
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
[root@152-cs1 ~]# cd /home/
[root@152-cs1 home]# tar xf apache-zookeeper-3.6.3-bin.tar.gz
创建软连接
[root@152-cs1 home]# ln -s apache-zookeeper-3.6.3-bin zookeeper
[root@152-cs1 home]# ll
总用量 12224
drwxr-xr-x 6 root root 133 8月 17 14:21 apache-zookeeper-3.6.3-bin
-rw-r--r-- 1 root root 12516362 8月 17 09:46 apache-zookeeper-3.6.3-bin.tar.gz
drwx------. 7 mysql mysql 190 6月 29 13:46 mysql
lrwxrwxrwx 1 root root 26 8月 17 14:22 zookeeper -> apache-zookeeper-3.6.3-bin
添加环境变量:
[root@152-cs1 home]# vim /etc/profile
export PATH=$PATH:/home/zookeeper/bin
加载环境变量:
[root@152-cs1 home]# source /etc/profile
152上操作:
创建对应目录
[root@152-cs1 home]# mkdir -p /home/zookeeper/{logs,data}
配置zookeeper
[root@152-cs1 home]# cp /home/zookeeper/conf/zoo_sample.cfg /home/zookeeper/conf/zoo.cfg
编辑配置文件
[root@178-cs2 zookeeper]# egrep -v "^#|^#34; conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/zookeeper/data
dataLogDir=/home/zookeeper/logs
clientPort=2181
maxClientCnxns=100
autopurge.snapRetainCount=10
autopurge.purgeInterval=24
server.3= 10.55.2.152:2888:3888
server.2= 10.2.4.178:2888:3888
server.1= 10.2.4.179:2888:3888
将文件发送到其他两台服务器
[root@152-cs1 home]# scp /home/zookeeper/conf/zoo.cfg 10.2.4.178:/home/zookeeper/conf/zoo.cfg
[root@152-cs1 home]# scp /home/zookeeper/conf/zoo.cfg 10.2.4.179:/home/zookeeper/conf/zoo.cfg
配置文件解释:
tickTime这个时间是作为zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是说每个tickTime时间就会发送一个心跳。
initLimit这个配置项是用来配置zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。
当已经超过10个心跳的时间(也就是tickTime)长度后 zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20秒。
syncLimit这个配置项标识leader与follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。
dataDir顾名思义就是zookeeper保存数据的目录,默认情况下zookeeper将写数据的日志文件也保存在这个目录里;
clientPort这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求;
server.A=B:C: D中的A是一个数字,表示这个是第几号服务器,B是这个服务器的IP地址,C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的leader服务器交换信息的端口,D是在leader挂掉时专门用来进行选举leader所用的端口。
创建ServerID标识:
除了修改zoo.cfg配置文件外,zookeeper集群模式下还要配置一个myid文件,这个文件需要放在dataDir目录下。
这个文件里面有一个数据就是A的值(该A就是zoo.cfg文件中server.A=B:C: D中的A),在zoo.cfg文件中配置的dataDir路径中创建myid文件
创建标识文件
[root@152-cs1 zookeeper]# echo "3" > /home/zookeeper/data/myid
[root@178-cs2 zookeeper]# echo "2" > /home/zookeeper/data/myid
[root@179-cs3 zookeeper]# echo "1" > /home/zookeeper/data/myid
启动每个节点的zookeeper服务
每个节点执行
[root@178-cs2 zookeeper]# /home/zookeeper/bin/zkServer.sh start
查看状态(可以看到3是leader)
[root@179-cs3 zookeeper]# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
其他节点为follower
[root@152-cs1 zookeeper]# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
停掉leader.查看自动选主
[root@179-cs3 zookeeper]# bin/zkServer.sh stop
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
[root@179-cs3 zookeeper]# bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@179-cs3 zookeeper]# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Error contacting service. It is probably not running.
[root@179-cs3 zookeeper]# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Error contacting service. It is probably not running.
[root@179-cs3 zookeeper]# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
查看哪台机器现在为主:
[root@178-cs2 zookeeper]# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
连接zookeeper:
[root@178-cs2 zookeeper]# bin/zkCli.sh -server 127.0.0.1:2181
/usr/bin/java
Connecting to 127.0.0.1:2181
[zk: 127.0.0.1:2181(CONNECTED) 0] ls /
[zookeeper]
安装ClickHouse
yum install yum-utils
rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/clickhouse.repo
yum install clickhouse-server clickhouse-client -y
配置clickhouse
服务端配置文件:/etc/clickhouse-server/config.xml
客户端配置文件:/etc/clickhouse-client/config.xml
修改数据目录和日志目录路径
mkdir -p /home/clickhouse/log
chown -R clickhouse:clickhouse /home/clickhouse/
修改配置文件:
vim /etc/clickhouse-server/config.xml
<path>/home/clickhouse/</path>
<tmp_path>/home/clickhouse/tmp/</tmp_path>
<user_files_path>/home/clickhouse/user_files/</user_files_path>
<format_schema_path>/home/clickhouse/format_schemas/</format_schema_path>
<log>/home/clickhouse/log/clickhouse-server.log</log>
<errorlog>/home/clickhouse/log/clickhouse-server.err.log</errorlog>
<listen_host>0.0.0.0</listen_host>
启动clickhouse.验证是否启动成功:
[root@152-cs1 zookeeper]# systemctl start clickhouse-server.service
[root@152-cs1 zookeeper]# netstat -lntp|grep click
tcp 0 0 127.0.0.1:9004 0.0.0.0:* LISTEN 21884/clickhouse-se
tcp 0 0 127.0.0.1:9009 0.0.0.0:* LISTEN 21884/clickhouse-se
tcp 0 0 127.0.0.1:8123 0.0.0.0:* LISTEN 21884/clickhouse-se
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 21884/clickhouse-se
tcp6 0 0 ::1:9004 :::* LISTEN 21884/clickhouse-se
tcp6 0 0 ::1:9009 :::* LISTEN 21884/clickhouse-se
tcp6 0 0 ::1:8123 :::* LISTEN 21884/clickhouse-se
tcp6 0 0 ::1:9000 :::* LISTEN 21884/clickhouse-se
连接clickhouse测试:
[root@152-cs1 zookeeper]# clickhouse-client
ClickHouse client version 21.8.3.44 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 21.8.3 revision 54449.
152-cs1 :)
搭建3分片一副本集群
集群只需要加一个配置文件就可以了.我们上边搭建的相当于是3个单机的clickhouse
编辑配置文件/etc/metrika.xml 这个文件默认没有.需要创建
vim /etc/metrika.xml
<yandex>
<!--这里的标签是config.xml里的incl指定的-->
<clickhouse_remote_servers>
<!--集群名称,clickhouse支持多集群的模式-->
<lzm>
<!--定义分片节点,这里我指定3个分片,每个分片只有1个副本,也就是它本身-->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>10.55.2.152</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<internal_replication>true</internal_replication>
<host>10.2.4.178</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>10.2.4.179</host>
<port>9000</port>
</replica>
</shard>
</lzm>
</clickhouse_remote_servers>
<!--zookeeper相关配置-->
<zookeeper-servers>
<node index="1">
<host>10.2.4.179</host>
<port>2181</port>
</node>
<node index="2">
<host>10.2.4.178</host>
<port>2181</port>
</node>
<node index="3">
<host>10.55.2.152</host>
<port>2181</port>
</node>
</zookeeper-servers>
<!--定义宏变量,后面需要用-->
<macros>
<replica>10.2.4.178</replica>
</macros>
<!--不限制访问来源ip地址-->
<networks>
<ip>::/0</ip>
</networks>
<!--数据压缩方式,默认为lz4-->
<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>
</yandex>
然后将这个文件scp到其他两台机器
注意配置里边的这一段.每个机器改成自己的
<!--定义宏变量,后面需要用-->
<macros>
<replica>10.2.4.178</replica>
</macros>
<!--定义宏变量,后面需要用-->
<macros>
<replica>10.55.2.152</replica>
</macros>
<!--定义宏变量,后面需要用-->
<macros>
<replica>10.2.4.179</replica>
</macros>
启动clickhouse集群查看状态
[root@152-cs1 ~]# systemctl start clickhouse-server.service
[root@152-cs1 ~]# clickhouse-client -m
ClickHouse client version 20.3.5.21 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.3.5 revision 54433.
152-cs1 :) select * from system.clusters;
SELECT *
FROM system.clusters
┌─cluster───────────────────────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name───┬─host_address─┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ lzm │ 1 │ 1 │ 1 │ 10.55.2.152 │ 10.55.2.152 │ 9000 │ 1 │ default │ │ 0 │ 0 │
│ lzm │ 2 │ 1 │ 1 │ 10.2.4.178 │ 10.2.4.178 │ 9000 │ 0 │ default │ │ 0 │ 0 │
│ lzm │ 3 │ 1 │ 1 │ 10.2.4.179 │ 10.2.4.179 │ 9000 │ 0 │ default │ │ 0 │ 0 │
│ test_cluster_two_shards │ 1 │ 1 │ 1 │ 127.0.0.1 │ 127.0.0.1 │ 9000 │ 1 │ default │ │ 0 │ 0 │
│ test_cluster_two_shards │ 2 │ 1 │ 1 │ 127.0.0.2 │ 127.0.0.2 │ 9000 │ 0 │ default │ │ 0 │ 0 │
│ test_cluster_two_shards_localhost │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │ 0 │ 0 │
│ test_cluster_two_shards_localhost │ 2 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │ 0 │ 0 │
│ test_shard_localhost │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │ 0 │ 0 │
│ test_shard_localhost_secure │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9440 │ 0 │ default │ │ 0 │ 0 │
│ test_unavailable_shard │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │ 0 │ 0 │
│ test_unavailable_shard │ 2 │ 1 │ 1 │ localhost │ ::1 │ 1 │ 0 │ default │ │ 0 │ 0 │
└───────────────────────────────────┴───────────┴──────────────┴─────────────┴─────────────┴──────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘
11 rows in set. Elapsed: 0.001 sec.
152-cs1 :) select * from system.zookeeper where path = '/'
:-] ;
SELECT *
FROM system.zookeeper
WHERE path = '/'
┌─name───────┬─value─┬───────czxid─┬───────mzxid─┬───────────────ctime─┬───────────────mtime─┬─version─┬─cversion─┬─aversion─┬─ephemeralOwner─┬─dataLength─┬─numChildren─┬───────pzxid─┬─path─┐
│ zookeeper │ │ 0 │ 0 │ 0000-00-00 00:00:00 │ 0000-00-00 00:00:00 │ 0 │ -2 │ 0 │ 0 │ 0 │ 2 │ 0 │ / │
│ clickhouse │ │ 30064771080 │ 30064771080 │ 2021-08-18 10:01:04 │ 2021-08-18 10:01:04 │ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 30064771081 │ / │
└────────────┴───────┴─────────────┴─────────────┴─────────────────────┴─────────────────────┴─────────┴──────────┴──────────┴────────────────┴────────────┴─────────────┴─────────────┴──────┘
2 rows in set. Elapsed: 0.010 sec.
152-cs1 :) select * from system.zookeeper where path = '/clickhouse';
SELECT *
FROM system.zookeeper
WHERE path = '/clickhouse'
┌─name───────┬─value─┬───────czxid─┬───────mzxid─┬───────────────ctime─┬───────────────mtime─┬─version─┬─cversion─┬─aversion─┬─ephemeralOwner─┬─dataLength─┬─numChildren─┬───────pzxid─┬─path────────┐
│ task_queue │ │ 30064771081 │ 30064771081 │ 2021-08-18 10:01:04 │ 2021-08-18 10:01:04 │ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 30064771082 │ /clickhouse │
└────────────┴───────┴─────────────┴─────────────┴─────────────────────┴─────────────────────┴─────────┴──────────┴──────────┴────────────────┴────────────┴─────────────┴─────────────┴─────────────┘
1 rows in set. Elapsed: 0.005 sec.
至此,一个简单的clickhouse的三分片一副本集群就搭建完毕了.
注意
不要使用最新版的clickhouse版本.我使用的版本是20.3.5.21-2
在使用21.8.3.44-2 版本的clickhouse时.搭建集群失败.换了20版本就好了.希望大家注意
yum install -y clickhouse-server-20.3.5.21-2.noarch clickhouse-client-20.3.5.21-2.noarch
总结
这篇文章主要分享了ClickHouse的集群搭建
请先 后发表评论~