因某项目申请了华为鲲鹏云机器,没有外网权限,需要安装ARM版MongoDB,而MongoDB的现有版本中并没有用于CentOS7.8的ARM版本,所以需要重新编译。

整体流程遵循文件:编译和部署Mongodb5.0.5的arm64版本_随心~稳心的博客-CSDN博客

简单罗列过程,过程中碰到的问题及解决过程。

一、MongoDB源码下载

从GitHub相关链接Release r5.0.5 · mongodb/mongo · GitHub进行下载,然后在个人常用的安装包目录解压即可。

tar -zxvf <download-dir>/mongo-r5.0.5.tar.gz -C /opt/package

查看mongo目录下docs/building.md,了解各工具版本等信息

二、安装GCC

1、下载gcc

http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-9.5.0/gcc-9.5.0.tar.gz下载gcc-9.5.0.tar.gz,解压到个人常用的安装包目录

2、解压

tar -zxvf <download-dir>/gcc-9.5.0-tar.gz -C /opt/package

安装依赖,还好鲲鹏云在常见的依赖包,都已经放在内网上,可以用yum正常安装

3、基础依赖包安装

yum -y install bzip2 wget

4、安装依赖包安装

在有网络的情况下可执行.contrib/download_prerequisities,下载安装依赖

而如果在内网情况下,无法执行,查看该文件代码发现是要下载安装4个文件gmp-6.1.0.tar.bz2、mpfr-3.1.4.tar.bz2、mpc-1.0.3.tar.gz、isl-0.18.tar.bz2,并解压安装在gcc安装包第一层目录下。

于是在可联网机器上,进行下载:

gmp-6.1.0.tar.bz2,下载路径为https://ftp.gnu.org/pub/gnu/gmp/gmp-6.1.0.tar.bz2

mpfr-3.1.4.tar.bz2,下载路径为https://ftp.gnu.org/pub/gnu/mpfr/mpfr-3.1.4.tar.bz2

mpc-1.0.3.tar.gz,下载路径为https://ftp.gnu.org/pub/gnu/mpc/mpc-1.0.3.tar.gz

isl-0.18.tar.bz2,下载路径为http://www.mirrorservice.org/sites/sourceware.org/pub/gcc/infrastructure/isl-0.18.tar.bz2

然后在gcc-9.5.0目录下

tar -xf gmp-6.1.0.tar.bz2

tar -xf mpfr-3.1.4.tar.bz2

tar -xf mpc-1.0.3.tar.gz

tar -xf isl-0.18.tar.bz2

建立软链接

ln -sf gmp-6.1.0 gmp

ln -sf mpfr-3.1.4 mpfr

ln -sf mpc-1.0.3 mpc

ln -sf isl-0.18 isl

5、gcc编译

#创建编译目录

cd ../ && mkdir gcc-build-9.5.0 && cd gcc-build-9.5.0

#配置

../gcc-9.5.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

#用多少核心编译,取决于你的CPU核数

make -j4

#安装

make install

#切换gcc到新版本

update-alternatives --install /usr/bin/gcc gcc /opt/gcc-9.5.0/gcc-9.5.0 100

第一个坑:安装完之后,发现update-alternatives命令无法执行,通过update-alternative的查看命令--list gcc发现为空,也就是预置的gcc无法使用update-alternatives来更新,我最后的做法是把原来的gcc改成gcc.bak,g++改为g++.bak,然后在/usr/bin下新建gcc和g++的link,让它们指向到gcc9.5.0的bin目录下的gcc和g++。

三、升级Python

服务器预装的只有python2.7,而如果通过yum安装python3,会发现版本是3.6.8,所以还是要手工升级到3.7.5(3.7.0以上就可以)

1、下载python3.7.5

wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tar.xz

2、上载到鲲鹏云服务器,并解压及编译

tar xvf Python-3.7.5-tar.xz

mv Python-3.7.5-tar.xz /usr/local/python3.7

cd /usr/local/python3.7

./configure --prefix=/usr/loca/python3.7

make && make install

3、修改python3的软链接(可选)

如果原来装过3.6.8,那么还需要手工将python3和pip3的软链接修改到3.7.5的bin目录下

4、修改python的软链接(可选)

如果要将/usr/bin/下的python和pip也修改指向到3.7.5,好处是可以用python命令,但就会发生yum不能用的告警,因为yum用python2.7的,所以需要修改其配置文件

将/usr/bin/yum,/usr/libexec/urlgrabber-ext-down、/usr/bin/yum-config-manager的第一行的!/usr/bin/python改为!/usr/bin/python2.7

四、编译前安装Python依赖模块

1、安装python3-devel

yum install python3-devel

2、pip的模块安装

有网络环境下,很容易弄

pip3 install scons

python3 -m pip install -r /opt/package/mongo-r5.0.5/etc/pip/compile-requirements.txt

但在内网情况下,这个部分花了将近一天的时间。

要安装的pip模块包括scons和compile-requirements.txt中说明的依赖库,而后者又指向另外三个文件./mongo-r5.0.5/etc/pip/components/platform.req、core.req和compile.req,最终列表如下:

scons、pypiwin32=223、pywin32=225、psutil、pymongo>=3.9、PyYAML>=3.0.0、requests>=2.0.0、Cheetah3、regex、requirement_parse、setuptools。

当然在安装这些库时,还会产生一些其他的依赖库,如urllib3、idna、charset_normalizer、certifi、types_setuptools、dnspython等。

(1)最先搞定的是可以通过pip3 download <package-name>的方式,在有网络的相同芯片架构、相同操作系统的环境下进行安装包下载,下载下来直接是whl文件,上载到内网服务器上,使用pip3 install <name of whl>就可以安装,如scons、requests、setuptools等70%以上的依赖库。

(2)剩下的通过pip3 download下载的是tar.gz,如Cheetah3、psutil、pymongo、PyYAML等,接下来可以通过pip3 wheel <package-name.tar.gz>进行编译,生成whl安装包。

少部分的依赖库可以搞定,如psutil,但其他的如Cheetah3、PyYAML、pymongo等仍然报错,如pip3 install pymongo-4.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

居然还提示不支持的包。

又弄了几个小时,最终还是在百度上找到了答案,这里面就是根据文件名中的字段去判断,如aarch_64,如manylinux24等等,所以,要跳过这个检查,只要修改为none-any就可以,表示对操作系统和芯片架构没有要求,如将上面这个文件改为pymongo-4.3.2-cp37-none-any.whl,再使用pip3 install pymongo-4.3.2-cp37-none-any.whl就成功了!

注:有例外的就是pywin32,在centos下找不到,估计可能是windows专用,后续编译时果然没有问题,

五、MongoDB编译

编译也失败了两三次,第一次使用4核8G的机器,还跑了不少应用,结果告诉我虚拟内存耗尽,无法分配内存;第二次在根目录所在卷进行编译,结果把剩余空间用完,提示硬盘空间不足;第三次在咖啡厅编译,结果时间太长等不及,只能中断编译进程,结果发现回到办公室后,没有安装缓存,仍然是从头开始。

在mongodb目录下,编译命令为:

python3 buildscripts/scons.py DESTDIR=/data/software/mongodb install-core MONGO_VERSION=5.0.5 --disable-warnings-as-errors

注意最后一个参数,如果不加,则会将编译中的告警当做错误,中途就会停止编译。

编译时间很长,在4C8G的机器上,要5、6个小时。

六、MongoDB配置和运行

1、环境变量配置

vi /etc/profile
# added lines in the end
export MONGODB_HOME=/data/software/mongodb
export PATH=$PATH:$MONGODB_HOME/bin

# take effect now
source /etc/profile

2、数据库配置

# create db directory
mkdir -p /mnt/data/mongodb/db
# create log directory
mkdir -p /mnt/data/mongodb/logs
# create conf file
vi /data/software/mongodb/bin/mongodb.conf
# below is the conf file
dbpath = /mnt/data/mongodb/db
logpath = /mnt/data/mongodb/logs/mongod.log
journal = false
auth = true
bind_ip = 0.0.0.0
port = 27017
logappend = true
fork = true

3、瘦身、启动及最后一个坑处理

# strip the exec files in bin, can reduce from GB to MB
cd /data/software/mongodb/bin
strip mongod
strip mongo
strip mongos

# start the db
mongod -f /data/software/mongodb/bin/mongodb.conf

第一次启动会提示libstdc++.so.6文件版本太低

通过find / -name libstdc++.so.6*,发现libstdc++.so.6.0.28的位置

cp /usr/lib64/libstdc++.so.6.0.28 /lib64

mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak

ln -s /lib64/libstdc++.so.6.0.28 /lib64/libstdc++.so.6

再运行就可以正常启动了。

可以在本机使用mongo直接链接数据库进行相关操作,也可以使用Navicat等数据库工具了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐