ckman 部署 ClickHouse 集群

  • ckman是一款管理和监控ClickHouse集群的工具。它通过前端界面直观展示集群的相关信息,可以便捷地对集群进行部署、升级,节点的增删等。
  • git:https://github.com/housepower/ckman
  • 规划
hostname ip 部署服务
db1 172.17.191.106 ckman/zookeeper01/clickhouse01
db2 172.17.191.107 zookeeper02/clickhouse02
db3 172.17.191.108 zookeeper03/clickhouse03

部署 ckman(db1上操作)

  • 下载 deb 包
1
wget https://github.com/housepower/ckman/releases/download/v3.1.3/ckman_3.1.3_amd64.deb
  • 安装
1
dpkg -i ckman_3.1.3_amd64.deb
  • 启动
1
2
systemctl start ckman
systemctl enable ckman
  • 访问:
    • 由于部署在阿里云上,通过阿里云外网 IP 访问:http://39.106.152.253:8808/
    • 默认账号密码:ckman/Ckman123456!

部署 zookeeper

创建用户(db1/db2/db3均执行)

1
sudo  useradd -m -r  -s /bin/bash -b /app zookeeper

切换至 zookeeper 用户,安装服务(db1/db2/db3 均执行)

  • 切换用户
1
sudo su - zookeeper
  • 部署 jdk
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
1
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
  • 创建 zookepper 安装目录
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 配置文件

  • db1/db2/db3 zookeeper 更改配置文件
 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.17.191.106:2881:3881
server.2=172.17.191.107:2881:3881
server.3=172.17.191.108:2881:3881
# 自动清理的间隔(单位是小时),这里配置的是1小时清理一次
autopurge.purgeInterval=1
# 保留的快照文件数量,超过这个数量的旧文件会被清理
autopurge.snapRetainCount=5
  • db1/db2/db3 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 \
    -Xmx2g \
    -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参数。
  • 增加 myid 文件

    • db1
    1
    
    echo 1 >> /app/zookeeper/zookeeper/data/myid 
    
    • db2
    1
    
    echo 2 >> /app/zookeeper/zookeeper/data/myid 
    
    • db3
    1
    
    echo 3 >> /app/zookeeper/zookeeper/data/myid 
    

启动 Zookeeper 集群

  • db1/db2/db3
1
/app/zookeeper/zookeeper/apache-zookeeper/bin/zkServer.sh  start

查看集群状态

  • db1/db2/db3
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# db1
$ /app/zookeeper/zookeeper/apache-zookeeper/bin/zkServer.sh  status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/zookeeper/apache-zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
# db2
$ /app/zookeeper/zookeeper/apache-zookeeper/bin/zkServer.sh  status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/zookeeper/apache-zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
# db3
$ /app/zookeeper/zookeeper/apache-zookeeper/bin/zkServer.sh  status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/zookeeper/apache-zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

部署 ClickHouse 集群

调整系统配置

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
# 一路回车
ssh-keygen
  • 传key
1
2
3
ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no root@172.17.191.106
ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no root@172.17.191.107
ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no root@172.17.191.108
  • 复制公钥至 ckman 目录
1
cp .ssh/id_rsa /etc/ckman/conf/id_rsa

准备数据目录

  • db1/db2/db3 均执行
1
mkdir -p /data/clickhouse

下载 clickhouse 安装包

  • 下载地址
    • 官网:https://repo.yandex.ru/clickhouse/
    • 阿里:https://mirrors.aliyun.com/clickhouse/
  • 版本说明:
    • lts: 长期支持版本,稳定且提供长时间维护
    • prestable: 准备稳定的版本,新功能正在最终测试中
    • stable: 稳定版本,适合大多数用户日常使用
    • testing: 测试版本,含最新功能,可能不够稳定,适合开发者和测试者
  • 下载包:
    • clickhouse-common-static_22.8.5.29_amd64.deb
    • clickhouse-server_22.8.5.29_amd64.deb
    • clickhouse-client_22.8.5.29_amd64.deb

ckman 上传安装包

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

创建集群

  • 首页 -> 创建集群
  • 注意:数据存储路径需提前创建,且以斜杠结尾
  • 配置后点击创建
  • 等待任务完成
  • 查看集群信息如下

参考