手把手教你在X86系统上交叉编译ARM版本的ClickHouse
应用背景
2020年10月,华为联系我司,希望我司可以对目前华为鲲鹏的生态做一些软件适配类的工作,为之后其他项目使用鲲鹏服务器做好铺垫。
目前我司在某省部署了基于X86,规模为100台的的ClickHouse集群,底层采用了k8S架构,以容器的方式运行ClickHouse集群,主要接入数据为日志类数据,一天数据量在2500亿条左右。
编译过程
编译环境
系统:Ubuntu 18.04 x86_64 内存:8G以上 CPU: 4核8线程以上 硬盘: 100G空间以上(编译包较大)
环境设置以及软件包下载
环境依赖
# 更新软件仓库sudo apt-get update# 安装基础依赖sudo apt-get install git cmake python ninja-build# 下载并编译安装clang-11sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"# 在当前终端设置编译器 (或者写入.bashrc文件中并生效)export CC=clang-11export CXX=clang++-11# 更新cmake版本sudo apt remove --purge cmakesudo apt install build-essential libssl-devwget https://github.com/Kitware/CMake/releases/download/v3.16.5/cmake-3.16.5.tar.gztar xvf cmake-3.16.5.tar.gzcd cmake-3.16.5/./bootstrapmakesudo make instal
ClickHouse软件
# 在大容量的存储目录中克隆ClickHouse, 我使用的目录是'/data', 之后的编译说明都是在此目录下的操作cd /datasudo git clone --recursive https://github.com/ClickHouse/ClickHouse.gitcd ClickHousegit checkout -b stable211215 v21.1.2.15-stable# 下载子模块cd ClickHousegit submodule update# 删除不需要的旧模块cd ClickHouserm -rf contrib/libcxxabi-cmakerm -rf contrib/libpqrm -rf contrib/libpqxx
编译X86版本的ClickHouse
由于交叉编译过程中需要将proto文件转换为c++的源码文件, 需要采用x86的protoc以及protoc-gen-grpc工具, 所以先编译x86版本的ClickHouse
# 编译X86版本的ClickHousecd ClickHousemkdir buildcd buildcmake ..ninja -j 8
编译ARM版本的ClickHouse
下载交叉编译工具链
# 下载cd /datawget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz?revision=972019b5-912f-4ae6-864a-f61f570e2e7e&la=en&hash=B8618949E6095C87E4C9FFA1648CAA67D4997D88# 重命名mv gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz\?revision\=972019b5-912f-4ae6-864a-f61f570e2e7e\&la\=en\&hash\=B8618949E6095C87E4C9FFA1648CAA67D4997D88 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz# 解压到ClickHouse目录中cd ClickHousesudo mkdir -p build-aarch64/cmake/toolchain/linux-aarch64sudo tar xJf /data/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz -C build-aarch64/cmake/toolchain/linux-aarch64 --strip-components=1rsync -av build-aarch64/cmake/toolchain/linux-aarch64/ cmake/toolchain/linux-aarch64/
修改配置
修改cmake/linux/toolchain-aarch64.cmake, 通过git diff查看修改 修改base/glibc-compatibility/CMakeLists.txt, 通过git diff查看修改
cmake构建系统
# 创建build目录cd ClickHousemkdir build-arm64# 查看运行的服务器是否支持sse 4.2grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"# 如果不支持, 则执行cmake . -Bbuild-arm64 -DHAVE_SSE41=0 -DHAVE_SSE42=0 -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake -D ENABLE_MYSQL=1 -D ENABLE_PROTOBUF=1 -D ENABLE_GRPC=1# 如果支持sse 4.2, 则执行cmake . -Bbuild-arm64 -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake -D ENABLE_MYSQL=1 -D ENABLE_PROTOBUF=1 -D ENABLE_GRPC=1
修改配置, 以便编译grpc和protobuf插件
# x86上编译好的protobuf以及protoc-gen-grpc的全路径如下/data/ClickHouse/build/contrib/protobuf/protoc-3.13.0.0/data/ClickHouse/build/contrib/grpc/grpc_cpp_plugin#修改配置文件build.ninja, 文件路径为:/data/ClickHouse/build-arm64/build.ninja#修改build.ninja文件中的字段1. 'protobuf::protoc' (匹配多个)替换为/data/ClickHouse/build/contrib/protobuf/protoc-3.13.0.02. 'plugin=protoc-gen-grpc='后面跟着的是路径的字符串替换为 /data/ClickHouse/build/contrib/grpc/grpc_cpp_plugin 如果后面跟着'_gRPC_CPP_PLUGIN-NOTFOUND' 就忽略修改
编译ClickHouse
cd ClickHouseninja -j 8 -C build-arm64
验证容器中运行
生成docker镜像
参考ClickHouse官方X86镜像的dockerfile
https://hub.docker.com/layers/yandex/clickhouse-server/20.12.5.18/images/sha256-be765b9d1478d9dd02e35e5a8944b129cf5fd5bf763434dea7f750db76a0551d?context=explore
底包采用ubuntu官方镜像20.04
FROM ubuntu:20.04COPY clickhouse /usr/binCOPY entrypoint.sh /entrypoint.shCOPY clickhouse-server /etc/clickhouse-serverCOPY clickhouse-client /etc/clickhouse-clientCOPY docker-entrypoint-initdb.d /docker-entrypoint-initdb.dRUN echo '#!/bin/sh' > /usr/sbin/policy-rc.d && \echo 'exit 101' >> /usr/sbin/policy-rc.d && \chmod +x /usr/sbin/policy-rc.d && \mkdir -p /run/systemd && echo 'docker' > /run/systemd/container && \apt-get update && apt-get install --allow-unauthenticated --yes --no-install-recommends gosu && \rm -rf /var/lib/apt/lists/* /var/cache/debconf /tmp/* && apt-get clean && \mkdir /var/lib/clickhouse && \chmod +x /entrypoint.sh /usr/sbin/gosu && \groupadd -r clickhouse --gid=101 && useradd -r -g clickhouse --uid=101 --home-dir=/var/lib/clickhouse --shell=/bin/bash clickhouse && \chmod -R 755 /etc/clickhouse-server/ && chmod -R 755 /etc/clickhouse-client/ENV CLICKHOUSE_CONFIG=/etc/clickhouse-server/config.xmlEXPOSE 8123 9000 9009VOLUME [/var/lib/clickhouse]ENTRYPOINT ["/entrypoint.sh"]
将生成容器镜像相关文件放到一个文件夹下,我使用的是ch-docker
build容器镜像
docker build -t yandex/clickhouse:21.1.2.15 .
运行镜像
docker run -d -p 8123:8123 -p 9000:9000 -p 9009:9009 --name ck21 --ulimit nofile=262144:262144 yandex/clickhouse:21.1.2.15
查看容器运行情况
root@qx01:/mnt/disk4/ch-docker# docker ps | grep ck
进入容器后使用clickhouse-client连接本地server进行测试
root@2cb9b03cc1bd:/# clickhouse-client
ClickHouse client version 21.1.2.15.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 21.1.2 revision 54443.
2cb9b03cc1bd :) select * from system.build_options;
可正常查询,此次交叉编译测试完成
过程遇到的问题
不支持的模块组件
目前有四个插件功能编译失败或者arm平台不支持 arm平台不支持: hdfs librdafka hyperscan(需要sse3)不能编译 parquet编译失败
心得体会及后续计划
初期编译是在鲲鹏的平台上进行本地化编译,过程不是很顺利,各种适配软件的缺失,故转换思路采用在X86平台交叉编译的方式进行编译才得以编译成功。
计划后续完成k8s在鲲鹏平台的部署后,继续测试ClickHouse集群基于k8s的部署及查询性能测试。
欢迎感兴趣的同学添加微信号:ClickHouseC,进入ClickHouse User Group China8和大家一起共同探讨。
文章转载自ClickHouse开发者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。