ClickHouse数据库集群(分片+复制)安装部署

背景

ClickHouse 由俄罗斯第一大搜索引擎 Yandex 发布,是一个基于列的,面向 OLAP 的开源轻量级数据库管理系统,能够使用 SQL 查询实时生成分析数据报告,适合 PB 数据量级的实时大数据分析。



ClickHouse特性

  1. 快速:ClickHouse 会充分利用所有可用的硬件,以尽可能快地处理每个查询。单个查询的峰值处理性能超过每秒 2 TB(解压缩后,仅使用的列)。在分布式设置中,读取是在健康副本之间自动平衡的,以避免增加延迟。
  2. 容错:ClickHouse 支持多主机异步复制,并且可以跨多个数据中心进行部署。所有节点都相等,这可以避免出现单点故障。单个节点或整个数据中心的停机时间不会影响系统的读写可用性。
  3. 可伸缩:ClickHouse 可以在垂直和水平方向上很好地缩放。ClickHouse 易于调整以在具有数百或数千个节点的群集上或在单个服务器上,甚至在小型虚拟机上执行。当前,每个单节点安装的数据量超过数万亿行或数百兆兆字节。
  4. 易用:ClickHouse 简单易用,开箱即用。它简化了所有数据处理:将所有结构化数据吸收到系统中,并且立即可用于构建报告。SQL 允许表达期望的结果,而无需涉及某些 DBMS 中可以找到的任何自定义非标准 API。
  5. 充分利用硬件:ClickHouse 与具有相同的可用 I/O 吞吐量和 CPU 容量的传统的面向行的系统相比,其处理典型的分析查询要快两到三个数量级。列式存储格式允许在 RAM 中容纳更多热数据,从而缩短了响应时间。
  6. 提高 CPU 效率:向量化查询执行涉及相关的 SIMD 处理器指令和运行时代码生成。处理列中的数据会提高 CPU 行缓存的命中率。优化磁盘访问:ClickHouse 可以最大程度地减少范围查询的次数,从而提高了使用旋转磁盘驱动器的效率,因为它可以保持连续存储数据。
  7. 最小化数据传输: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的集群搭建

举报
评论 0