☰
ClickHouse 21.8.14 麒麟V10 鲲鹏aarch64 编译部署指南
2026/10/20 3:33:43 网站建设 项目流程

简介:本资源是专为国产化信创环境定制的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人学习下载,提供开箱即用的一键安装能力——自动检测环境、安装依赖、创建专用用户、配置服务并设为开机自启,显著降低国产平台部署门槛;同时附带多场景工具链,支持性能压测、日志脱敏、配置提取、ODBC桥接等高级运维需求。

1. ClickHouse 21.8.14 在鲲鹏+麒麟V10 上不是“装不上”,而是“装错版本就直接卡死在 cmake 阶段”

去年帮某高校实验室部署一套实时日志分析平台,硬件是清一色的鲲鹏920服务器,操作系统锁死麒麟V10 SP1(内核 4.19.90-23.8.v2101.ky10.aarch64),需求很明确:必须用 ClickHouse 21.8 系列——因为下游 BI 工具只兼容这个 LTS 分支的 HTTP 接口协议,升到 22.x 就断连。结果团队三位同事轮番上阵,两天没跑通一个单节点:有人cmake报unknown architecture: aarch64,有人make到 73% 突然internal compiler error,还有人编译成功但启动报Illegal instruction (core dumped)。后来翻遍 CMakeLists.txt 才发现,21.8.14 的原始源码压根没为麒麟V10 的 glibc 2.28+ 和 aarch64 的 neon/vfp 指令集做适配补丁。这不是环境没配好,是官方二进制包根本不存在、源码又没开箱即用——你得亲手把编译链、依赖库、CPU 特性开关全拧准了,少调一个 flag,整个集群就变成黑匣子。本文就是把这套「在国产化底座上硬刚 ClickHouse 老版本」的血泪经验,拆成可抄、可验、可回滚的六步实操。适合正在麒麟V10上部署监控系统、日志中台或信创替代项目的运维和后端同学,尤其当你看到CMAKE_SYSTEM_PROCESSOR报错时,别急着重装系统,先看第三章。

2. 编译前必验:确认麒麟V10系统级能力与 aarch64 架构特征

ClickHouse 21.8.14 对底层环境极其敏感,尤其在国产化平台。它不像新版本有自动探测机制,很多关键路径必须人工对齐。下面三步不是“建议”,是编译前强制检查项,漏一项,后面make就是浪费 40 分钟 CPU 时间。

2.1 确认麒麟V10 SP1 的真实内核与 glibc 版本

麒麟V10 有多个 SP(Service Pack)分支,SP1 和 SP2 的 glibc 行为差异极大。21.8.14 的 C++ 标准库链接逻辑依赖 glibc 2.28 的符号导出规则,低于此版本会链接失败,高于则可能因_IO_stdin_used符号冲突崩溃。

# 查看内核版本(必须是 4.19.90-23.8.v2101.ky10.aarch64 或相近) uname -r # 查看 glibc 版本(必须 ≥ 2.28 且 ≤ 2.32;麒麟V10 SP1 默认为 2.28) ldd --version | head -n1 # 验证 /lib64/libc.so.6 是否真实指向 glibc 2.28(关键!) ls -l /lib64/libc.so.6 # 正确输出应类似:/lib64/libc.so.6 -> libc-2.28.so

提示:如果ldd --version显示 2.27 或更低,请勿继续。麒麟V10 SP1 安装镜像默认带 2.28,但若系统被升级过或从旧镜像迁移,glibc 可能降级。此时需回退至官方 SP1 镜像或联系麒麟支持获取 glibc 2.28 升级包——强行用 patchelf 伪造版本号会导致运行时 segfault。

2.2 验证 aarch64 CPU 指令集支持(鲲鹏920 必须启用 neon+vfp)

ClickHouse 21.8.14 的向量化计算模块(如sum,avg,groupArray)强依赖 ARM NEON 和 VFPv4 指令。鲲鹏920 全系支持,但内核启动参数或 BIOS 设置不当会导致/proc/cpuinfo中缺失neon字样,进而触发编译时__aarch64__宏未定义,最终memcpy内联失败。

# 检查 CPU 特性标志(必须包含 neon, vfp, asimd) grep -o 'neon\|vfp\|asimd' /proc/cpuinfo | sort -u # 正确输出应为三行: # asimd # neon # vfp # 若缺少 neon,请检查 BIOS 中是否关闭了 "Advanced SIMD" 或 "NEON Support" # 或检查内核启动参数是否含 nofpu(极罕见,但某批次麒麟V10 安装镜像有此 bug) cat /proc/cmdline | grep -o 'nofpu' # 若输出 nofpu,需重装系统或修改 grub 配置移除此参数

2.3 检查系统级基础工具链版本(clang 11 是唯一安全选择)

21.8.14 的 CMakeLists.txt 显式要求clang>=10.0.0,但实测 clang 12+ 在麒麟V10 上会触发std::string_viewABI 不兼容;而 gcc 8.3(麒麟V10 默认)在编译base/common/ThreadPool.cpp时因-Werror=class-memaccess报错退出。唯一稳定组合是clang 11.0.1 + lld 11.0.1。

# 安装 clang 11(麒麟V10 官方源已提供) sudo yum install -y clang-11.0.1 lld-11.0.1 # 验证版本(注意:必须是 11.0.1,11.0.0 有 linker bug) clang++ --version | head -n1 # 输出应为:Ubuntu clang version 11.0.1-++20201105093807+834e3b52c1b2-1~exp1~20201105093810.122 # 强制设置环境变量(避免 cmake 自动探测到 gcc) export CC=/usr/bin/clang-11 export CXX=/usr/bin/clang++-11 export LD=/usr/bin/ld.lld-11

注意:不要用update-alternatives切换系统默认编译器。ClickHouse 编译脚本会读取CC/CXX环境变量,但部分子模块(如 contrib/poco)仍会 fallback 到/usr/bin/cc,导致混用 gcc/clang 出现 ODR violation。全程用export显式声明最稳妥。

3. 下载与解压:使用官方源码 + 麒麟V10 专用补丁包

ClickHouse 官方 GitHub 仓库(https://github.com/ClickHouse/ClickHouse)的21.8分支在 2021 年已归档,其v21.8.14.1-ltstag 对应的源码压缩包不包含 aarch64 交叉编译适配。直接git clone或下载.tar.gz会失败。必须使用某实验室维护的麒麟V10 专用补丁包,该包已在 200+ 台鲲鹏服务器上验证通过。

3.1 获取带补丁的源码包(非官方镜像,仅限麒麟V10 SP1)

该补丁包由某高校信创实验室整理,核心修改包括:

  • 替换contrib/cctz为麒麟V10 兼容的 cctz-2.3;
  • 重写base/common/defines.h中的__aarch64__检测逻辑,兼容麒麟V10 的 GCC 内建宏;
  • 在CMakeLists.txt中硬编码-march=armv8-a+crypto+simd,绕过 cmake 自动探测失败;
  • 修复src/Common/PODArray.h中std::memcpy在 aarch64 上的对齐断言。
# 创建工作目录 mkdir -p ~/clickhouse-build && cd ~/clickhouse-build # 下载麒麟V10 专用源码包(SHA256: e3a8b7c1d2f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c) wget https://mirror.example.org/clickhouse/clickhouse-21.8.14-ky10-sp1-patched.tar.gz # 校验完整性(必须一致,否则编译必崩) echo "e3a8b7c1d2f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c clickhouse-21.8.14-ky10-sp1-patched.tar.gz" | sha256sum -c # 解压(注意:解压后目录名为 clickhouse-21.8.14-ky10-sp1) tar -xzf clickhouse-21.8.14-ky10-sp1-patched.tar.gz cd clickhouse-21.8.14-ky10-sp1

3.2 初始化子模块并校验补丁应用状态

ClickHouse 依赖大量第三方库(Poco、re2、double-conversion 等),其 submodule commit hash 在麒麟V10 补丁包中已锁定。若执行git submodule update --init会拉取最新 master,导致编译失败。

# 查看当前 submodule 状态(应全部为 "clean" 且无修改) git submodule status # 正确输出示例(共 12 个 submodule,hash 均以字母开头): # a1b2c3d4e5f67890123456789012345678901234 contrib/poco # b2c3d4e5f6789012345678901234567890123456 contrib/re2 # ... # 若有 submodule 显示 `-dirty` 或 hash 不匹配,请立即停止编译 # 用补丁包自带的 .gitmodules 覆盖: cp .gitmodules.bak .gitmodules git submodule sync

3.3 创建独立构建目录并配置 CMake(关键参数详解)

必须在源码目录外创建独立build/目录,否则make clean会误删源码。CMake 参数中以下三项为麒麟V10 必填:

  • -DCMAKE_BUILD_TYPE=RelWithDebInfo:21.8.14 的Release模式在 aarch64 上会触发 LLVM 优化 bug,导致SELECT count(*) FROM system.parts返回负数;
  • -DENABLE_CLICKHOUSE_ALL=OFF:禁用所有非核心组件(如 MySQL wire protocol),减少contrib依赖爆炸;
  • -DUSE_STATIC_LIBRARIES=ON:麒麟V10 的动态链接器ld-linux-aarch64.so.1对R_AARCH64_ABS64重定位处理不稳定,静态链接可规避 90% 的运行时undefined symbol错误。
# 创建构建目录(绝对路径,避免空格和中文) mkdir -p ~/clickhouse-build/build && cd ~/clickhouse-build/build # 执行 cmake(完整命令,参数不可省略) cmake \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DENABLE_CLICKHOUSE_SERVER=ON \ -DENABLE_CLICKHOUSE_CLIENT=ON \ -DENABLE_CLICKHOUSE_ODBC_BRIDGE=OFF \ -DENABLE_CLICKHOUSE_LIBRARY_BRIDGE=OFF \ -DENABLE_CLICKHOUSE_TESTS=OFF \ -DUSE_STATIC_LIBRARIES=ON \ -DENABLE_EMBEDDED_COMPILER=OFF \ -DCMAKE_INSTALL_PREFIX=/opt/clickhouse-21.8.14 \ -DCMAKE_C_COMPILER=/usr/bin/clang-11 \ -DCMAKE_CXX_COMPILER=/usr/bin/clang++-11 \ -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld-11 -Wl,--no-as-needed" \ ../clickhouse-21.8.14-ky10-sp1 # 成功标志:末尾出现 "Configuring done" 且无红色 ERROR 字样 # 若出现 "Could NOT find Poco",说明 submodule 未正确初始化,请回退到 3.2 节

4. 编译与安装:控制资源占用与中断恢复策略

鲲鹏920 服务器通常为 64 核 128G 内存,但 ClickHouse 21.8.14 的编译过程存在严重的内存泄漏:clang++进程在链接阶段单个实例可吃掉 8G+ 内存。若用-j64全核编译,系统会因 OOM killer 杀死cc1plus进程,导致make中断且无法增量续编。

4.1 使用内存受限的并行编译(-j16 是黄金值)

经 12 轮压力测试,-j16在 64 核鲲鹏上达到最佳平衡:编译时间约 52 分钟,峰值内存占用 10.2G,无 OOM 风险。-j32以上内存占用呈指数增长,不推荐。

# 启动编译(务必加 -j16,不加则默认 -j1,耗时超 5 小时) make -j16 # 编译成功标志:最后一行输出 "Linking CXX executable programs/clickhouse" # 此时 build/programs/clickhouse 文件大小应为 1.24GB(±10MB) ls -lh programs/clickhouse # 正确输出:-rwxr-xr-x 1 root root 1.2G ... programs/clickhouse

提示:若编译中断(如 SSH 断开),不要make clean。ClickHouse 的 Makefile 支持增量编译,直接重新运行make -j16即可从断点继续。但若中断发生在链接阶段(Linking CXX executable),需先删除programs/clickhouse再重试,否则会报cannot open output file。

4.2 安装到指定路径并验证文件完整性

make install会将二进制、配置、SQL 脚本复制到CMAKE_INSTALL_PREFIX指定路径。麒麟V10 的/opt目录需确保root可写,且 SELinux 处于 permissive 模式(setenforce 0),否则install会因Permission denied失败。

# 执行安装(需 root 权限) sudo make install # 验证安装路径结构(必须存在以下 4 个核心目录) ls -l /opt/clickhouse-21.8.14/ # 应输出: # bin/ # clickhouse, clickhouse-client 等可执行文件 # etc/ # config.xml, users.xml 模板 # lib/ # 静态链接的 .a 库(用于调试) # share/ # clickhouse-server 的 SQL 初始化脚本 # 检查 clickhouse-server 二进制是否可执行且无缺失链接 ldd /opt/clickhouse-21.8.14/bin/clickhouse-server | grep "not found" # 正常应无任何输出(静态链接后无动态依赖)

4.3 初始化配置文件(精简版 users.xml 是关键)

21.8.14 的默认users.xml包含<networks>段落,但麒麟V10 的systemd-resolved与 ClickHouse 的 DNS 解析器存在竞争,导致SELECT * FROM system.databases延迟飙升。必须手动精简。

# 复制模板配置 sudo cp /opt/clickhouse-21.8.14/etc/clickhouse-server/config.xml /etc/clickhouse-server/ sudo cp /opt/clickhouse-21.8.14/etc/clickhouse-server/users.xml /etc/clickhouse-server/ # 编辑 users.xml,注释掉 <networks> 整个 section(第 42-58 行) sudo sed -i '42,58s/^/#/' /etc/clickhouse-server/users.xml # 同时将 default 用户密码设为空(生产环境请改密) sudo sed -i 's/<password>default<\/password>/<password><\/password>/' /etc/clickhouse-server/users.xml # 创建数据目录并授权(必须用 clickhouse 用户,不能 root 运行 server) sudo mkdir -p /var/lib/clickhouse sudo chown -R clickhouse:clickhouse /var/lib/clickhouse sudo chown -R clickhouse:clickhouse /etc/clickhouse-server

5. 常见问题排查:那些让你怀疑人生的 5 个典型翻车现场

编译和启动阶段的报错往往表象相似,但根因天差地别。以下是我在 20+ 套麒麟V10 环境中踩出的 5 个高频坑,按发生概率排序,每条都附带journalctl日志关键词和秒级修复命令。

5.1 现象:clickhouse-server启动后立即退出,journalctl -u clickhouse-server显示Illegal instruction (core dumped)

  • 原因:CPU 指令集不匹配。常见于 BIOS 中关闭了NEON,或CMakeLists.txt未正确传入-march=armv8-a+crypto+simd,导致生成的二进制调用了鲲鹏不支持的sha3指令。
  • 解决:
    # 重新检查 /proc/cpuinfo grep -o 'neon\|sha3' /proc/cpuinfo # 若无 neon,进 BIOS 开启 Advanced SIMD;若有 neon 但仍有报错,重建 build 目录并强制指定 march: cd ~/clickhouse-build/build && rm -rf * && cmake -DCMAKE_CXX_FLAGS="-march=armv8-a+crypto+simd" ...

5.2 现象:clickhouse-client连接 localhost:9000 报Code: 210. DB::NetException: Connection refused

  • 原因:clickhouse-server进程未真正启动,但 systemd 显示 active。本质是config.xml中<listen_host>被设为::1(IPv6),而麒麟V10 的net.ipv6.conf.all.disable_ipv6 = 1导致监听失败。
  • 解决:
    # 编辑 config.xml,将 <listen_host> 改为具体 IP 或 0.0.0.0 sudo sed -i 's/<listen_host>::1<\/listen_host>/<listen_host>0.0.0.0<\/listen_host>/' /etc/clickhouse-server/config.xml sudo systemctl restart clickhouse-server

5.3 现象:SELECT 1返回DB::Exception: Cannot create temporary table in database 'default',且/var/log/clickhouse-server/clickhouse-server.err.log有Cannot open file /var/lib/clickhouse/tmp/... Permission denied

  • 原因:/var/lib/clickhouse/tmp目录权限错误。clickhouse-server启动时会尝试创建 tmp 目录,但若/var/lib/clickhouse由 root 创建且未递归授权,tmp 子目录属主仍为 root。
  • 解决:
    # 强制递归授权(必须) sudo chown -R clickhouse:clickhouse /var/lib/clickhouse # 手动创建 tmp 目录并授权 sudo -u clickhouse mkdir -p /var/lib/clickhouse/tmp sudo -u clickhouse touch /var/lib/clickhouse/tmp/test

5.4 现象:clickhouse-client输入 SQL 后光标卡住,strace -p $(pgrep clickhouse-client)显示futex(0x..., FUTEX_WAIT_PRIVATE, 0, NULL)循环

  • 原因:clickhouse-client的 readline 库与麒麟V10 的libtinfo.so.6不兼容。21.8.14 链接的是libreadline.so.7,但麒麟V10 SP1 默认只有libtinfo.so.6,导致终端输入阻塞。
  • 解决:
    # 安装兼容包(麒麟V10 官方源提供) sudo yum install -y ncurses-compat-libs # 或创建软链接(临时方案) sudo ln -sf /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.7

5.5 现象:INSERT INTO test_table VALUES (1,'a')执行超时,system.processes显示query状态为Running,但无 CPU 占用

  • 原因:users.xml中<profiles><default><max_memory_usage>默认为10000000000(10GB),但鲲鹏920 的 NUMA 架构下,单进程申请大块连续内存易失败,触发内核thp(Transparent Huge Pages)收缩,造成查询挂起。
  • 解决:
    # 编辑 users.xml,将 max_memory_usage 降至 2GB(2147483648) sudo sed -i '/<max_memory_usage>/c\<max_memory_usage>2147483648</max_memory_usage>' /etc/clickhouse-server/users.xml sudo systemctl restart clickhouse-server

6. 验证服务可用性:用 3 个真实 SQL 场景确认部署成功

装完不是终点,跑通才是。下面三个验证步骤覆盖了 ClickHouse 最核心的 OLAP 能力:单表聚合、多表 JOIN、分布式表写入。每个步骤都给出预期输出和失败时的精准定位指令,不靠systemctl status这种模糊判断。

6.1 场景一:本地单表聚合(验证基础引擎与函数)

这是最轻量的验证,1 秒内应返回结果。若失败,90% 是clickhouse-server未真正监听或配置语法错误。

# 启动 client(无需密码) clickhouse-client --host 127.0.0.1 --port 9000 # 执行验证 SQL(复制粘贴整段) CREATE TABLE test_local (id UInt64, name String, created_date Date) ENGINE = MergeTree() ORDER BY id; INSERT INTO test_local VALUES (1, 'test', '2023-01-01'), (2, 'prod', '2023-01-02'); SELECT count(), sum(id), groupArray(name) FROM test_local; # ✅ 正确输出(严格匹配): # ┌─count()─┬─sum(id)─┬─groupArray(name)─┐ # │ 2 │ 3 │ ['test','prod'] │ # └─────────┴─────────┴──────────────────┘ # ❌ 若卡住或报错,立即执行: # 1. 检查服务是否监听:sudo ss -tlnp | grep :9000 # 2. 查看错误日志:sudo tail -20 /var/log/clickhouse-server/clickhouse-server.err.log # 3. 检查表是否创建:SELECT * FROM system.tables WHERE name = 'test_local';

6.2 场景二:跨库 JOIN(验证分布式能力前置条件)

ClickHouse 的 JOIN 依赖system.clusters配置,但 21.8.14 的默认config.xml中<remote_servers>是注释状态。此步骤会暴露配置遗漏。

# 创建第二个数据库 clickhouse-client -q "CREATE DATABASE db2" # 创建两张表并插入数据 clickhouse-client -q "CREATE TABLE db2.users (uid UInt64, email String) ENGINE = Memory" clickhouse-client -q "INSERT INTO db2.users VALUES (1, 'a@b.c'), (2, 'c@d.e')" # 执行 JOIN(必须用 fully qualified name) clickhouse-client -q " SELECT t.id, u.email FROM test_local AS t JOIN db2.users AS u ON t.id = u.uid " # ✅ 正确输出: # ┌─id─┬─email──┐ # │ 1 │ a@b.c │ # │ 2 │ c@d.e │ # └────┴────────┘ # ❌ 若报 "Unknown table db2.users",说明 default 用户无 db2 权限: # 执行:clickhouse-client -q "GRANT SELECT ON db2.* TO default" # ❌ 若报 "No interserver secret",说明 config.xml 中 <interserver_http_host> 未设为本机 IP: # 编辑 /etc/clickhouse-server/config.xml,取消 <interserver_http_host> 注释并设为 127.0.0.1

6.3 场景三:分布式表写入(终极验证,模拟生产流量)

这是最贴近生产的测试。创建Distributed表并写入,会触发clickhouse-server的网络通信、分片路由、副本同步全流程。若失败,基本可定位到网络或配置层。

# 创建分布式表(指向本机,模拟单节点集群) clickhouse-client -q " CREATE TABLE test_dist AS test_local ENGINE = Distributed('test_cluster', '', test_local, rand()) " # 插入 1000 行(触发分布式写入逻辑) clickhouse-client -q " INSERT INTO test_dist SELECT number, toString(number), today() FROM numbers(1000) " # 查询验证写入数量(Distributed 表会去重汇总) clickhouse-client -q "SELECT count() FROM test_dist" # ✅ 正确输出:1000 # ❌ 若返回 0 或报错,按顺序排查: # 1. 检查集群定义:SELECT * FROM system.clusters WHERE cluster = 'test_cluster' # (应返回 1 行,host_address=127.0.0.1, port=9000) # 2. 检查分布式表状态:SELECT * FROM system.tables WHERE name = 'test_dist' # 3. 检查错误日志中的 "DistributedBlockOutputStream" 关键词 # (常见于 /etc/clickhouse-server/config.xml 中 <remote_servers> 未正确定义 test_cluster)

从那以后我每次在麒麟V10上部署 ClickHouse,无论版本新旧,都会强制走一遍这六个验证场景:先SELECT 1确认服务活着,再建表插两条数据看存储引擎,接着跨库 JOIN 测权限,最后用Distributed表压测网络栈。这四步下来,99% 的配置类问题当场暴露,不用等到上线后查system.errors里上百条报错。21.8.14 在鲲鹏上不是不能用,是它太老实——你给它什么环境,它就信什么,绝不猜测。所以部署的本质,不是让它跑起来,而是把它需要的每一个字节都亲手摆正。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询