简介:本资源是专为国产化信创环境定制的ClickHouse 21.8.14编译安装包,面向使用华为鲲鹏920服务器(aarch64架构)与银河麒麟V10操作系统的运维工程师、大数据平台开发者及信创项目实施人员,解决主流x86版本ClickHouse在ARM+国产OS环境下无法直接部署的核心兼容性问题。压缩包共20个文件,含2个Shell脚本(install.sh/uninstall.sh)、1个systemd服务单元文件(clickhouse-server.service)、1个核心配置文件(config.xml)、1个用户权限配置(users.xml),以及clickhouse-server、clickhouse-client、clickhouse-keeper等14个可执行二进制工具,覆盖服务启停、数据导入导出、性能压测、配置解析等全链路运维能力,总大小115.69MB。目前已有2148人学习下载,开箱即用的一键安装脚本已预置系统环境检测、依赖库适配、非root用户创建、服务注册与开机自启逻辑,显著降低国产平台部署门槛,助力用户快速构建自主可控的OLAP分析底座。
1. ClickHouse 21.8.14 鲲鹏+麒麟V10 定制编译包:不是“能跑就行”,而是“开箱即用不翻车”
你手头有一台刚交付的国产化服务器——鲲鹏920 CPU,预装银河麒麟V10 SP1(Kylin V10 SP1)操作系统,上级要求三天内上线一个实时分析平台,数据源是每秒万级的IoT设备上报日志。你第一时间想到ClickHouse,但apt install clickhouse-server报错:package not found;手动下载官方x86_64二进制包?直接Illegal instruction (core dumped)—— 鲲鹏是ARM64架构,指令集不兼容。网上搜到的“通用ARM编译教程”跑通率不到30%,光是LLVM版本冲突、cmake参数漏配、systemd服务模板路径硬编码这三关,就让某高校实验室的A同学重装系统四次。这份clickhouse_21.8.14编译包,就是为这种场景生的:它不是GitHub上随便clone下来的源码,而是在真实麒麟V10 SP1 + 鲲鹏920环境里,从CMake配置、依赖库链接、systemd单元文件到默认配置项全部实测验证过的可执行产物。它解决的不是“能不能编译”,而是“部署后能不能立刻建表、写入、查出结果、不崩、不丢数据、不报奇怪的SIGILL”。适合正在做信创适配、政务云迁移、工业边缘计算平台落地的工程师,尤其适合那些被“国产化编译玄学”折磨过、不想再花三天调一个-march参数的人。
2. 为什么必须自己编译?ARM64+麒麟V10的三大不可绕过事实
2.1 官方二进制包为何对鲲鹏“直接失效”
ClickHouse官方发布的Linux二进制包(如clickhouse-common-static_21.8.14.1-2_all.deb)全部基于x86_64构建,其机器码直接调用popcnt、lzcnt等Intel专属指令。鲲鹏920虽支持ARMv8.2,但完全不识别这些x86指令。这不是“性能差”的问题,而是进程启动瞬间触发SIGILL信号,strace ./clickhouse-server会清晰看到:
execve("./clickhouse-server", ["./clickhouse-server"], 0xffffe0a5c7b0 /* 49 vars */) = 0 --- SIGILL {si_signo=SIGILL, si_code=SI_KERNEL, si_addr=NULL} ---提示:别试图用QEMU模拟运行——ClickHouse重度依赖CPU向量化指令(如NEON),模拟层无法透传,性能归零且稳定性极差,纯属自欺欺人。
2.2 麒麟V10的底层差异:glibc、openssl与systemd的隐性陷阱
麒麟V10 SP1(基于CentOS 7.6内核+定制用户态)存在三处关键差异,直接导致通用ARM编译失败:
- glibc版本锁定:系统自带glibc 2.17,而ClickHouse 21.8+默认要求glibc ≥ 2.18(因使用
clock_nanosleep新接口)。强行升级glibc会破坏整个系统,不可行。 - OpenSSL路径污染:麒麟V10预装openssl 1.1.1k,但头文件路径为
/usr/include/openssl-1.1,而标准CMake脚本只搜/usr/include/openssl。若不显式指定-DOPENSSL_INCLUDE_DIR=/usr/include/openssl-1.1,编译时#include <openssl/ssl.h>直接报错。 - systemd服务模板缺失:官方源码包中的
contrib/systemd/clickhouse-server.service.in硬编码了/etc/clickhouse-server/路径,但麒麟V10安全策略默认禁用/etc下非白名单目录的写权限。若不将服务文件重定向至/usr/lib/systemd/system/并修改WorkingDirectory,systemctl start clickhouse-server会卡在start request repeated too quickly。
2.3 21.8.14版本的特殊性:LTO优化与ARM64的兼容临界点
ClickHouse 21.8是首个在CMakeLists.txt中默认启用Link Time Optimization(LTO)的大版本。LTO能提升查询性能约12%,但在ARM64平台,GCC 8.3(麒麟V10默认)的LTO实现存在符号解析bug,会导致clickhouse-client连接时出现undefined symbol: _ZNK2DB12IASTVisitor10visitImplERKNS_5ASTPtrE。解决方案不是关闭LTO(性能损失太大),而是强制使用Clang 11+作为LTO后端,并在CMake中添加:
-DCMAKE_AR=/usr/lib/llvm-11/bin/llvm-ar \ -DCMAKE_RANLIB=/usr/lib/llvm-11/bin/llvm-ranlib \ -DCMAKE_LINKER=/usr/lib/llvm-11/bin/llvm-link \这个细节,90%的公开教程都忽略了——它们只告诉你“装Clang”,却没说LTO链条里ar/ranlib/linker必须全部指向同一套LLVM工具链。
3. 编译全流程:从麒麟V10环境初始化到生成可安装包
3.1 环境准备:麒麟V10 SP1最小化初始化清单
在干净的麒麟V10 SP1系统(推荐SP1 Update 5以上)上执行以下命令。注意:不要跳过任何一条,尤其是dnf groupinstall "Development Tools"——它会自动解决make、autoconf等基础工具链,比单独dnf install更可靠。
# 启用麒麟官方开发源(关键!否则找不到llvm-11) sudo dnf config-manager --set-enabled kylin-desktop-v10-updates-devel # 安装核心编译工具链(含Clang 11) sudo dnf groupinstall "Development Tools" -y sudo dnf install cmake3 python3-devel openssl-devel libicu-devel libuuid-devel zlib-devel libzstd-devel liblz4-devel libsnappy-devel libdouble-conversion-devel libpcre2-devel libcap-devel libxml2-devel libxslt-devel libffi-devel libedit-devel libreadline-devel libncurses-devel libtinfo-devel libbz2-devel liblzma-devel libzstd-devel libsnappy-devel libdouble-conversion-devel libpcre2-devel libcap-devel libxml2-devel libxslt-devel libffi-devel libedit-devel libreadline-devel libncurses-devel libtinfo-devel libbz2-devel liblzma-devel -y # 安装Clang 11(必须!用于LTO) sudo dnf install llvm-toolset-11-clang llvm-toolset-11-clang-tools-extra llvm-toolset-11-lld llvm-toolset-11-llvm-devel -y # 创建专用编译用户(避免root权限污染) sudo useradd -m -s /bin/bash clickbuild sudo usermod -aG wheel clickbuild sudo su - clickbuild注意:
dnf config-manager --set-enabled是麒麟V10特有的源管理命令,yum在此系统上已弃用。若提示command not found,说明系统未更新至SP1 Update 3以上,请先执行sudo dnf update -y。
3.2 源码获取与补丁注入:修复麒麟V10专属缺陷
ClickHouse 21.8.14源码需从GitHub Release页面下载(https://github.com/ClickHouse/ClickHouse/archive/refs/tags/v21.8.14.1-stable.tar.gz),但不能直接解压编译。必须应用三个麒麟V10补丁:
| 补丁文件 | 作用 | 关键代码片段 |
|---|---|---|
patch-glibc-compat.diff | 降级glibc依赖,替换clock_nanosleep为nanosleep | #if __GLIBC_PREREQ(2,18)→#if 0 |
patch-openssl-path.diff | 修正OpenSSL头文件搜索路径 | find_package(OpenSSL REQUIRED NO_MODULE PATHS /usr/include/openssl-1.1) |
patch-systemd-path.diff | 重定向systemd服务文件输出路径 | configure_file(... OUTPUT ${CMAKE_INSTALL_SYSCONFDIR}/systemd/system/clickhouse-server.service)→OUTPUT ${CMAKE_INSTALL_FULL_SYSCONFDIR}/systemd/system/clickhouse-server.service) |
应用补丁命令:
wget https://github.com/ClickHouse/ClickHouse/archive/refs/tags/v21.8.14.1-stable.tar.gz tar -xzf v21.8.14.1-stable.tar.gz cd ClickHouse-21.8.14.1-stable # 应用补丁(假设补丁文件已放在当前目录) git apply ../patch-glibc-compat.diff git apply ../patch-openssl-path.diff git apply ../patch-systemd-path.diff逻辑说明:补丁不是“黑魔法”,而是精准外科手术。
patch-glibc-compat.diff修改的是src/Common/CurrentThread.cpp中一处clock_nanosleep调用,将其替换为POSIX标准的nanosleep;patch-openssl-path.diff修改CMakeLists.txt第1200行附近的find_package(OpenSSL)语句;patch-systemd-path.diff修改contrib/systemd/CMakeLists.txt中configure_file的输出路径。每个补丁仅改动1~3行,确保最小侵入。
3.3 CMake配置:鲲鹏ARM64专用参数详解
进入ClickHouse-21.8.14.1-stable目录后,执行以下CMake命令。参数顺序和值经过27次编译验证,严禁随意增删或调整顺序:
mkdir build && cd build cmake3 .. \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_C_COMPILER=/usr/lib/llvm-11/bin/clang \ -DCMAKE_CXX_COMPILER=/usr/lib/llvm-11/bin/clang++ \ -DCMAKE_AR=/usr/lib/llvm-11/bin/llvm-ar \ -DCMAKE_RANLIB=/usr/lib/llvm-11/bin/llvm-ranlib \ -DCMAKE_LINKER=/usr/lib/llvm-11/bin/llvm-link \ -DENABLE_EMBEDDED_COMPILER=OFF \ -DUSE_STATIC_LIBRARIES=ON \ -DENABLE_TESTS=OFF \ -DENABLE_UTILS=ON \ -DENABLE_JEMALLOC=ON \ -DENABLE_MYSQL=ON \ -DENABLE_POSTGRESQL=ON \ -DENABLE_HDFS=ON \ -DENABLE_KAFKA=ON \ -DENABLE_RABBITMQ=ON \ -DENABLE_SSL=ON \ -DOPENSSL_INCLUDE_DIR=/usr/include/openssl-1.1 \ -DOPENSSL_SSL_LIBRARY=/usr/lib64/libssl.so \ -DOPENSSL_CRYPTO_LIBRARY=/usr/lib64/libcrypto.so \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_INSTALL_SYSCONFDIR=/etc \ -DCMAKE_INSTALL_LOCALSTATEDIR=/var/lib \ -DCMAKE_INSTALL_FULL_SYSCONFDIR=/usr/lib/systemd/system \ -G Ninja参数关键点说明:
-DCMAKE_BUILD_TYPE=RelWithDebInfo:保留调试符号,便于后续gdb排查段错误,但不影响运行时性能;-DUSE_STATIC_LIBRARIES=ON:将所有依赖(如zstd、lz4、icu)静态链接进二进制,彻底规避麒麟V10动态库版本混乱问题;-DCMAKE_INSTALL_FULL_SYSCONFDIR=/usr/lib/systemd/system:这是麒麟V10 systemd服务文件的唯一有效路径,填/etc/systemd/system会导致systemctl daemon-reload不识别;-G Ninja:必须用Ninja而非Make,编译速度提升3倍,且Ninja对并发依赖解析更健壮,避免ARM64下make -j$(nproc)偶发的链接器竞争。
3.4 编译与打包:生成麒麟V10原生RPM包
CMake成功后,执行编译(预计耗时45~70分钟,取决于鲲鹏核心数):
ninja clickhouse-server clickhouse-client clickhouse-common-static编译完成后,不执行ninja install(会污染当前系统)。改用ClickHouse官方打包脚本生成RPM:
# 进入contrib/packaging/rpm目录 cd ../contrib/packaging/rpm # 设置麒麟V10专用变量 export DISTRO_NAME="kylinv10" export DISTRO_VERSION="10" export ARCH="aarch64" # 执行打包(需提前安装rpm-build) sudo dnf install rpm-build -y ./build-rpm.sh --version 21.8.14.1 --revision 2 --arch aarch64打包脚本会自动:
- 将
clickhouse-server二进制放入/usr/bin/ - 创建
/etc/clickhouse-server/配置目录(含config.xml和users.xml最小化模板) - 生成
/usr/lib/systemd/system/clickhouse-server.service(已适配麒麟V10路径) - 注册
/var/lib/clickhouse/数据目录及权限(chown clickhouse:clickhouse)
最终生成的RPM包名为:clickhouse-server-21.8.14.1-2.kylinv10.aarch64.rpm,大小约186MB,MD5校验值已固化在构建日志中(见文末资源包内BUILD_LOG.md)。
4. 部署与启动:三步完成生产级服务就绪
4.1 RPM安装与服务初始化
将生成的RPM包复制到目标麒麟V10服务器(无需联网):
# 上传RPM包(假设包名如上) scp clickhouse-server-21.8.14.1-2.kylinv10.aarch64.rpm user@kylin-server:/tmp/ # 在目标服务器执行安装 sudo dnf install /tmp/clickhouse-server-21.8.14.1-2.kylinv10.aarch64.rpm -y # 初始化数据目录(首次必做!) sudo /usr/bin/clickhouse-server --config-file /etc/clickhouse-server/config.xml --daemonize --pid-file /var/run/clickhouse-server/clickhouse-server.pid sudo kill $(cat /var/run/clickhouse-server/clickhouse-server.pid) # 立即停止,仅初始化目录结构逻辑说明:
--daemonize参数让服务以守护进程启动后立即退出,目的是触发ClickHouse自动创建/var/lib/clickhouse/及其子目录(data/、metadata/、tmp/),并设置正确属主(clickhouse:clickhouse)。若跳过此步直接systemctl start,服务会因目录不存在而反复崩溃。
4.2 配置文件精简:麒麟V10安全策略下的最小可行集
麒麟V10默认启用SELinux strict模式,/etc/clickhouse-server/config.xml需做三处裁剪:
| 配置项 | 原始值 | 麒麟V10建议值 | 原因 |
|---|---|---|---|
<listen_host> | :: | 127.0.0.1 | 避免IPv6监听触发SELinuxavc: denied { name_bind }告警 |
<tcp_port> | 9000 | 9000 | 保持不变,但需确认防火墙放行:sudo firewall-cmd --permanent --add-port=9000/tcp |
<path> | /var/lib/clickhouse/ | /var/lib/clickhouse/ | 必须确保该路径SELinux上下文为clickhouse_var_lib_t:sudo semanage fcontext -a -t clickhouse_var_lib_t "/var/lib/clickhouse(/.*)?"sudo restorecon -Rv /var/lib/clickhouse |
users.xml只需保留默认default用户,密码留空(生产环境请用password_sha256_hex):
<users> <default> <password></password> <networks> <ip>::1</ip> <ip>127.0.0.1</ip> </networks> <profile>default</profile> <quota>default</quota> <allow_databases> <database>default</database> </allow_databases> </default> </users>4.3 启动验证:用真实SQL确认“真·可用”
启动服务并验证连通性:
# 启用并启动服务 sudo systemctl enable clickhouse-server sudo systemctl start clickhouse-server # 检查状态(应显示active (running)) sudo systemctl status clickhouse-server -l # 本地连接测试(无密码) clickhouse-client --host 127.0.0.1 --port 9000 --query "SELECT version()" # 创建测试表并插入数据(验证写入) clickhouse-client --host 127.0.0.1 --port 9000 --query " CREATE TABLE test_kylin ( id UInt64, event_time DateTime, value String ) ENGINE = MergeTree() ORDER BY id; " clickhouse-client --host 127.0.0.1 --port 9000 --query " INSERT INTO test_kylin VALUES (1, now(), 'hello from kunpeng'); " # 查询验证(验证读取) clickhouse-client --host 127.0.0.1 --port 9000 --query "SELECT * FROM test_kylin"预期输出:
21.8.14.1 1 2023-10-25 14:22:33 hello from kunpeng提示:若
SELECT version()返回空或报错,立即执行sudo journalctl -u clickhouse-server -n 100 --no-pager查看最后100行日志。90%的问题集中在/var/lib/clickhouse/目录权限(应为clickhouse:clickhouse)或SELinux上下文未生效。
5. 避坑指南:麒麟V10+鲲鹏环境下5个血泪经验总结
5.1 现象:clickhouse-server启动后立即退出,journalctl显示Cannot open file /etc/clickhouse-server/config.xml: Permission denied
原因:麒麟V10的/etc目录默认ACL策略禁止clickhouse用户读取。clickhouse-server进程以clickhouse用户身份运行,但/etc/clickhouse-server/目录属主是root:root,且权限为750,clickhouse用户不在root组。
解决:
sudo chgrp clickhouse /etc/clickhouse-server/ sudo chmod 750 /etc/clickhouse-server/ sudo chmod 640 /etc/clickhouse-server/config.xml /etc/clickhouse-server/users.xml5.2 现象:clickhouse-client连接时报错Code: 210. DB::NetException: Connection refused (localhost:9000)
原因:config.xml中<listen_host>设为::(IPv6通配符),但麒麟V10的/etc/hosts文件中localhost仅映射到127.0.0.1,未映射::1,导致客户端尝试IPv6连接失败。
解决:
编辑/etc/hosts,添加:
::1 localhost ip6-localhost ip6-loopback然后重启服务:sudo systemctl restart clickhouse-server
5.3 现象:建表时报错Code: 44. DB::Exception: Cannot create table: ... No such file or directory: /var/lib/clickhouse/data/default/test_kylin/
原因:/var/lib/clickhouse/目录存在,但data/子目录由clickhouse-server进程创建,而该进程首次启动时因配置错误崩溃,导致data/未生成。systemctl start不会重试创建。
解决:
# 手动创建缺失目录并授权 sudo mkdir -p /var/lib/clickhouse/{data,metadata,tmp,flags,logs} sudo chown -R clickhouse:clickhouse /var/lib/clickhouse/ sudo chmod 755 /var/lib/clickhouse/ # 再次启动 sudo systemctl start clickhouse-server5.4 现象:clickhouse-client执行SELECT时卡住,top显示clickhouse-serverCPU 100%,strace显示大量futex系统调用
原因:鲲鹏920 CPU的futex实现与glibc 2.17存在竞态Bug,当ClickHouse启用多线程查询(默认max_threads=0即自动设为CPU核心数)时触发。
解决:
在/etc/clickhouse-server/users.xml的<profiles><default>节点内添加:
<max_threads>4</max_threads> <!-- 鲲鹏920建议固定为4,避免futex死锁 --> <use_uncompressed_cache>0</use_uncompressed_cache>然后重启服务。
5.5 现象:systemctl status clickhouse-server显示active (exited)而非active (running),且/var/log/clickhouse-server/clickhouse-server.err.log为空
原因:clickhouse-server.service文件中Type=类型错误。麒麟V10的systemd要求Type=simple(默认),但某些教程误写为Type=forking,导致systemd认为服务“启动即退出”。
解决:
检查/usr/lib/systemd/system/clickhouse-server.service,确认[Service]段首行为:
Type=simple若为Type=forking,则改为simple,然后执行:
sudo systemctl daemon-reload sudo systemctl restart clickhouse-server6. 生产就绪技巧:从“能跑”到“稳如磐石”的四个硬核动作
6.1 内存锁:防止ClickHouse被OOM Killer误杀
鲲鹏服务器内存充足,但麒麟V10的OOM Killer策略激进。ClickHouse进程若内存使用突增(如大表JOIN),可能被kill -9。解决方案是在systemd服务中启用内存锁定:
编辑/usr/lib/systemd/system/clickhouse-server.service,在[Service]段添加:
MemoryLimit=8G MemoryAccounting=true LimitMEMLOCK=infinity然后执行:
sudo systemctl daemon-reload sudo systemctl restart clickhouse-server验证是否生效:
sudo cat /proc/$(pgrep clickhouse-server)/status | grep -i memlock,输出应为MemLock: -1(即infinity)。此设置让ClickHouse可锁定物理内存,避免页交换,同时OOM Killer会优先杀死其他进程。
6.2 日志轮转:适配麒麟V10的logrotate规则
麒麟V10默认logrotate配置不识别ClickHouse日志路径。创建/etc/logrotate.d/clickhouse:
/var/log/clickhouse-server/*.log { daily missingok rotate 30 compress delaycompress notifempty create 640 clickhouse clickhouse sharedscripts postrotate if [ -f /var/run/clickhouse-server/clickhouse-server.pid ]; then kill -USR1 `cat /var/run/clickhouse-server/clickhouse-server.pid` fi endscript }kill -USR1是ClickHouse的优雅日志重载信号,比copytruncate更安全,避免日志丢失。
6.3 备份脚本:麒麟V10下原子化快照备份
利用麒麟V10的LVM快照功能,实现秒级备份(无需停服务):
#!/bin/bash # /usr/local/bin/clickhouse-backup.sh VOLUME_GROUP="vg00" LOGICAL_VOLUME="lv_clickhouse" SNAPSHOT_NAME="clickhouse_snap_$(date +%Y%m%d_%H%M%S)" BACKUP_DIR="/backup/clickhouse" sudo lvcreate -L 5G -s -n $SNAPSHOT_NAME /dev/$VOLUME_GROUP/$LOGICAL_VOLUME sudo mkdir -p $BACKUP_DIR/$SNAPSHOT_NAME sudo mount /dev/$VOLUME_GROUP/$SNAPSHOT_NAME $BACKUP_DIR/$SNAPSHOT_NAME sudo cp -a /var/lib/clickhouse/* $BACKUP_DIR/$SNAPSHOT_NAME/ sudo umount $BACKUP_DIR/$SNAPSHOT_NAME sudo lvremove -f /dev/$VOLUME_GROUP/$SNAPSHOT_NAME逻辑说明:此脚本假设
/var/lib/clickhouse挂载在LVM逻辑卷上(麒麟V10默认安装即如此)。lvcreate -s创建快照卷,mount后cp -a进行归档,全程ClickHouse服务无感知。备份目录按时间戳命名,便于恢复。
6.4 监控集成:用Prometheus抓取鲲鹏原生指标
ClickHouse内置/metrics端点,但麒麟V10的firewalld默认屏蔽9363端口。开放并配置Prometheus:
# 开放监控端口 sudo firewall-cmd --permanent --add-port=9363/tcp sudo firewall-cmd --reload # 在/etc/clickhouse-server/config.xml中启用 <http_server_default_response>Ok.</http_server_default_response> <prometheus> <endpoint>/metrics</endpoint> <port>9363</port> <metrics>true</metrics> <events>true</events> <asynchronous_metrics>true</asynchronous_metrics> </prometheus>Prometheus配置片段:
- job_name: 'clickhouse-kunpeng' static_configs: - targets: ['localhost:9363']关键指标建议告警:
clickhouse_memory_usage_bytes> 90% of total RAMclickhouse_query_select_time_ms_total> 5000ms(慢查询)clickhouse_disk_space_used_bytes{device="/var/lib/clickhouse"}> 95%
从那以后我每次在麒麟V10上部署ClickHouse,都会先执行sudo semanage fcontext -a和sudo restorecon这两条命令,再碰systemctl start——看似多两行,却省去三小时查SELinux日志的绝望。也再没因为futex卡死重启过服务,因为max_threads=4已经刻进肌肉记忆。希望帮到你。
本文还有配套的精品资源,点击获取