ckman 部署 ClickHouse 集群

  • ckman是一款管理和监控ClickHouse集群的工具。它通过前端界面直观展示集群的相关信息,可以便捷地对集群进行部署、升级,节点的增删等。
  • git:https://github.com/housepower/ckman
  • 规划
hostname ip 用户 用户目录 部署服务 用途
ckman 172.25.8.185 ckman /app/ckman ckman ckman 管理服务
zk1 172.25.8.180 zookeeper /app/aookeeper zookeeper zookeeper 集群节点 1
zk2 172.25.8.179 zookeeper /app/aookeeper zookeeper zookeeper 集群节点 2
zk3 172.25.8.182 zookeeper /app/aookeeper zookeeper zookeeper 集群节点3
ck1 172.25.8.183 clickhouse /app/clickhouse clickhouse clickhouse 集群节点01
ck2 172.25.8.178 clickhouse /app/clickhouse clickhouse clickhouse 集群节点02
ck3 172.25.8.177 clickhouse /app/clickhouse clickhouse clickhouse 集群节点03
ck4 172.25.8.176 clickhouse /app/clickhouse clickhouse clickhouse 01 节点的副本节点
ck5 172.25.8.181 clickhouse /app/clickhouse clickhouse clickhouse 02 节点的副本节点
ck6 172.25.8.184 clickhouse /app/clickhouse clickhouse clickhouse 03 节点的副本节点

部署 ckman

1
wget https://github.com/housepower/ckman/releases/download/v3.1.3/ckman-v3.1.3-240527.Linux.amd64.tar.gz
  • 安装
1
tar -zxvf ckman-v3.1.3-240527.Linux.amd64.tar.gz  -C /app/ckman/
  • 启动
1
2
cd /app/ckman/ckman
bin/start
  • 访问:http://IP:8808
  • 默认用户名密码为:ckman/Ckman123456!

部署 zookeeper

  • 上传 jdk、zookeeper 安装包
    • jdk:https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
    • zookeeper:https://archive.apache.org/dist/zookeeper/
  • zookeeper 用户执行
  • 当前使用版本:
    • jdk-8u411-linux-x64.tar.gz
    • apache-zookeeper-3.8.4-bin.tar.gz

配置 jdk(所有部署zk的节点配置)

  • 解压
1
2
mkdir -p /app/zookeeper/jdk
tar -zxvf jdk-8u411-linux-x64.tar.gz -C /app/zookeeper/jdk/
  • 配置 jdk 环境变量
1
2
3
4
5
6
7
8
cat >>~/.bashrc <<EOF
JAVA_HOME=/app/zookeeper/jdk/jdk1.8.0_411
PATH=\$JAVA_HOME/bin:\$PATH 
CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export CLASSPATH
export PATH
EOF
  • 生效环境变量
1
source ~/.bashrc

安装 zookeeper(所有部署zk的节点均执行)

  • 创建安装目录
1
2
mkdir -p /app/zookeeper/zookeeper
mkdir -p /app/zookeeper/zookeeper/data
  • 解压缩至安装目录下
1
tar -zxf apache-zookeeper-3.8.4-bin.tar.gz  -C /app/zookeeper/zookeeper
  • 建立软连接
1
2
cd /app/zookeeper/zookeeper
ln -sfn apache-zookeeper-3.8.4-bin/ apache-zookeeper

修改 zookeeper 配置(所有部署zk的节点均执行)

  • 修改 zookeeper zoo.cfg 配置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$ vi /app/zookeeper/zookeeper/apache-zookeeper/conf/zoo.cfg
# ZooKeeper使用的基本时间单位,单位是毫秒。这个值用于心跳和超时等
tickTime=2000
# follower初始化与leader之间的连接时能容忍的最多心跳次数(tickTime的数量)
initLimit=10
# leader和follower之间发送消息,请求和应答时间长度,单位是tickTime
syncLimit=5
# ZooKeeper存储数据的目录
dataDir=/app/zookeeper/zookeeper/data
# 客户端连接ZooKeeper服务器的端口号
clientPort=2181

# ZooKeeper的度量提供者类名,这里配置的是PrometheusMetricsProvider,表示使用Prometheus进行监控
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
# Prometheus的HTTP服务端口
metricsProvider.httpPort=7000
# 是否导出JVM的相关信息给Prometheus
metricsProvider.exportJvmInfo=true

# 是否启用ZooKeeper的admin server
admin.enableServer=true
# ZooKeeper admin server的端口号
admin.serverPort=8080

# server.X=ip:port:port
## ZooKeeper集群中的服务器配置
## X代表服务器的编号
## ip是服务器的IP地址
## 第一个端口是服务器之间通信的端口,第二个端口是leader选举使用的端口。
server.1=172.25.8.180:2881:3881
server.2=172.25.8.179:2881:3881
server.3=172.25.8.182:2881:3881
# 自动清理的间隔(单位是小时),这里配置的是1小时清理一次
autopurge.purgeInterval=1
# 保留的快照文件数量,超过这个数量的旧文件会被清理
autopurge.snapRetainCount=5
  • 修改 zookeeper java.env 配置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
cat << 'EOF' | tee -a /app/zookeeper/zookeeper/apache-zookeeper/conf//java.env
#!/bin/sh

export JVMFLAGS="-Xms128m \
    -Xmx6g \
    -Xloggc:/var/log/zookeeper/zookeeper-gc.log \
    -XX:+UseGCLogFileRotation \
    -XX:NumberOfGCLogFiles=16 \
    -XX:GCLogFileSize=16M \
    -verbose:gc \
    -XX:+PrintGCTimeStamps \
    -XX:+PrintGCDateStamps \
    -XX:+PrintGCDetails \
    -XX:+PrintTenuringDistribution \
    -XX:+PrintGCApplicationStoppedTime \
    -XX:+PrintGCApplicationConcurrentTime \
    -XX:+PrintSafepointStatistics \
    -XX:+UseG1GC \
    -Djute.maxbuffer=8388608 \
    -XX:MaxGCPauseMillis=50 $JVMFLAGS"
EOF


# 参数说明
# - -Xms128m: 初始堆内存128MB。
# - -Xmx6g: 最大堆内存6GB。
# - -Xloggc: 垃圾收集日志路径。
# - -XX:+UseGCLogFileRotation: 启动日志轮转。
# - -XX:NumberOfGCLogFiles=16: 日志文件数16个。
# - -XX:GCLogFileSize=16M: 日志文件大小16MB。
# - -verbose:gc: 输出垃圾收集信息。
# - -XX:+PrintGCTimeStamps: 添加GC时间戳。
# - -XX:+PrintGCDateStamps: 添加GC日期戳。
# - -XX:+PrintGCDetails: 输出GC详细信息。
# - -XX:+PrintTenuringDistribution: 新生代年龄分布信息。
# - -XX:+PrintGCApplicationStoppedTime: 应用暂停时间。
# - -XX:+PrintGCApplicationConcurrentTime: 应用运行时间。
# - -XX:+PrintSafepointStatistics: 安全点统计信息。
# - -XX:+UseG1GC: 使用G1垃圾收集器。
# - -Djute.maxbuffer=8388608: ZooKeeper序列化缓冲区大小8MB。
# - -XX:MaxGCPauseMillis=50: 期望最大GC暂停时间50毫秒。
# $JVMFLAGS: 累加已有的JVMFLAGS参数。

节点配置节点标识(每个部署zk节点单独执行)

  • zk1
1
echo 1 >> /app/zookeeper/zookeeper/data/myid 
  • zk2
1
echo 2 >> /app/zookeeper/zookeeper/data/myid 
  • zk3
1
echo 3 >> /app/zookeeper/zookeeper/data/myid 

启动 Zookeeper 集群(所有部署zk的节点均执行)

1
/app/zookeeper/zookeeper/apache-zookeeper/bin/zkServer.sh  start
  • 查看集群状态
1
/app/zookeeper/zookeeper/apache-zookeeper/bin/zkServer.sh  status

部署 ClickHouse

调整系统配置(所有部署 ClickHouse 的节点均执行)

  • PS:需使用 root 用户执行,但是不执行不影响 ck 运行,仅作为调优用途

overcommit_memory 设为 0

  • 参数控制了系统在内存分配时是否允许超过实际可用内存的情况
  • 0: 默认值,允许传统的内存过度分配机制。系统会允许分配的内存总量超过实际可用内存,但只有在使用时才会分配物理内存。
  • 1: 始终允许内存过度分配。即使系统实际可用内存不足,系统也会继续分配内存,可能导致OOM。
  • 2: 禁用内存过度分配。当内存请求无法满足时,系统会拒绝分配内存
1
echo 0 | sudo tee /proc/sys/vm/overcommit_memory

关闭透明大页

  • 大页(Transparent HugePages)旨在提高应用程序性能,但对于数据库系统如ClickHouse,THP可能引发性能不稳定,特别是在处理大量小型随机访问时。大页可能导致内存碎片和延迟增加,因为操作系统需要更多时间来管理大页内存
  • ClickHouse等数据库系统建议禁用THP,以提高内存管理效率和整体性能
1
2
3
4
5
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.d/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
sudo chmod +x /etc/rc.d/rc.local

关闭 swap

1
swapoff -a
  • 更改 fstab 文件,注释到 swap 挂载文件
1
2
vim /etc/fstab
……

配置免密

  • ckman 服务器生层 key
1
2
# ckman 服务器执行,一路回车
ssh-keygen
  • 传key
1
2
3
4
5
6
ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no clickhouse@172.25.8.183
ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no clickhouse@172.25.8.178
ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no clickhouse@172.25.8.177
ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no clickhouse@172.25.8.176
ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no clickhouse@172.25.8.181
ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no clickhouse@172.25.8.184
  • 复制公钥至 ckman 目录
1
cp .ssh/id_rsa /app/ckman/ckman/conf/id_rsa

下载 clickhouse 安装包

ckman 上传安装包

  • Settings -> Upload Packages
  • 选择要上传的三个 tar 包,上传
  • 但是上传完包后,仅显示 clickhouse-common-static 包,系正常现象

创建集群

  • 首页 -> 创建集群
  • 按需配置 ck 节点
  • 根据实际情况配置 zk 节点
  • 配置 ck 数据目录、ckman 连接 ck 服务器的用户名、端口等
    • 注意,数据目录需先手动创建好
    • 注意,目录结尾要有斜杠(/)
  • 点击创建集群,等待创建完成
  • 查看集群

参考