资讯详情

ClickHouse 21.8.14 鲲鹏ARM64+麒麟V10 定制编译实战

📅 2026/10/20 12:31:49 | 华诺云谱 👁 阅读
ClickHouse 21.8.14 鲲鹏ARM64+麒麟V10 定制编译实战
简介本资源是专为国产化信创环境定制的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 SP1Kylin 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_signoSIGILL, si_codeSI_KERNEL, si_addrNULL} ---提示别试图用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/并修改WorkingDirectorysystemctl start clickhouse-server会卡在start request repeated too quickly。2.3 21.8.14版本的特殊性LTO优化与ARM64的兼容临界点ClickHouse 21.8是首个在CMakeLists.txt中默认启用Link Time OptimizationLTO的大版本。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 0patch-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标准的nanosleeppatch-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_TYPERelWithDebInfo \ -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_COMPILEROFF \ -DUSE_STATIC_LIBRARIESON \ -DENABLE_TESTSOFF \ -DENABLE_UTILSON \ -DENABLE_JEMALLOCON \ -DENABLE_MYSQLON \ -DENABLE_POSTGRESQLON \ -DENABLE_HDFSON \ -DENABLE_KAFKAON \ -DENABLE_RABBITMQON \ -DENABLE_SSLON \ -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_TYPERelWithDebInfo保留调试符号便于后续gdb排查段错误但不影响运行时性能-DUSE_STATIC_LIBRARIESON将所有依赖如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_NAMEkylinv10 export DISTRO_VERSION10 export ARCHaarch64 # 执行打包需提前安装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大小约186MBMD5校验值已固化在构建日志中见文末资源包内BUILD_LOG.md。4. 部署与启动三步完成生产级服务就绪4.1 RPM安装与服务初始化将生成的RPM包复制到目标麒麟V10服务器无需联网# 上传RPM包假设包名如上 scp clickhouse-server-21.8.14.1-2.kylinv10.aarch64.rpm userkylin-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_port90009000保持不变但需确认防火墙放行sudo firewall-cmd --permanent --add-port9000/tcppath/var/lib/clickhouse//var/lib/clickhouse/必须确保该路径SELinux上下文为clickhouse_var_lib_tsudo semanage fcontext -a -t clickhouse_var_lib_t /var/lib/clickhouse(/.*)?sudo restorecon -Rv /var/lib/clickhouseusers.xml只需保留默认default用户密码留空生产环境请用password_sha256_hexusers default password/password networks ip::1/ip ip127.0.0.1/ip /networks profiledefault/profile quotadefault/quota allow_databases databasedefault/database /allow_databases /default /users4.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且权限为750clickhouse用户不在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-server5.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_threads0即自动设为CPU核心数时触发。解决在/etc/clickhouse-server/users.xml的profilesdefault节点内添加max_threads4/max_threads !-- 鲲鹏920建议固定为4避免futex死锁 -- use_uncompressed_cache0/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要求Typesimple默认但某些教程误写为Typeforking导致systemd认为服务“启动即退出”。解决检查/usr/lib/systemd/system/clickhouse-server.service确认[Service]段首行为Typesimple若为Typeforking则改为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]段添加MemoryLimit8G MemoryAccountingtrue LimitMEMLOCKinfinity然后执行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_GROUPvg00 LOGICAL_VOLUMElv_clickhouse SNAPSHOT_NAMEclickhouse_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-port9363/tcp sudo firewall-cmd --reload # 在/etc/clickhouse-server/config.xml中启用 http_server_default_responseOk./http_server_default_response prometheus endpoint/metrics/endpoint port9363/port metricstrue/metrics eventstrue/events asynchronous_metricstrue/asynchronous_metrics /prometheusPrometheus配置片段- 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_threads4已经刻进肌肉记忆。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑