在华为云鲲鹏服务器上,我花3小时编译ClickHouse踩过的那些坑(附完整包)
2026/5/11 12:30:24 网站建设 项目流程

在华为云鲲鹏服务器上,我花3小时编译ClickHouse踩过的那些坑(附完整包)

第一次在ARM架构的华为云鲲鹏服务器上编译ClickHouse时,本以为和x86环境差别不大,结果从GCC版本冲突到依赖下载失败,各种问题接踵而至。作为一款高性能列式数据库,ClickHouse在ARM平台的官方文档并不完善,这让编译过程成了一场与系统环境的博弈。本文将分享我在华为云KC1实例上编译v20.3.19.4-lts版本时遇到的五个典型问题及其解决方案,最终附上可直接部署的二进制包。

1. 环境准备:ARM架构的特殊考量

华为云鲲鹏服务器采用基于ARMv8的鲲鹏920处理器,与x86环境存在显著差异。我的测试环境配置如下:

组件规格要求实际使用
CPU鲲鹏920 (4核以上)华为云KC1 4vCPUs
内存≥8GB16GB
磁盘≥100GB (推荐SSD)高性能云硬盘 200GB
操作系统CentOS 7.6 aarch64CentOS 7.6 64bit

关键依赖版本选择

  • GCC需要9.3.0以上(CentOS 7默认4.8.5)
  • CMake需≥3.18.4
  • Git建议≥2.28.0

注意:ARM架构下必须禁用-march=native编译参数,改为显式指定-march=armv8-a

2. GCC升级的血泪教训

系统自带的GCC 4.8.5无法满足编译要求,升级过程遇到两个典型问题:

2.1 动态库版本冲突

编译完成后出现libstdc++.so.6: version 'GLIBCXX_3.4.20' not found错误,解决方案:

# 复制新编译的库文件 cp /usr/local/gcc-9.3.0/lib64/libstdc++.so.6.0.28 /usr/lib64 cd /usr/lib64 ln -sf libstdc++.so.6.0.28 libstdc++.so.6 ldconfig

验证是否包含所需符号:

strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.20

2.2 环境变量配置陷阱

许多教程建议只修改PATH变量,实际上需要完整配置:

export CC=/usr/local/gcc-9.3.0/bin/gcc export CXX=/usr/local/gcc-9.3.0/bin/g++ export LD_LIBRARY_PATH=/usr/local/gcc-9.3.0/lib64:$LD_LIBRARY_PATH

3. 依赖管理的三大难关

3.1 Git子模块下载失败

ClickHouse依赖70+个子模块,部分托管在Google Git。我的解决方案:

  1. 使用国内镜像源替换.gitmodules中的URL
  2. 对无法替换的仓库,通过wget手动下载压缩包
  3. 关键子模块备用下载链接:
    • contrib/cctz→ https://gitee.com/mirrors/cctz
    • contrib/protobuf→ https://gitee.com/mirrors/protobuf

3.2 zlib-ng的ARM适配

必须修改编译参数避免非法指令错误:

# 修改contrib/zlib-ng/CMakeLists.txt - set(ARCH_FLAGS "-march=native") + set(ARCH_FLAGS "-march=armv8-a")

3.3 内存不足导致编译中断

建议操作:

  • 添加8GB swap空间:
    dd if=/dev/zero of=/swapfile bs=1G count=8 chmod 600 /swapfile mkswap /swapfile swapon /swapfile
  • 使用make -j $(nproc)控制并发数

4. 编译参数优化实践

经过多次测试,最优编译配置如下:

cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DENABLE_TCMALLOC=OFF \ -DENABLE_JEMALLOC=OFF \ -DCMAKE_CXX_FLAGS="-march=armv8-a -mtune=generic" \ -DCMAKE_INSTALL_PREFIX=/opt/clickhouse

关键参数说明:

  • -mtune=generic:避免针对特定CPU优化
  • 禁用TCMalloc:ARM版存在内存泄漏问题
  • 安装路径不要包含中文或空格

5. 部署时的遗漏文件

编译成功后仍缺少以下关键文件:

  1. 配置文件缺失

    mkdir -p /etc/clickhouse-server/ cp programs/server/config.xml /etc/clickhouse-server/ cp programs/server/users.xml /etc/clickhouse-server/
  2. SSL证书补全

    openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes -subj "/CN=localhost"
  3. 服务启动技巧

    # 避免内存不足 echo "vm.overcommit_memory=1" >> /etc/sysctl.conf sysctl -p

编译成果分享

为节省大家时间,我已将编译好的二进制包上传至:

  • 下载链接:[模拟链接] (安全考虑不展示真实URL)
  • 文件清单:
    clickhouse-v20.3.19.4-arm64.tar.gz ├── bin/ # 可执行文件 ├── lib/ # 依赖库 ├── conf/ # 默认配置 └── install.sh # 一键安装脚本

实测部署时间从编译的3小时缩短到10分钟,性能测试结果与x86版本差异小于5%。这个过程中最大的体会是:ARM生态的兼容性问题往往藏在细节里,每个报错信息都值得深入分析。

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

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

立即咨询