MongoDB v5.0.11在ARM架构下的编译

文章概述
MongoDB作为基于分布式文件存储的NoSQL数据库,被应用于多种数据量较大的场景使用。
随着2022年前后国产化系统的不断发展,AArch64处理器架构得到了广泛的采用,而国产化系统采用的往往不是全指令集的CPU,导致官网给出的MongoDB v5.0.0及更高版本包文件无法直接拿来运行,原因是缺少相应的指令集作为支撑,这时候就需要根据官方源码进行手动编译。

官方链接
官网 (mongodb.com)
官方文档 (mongodb.com)
官方Git项目 (github.com)
官方系统安装包下载 (mongodb.org)
官方社区适配包下载 (mongodb.com)
官方归档版本下载 (mongodb.com)

编译过程
系统配置 Kylin_AArch64_V10 8C/32G/200G
安装需要 GCC v8.2及以上版本
安装需要 Python3环境

1. 编译GCC

# 获取包文件
curl -kLO 'http://ftp.gnu.org/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.xz'
tar -xf gcc-9.5.0.tar.xz && cd gcc-9.5.0
# 安装系统依赖 
yum install bzip2 wget gcc gcc-c++ -y
# 查看需要的依赖包,可以提前下载,防止网络延迟后面执行download_prerequisites报错
cat contrib/download_prerequisites
# 提前下载依赖包
curl -kLO 'https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2' 
curl -kLO 'https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2'
curl -kLO 'https://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz'
curl -kLO 'https://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2'
# 下载安装 GCC 所需要的依赖包,由于提前下载,执行相当快
./contrib/download_prerequisites
# 创建构建文件夹
mkdir build && cd build
# 配置编译
../configure --disable-checking --enable-languages=c,c++ --disable-multilib
# 开始编译,由于相当耗时,所以给予核心数量*2的编译线程数,耗时83m,大小6.2G
make -j $(( $(nproc) * 2 ))
# 进行安装
make install

备注:
--disable-multilib 只安装64位版本
--disable-checking 可以加快构建
--enable-checking 使得编译出的二进制程序可以使用gdb调试
--enable-checking=release 以软件发布版的标准来对编译时生成的代码进行一致性检查
--enable-languages=c,c++ 支持的高级语言类型和运行时库
--disable-multilib 禁止生成32位代码

2. 编译MongoDB

# 获取包文件
curl -kLO 'https://github.com/mongodb/mongo/archive/refs/tags/r5.0.11.tar.gz'
tar -xf r5.0.11.tar.gz && cd mongo-r5.0.11
# 查看编译帮助
cat mongo-r5.0.11/docs/building.md
# 安装系统依赖
yum install python3 python3-devel openssl-devel python3-pip yum install lzma xz-devel curl libcurl libcurl-devel -y
# 安装python3编译依赖
python3 -m pip install -r etc/pip/compile-requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 查看帮助信息,没报错基本上就能往下走
python3 buildscripts/scons.py --help MONGO_VERSION=5.0.11
# 开始编译,默认编译到build/install/bin目录,耗时183m,大小36G
python3 buildscripts/scons.py -j $(nproc) install-core \
  MONGO_VERSION=5.0.11 \
  --disable-warnings-as-errors \
  CCFLAGS="-march=armv8-a+crc" \
  --opt=on
# 缩减体积,删除所有符号和重新定位信息
# 1.4G mongo -> 46M mongo
# 4.6G mongod -> 83M mongod
# 2.7G mongos -> 60M mongos
cd build/install/bin && strip -s mongo*
# 解决执行mongo命令报错 /lib64/libstdc++.so.6: version `GLIBCXX_3.4.26' not found
find /usr/lib64 /usr/local/lib64 -name 'libstdc++.so*'
ln -nsf /usr/local/lib64/libstdc++.so.6.0.28 /lib64/libstdc++.so.6

备注:
--opt=on 启用编译时优化
install-core 编译出mongod、mongos
--disable-warnings-as-errors 忽略编译器警告
CCFLAGS="-march=armv8-a+crc" 当CPU不支持arm64v8.2a时使用

点赞