编译和部署Mongodb5.0.18的arm64版本

编译和部署Mongodb5.0.18的arm64版本

MongoDB源码编译

准备安装包

https://github.com/mongodb/mongo/releases/tag/r5.0.18

上传: /opt/package

解压:

tar -zxvf /opt/package/mongo-r5.0.18.tar.gz -C /opt/package

查看构建文档 ,里面有详细说明,需要服务器满足条件

cat /opt/package/mongo-r5.0.18/docs/building.md

安装gcc

下载地址:http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-9.5.0/gcc-9.5.0.tar.gz

上传: /opt/package

解压:gcc-9.5.0.tar.gz

tar -zxvf /opt/package/gcc-9.5.0.tar.gz -C /opt/package

安装依赖

# 安装依赖
yum -y install bzip2 wget
# 进入gcc-9.5.0目录
cd /opt/package/gcc-9.5.0
# 在解压根目录中执行
./contrib/download_prerequisites

在有网络的情况下可执行.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

编译

# 创建编译目录
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
# 用32核心编译
# 需要等待很久,视机器性能而定
make -j32
# 安装
make install
# 切换gcc到新版本
update-alternatives --install /usr/bin/gcc gcc /opt/gcc-9.5.0/gcc-9.5.0


# 第一个坑:安装完之后,发现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

下载源码地址找到3.7版本: Python Source Releases | Python.org

解压后切换到解压包目录,进行预编译 -> 编译 -> 编译安装

# 安装依赖

yum groupinstall -y "Development tools"
yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel

# 预编译,设置安装目录为/usr/local/python3。安装目录可以自定义

./configure --prefix=/usr/local/python3

# 编译。因为CPU8核,所以设置-j8加快编译速度

make -j8

# 编译安装

make install -j8

安装Python模块

# 安装环境
yum install python3-devel

# 安装 scons
pip3 install scons

# 安装Python模块
python3 -m pip install -r /opt/package/mongo-r5.0.18/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 的方式,在有网络的相同芯片架构、相同操作系统的环境下进行安装包下载,下载下来直接是whl文件,上传到内网服务器上,使用pip3 install 就可以安装,如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专用,后续编译时果然没有问题,

编译安装

python3 buildscripts/scons.py DESTDIR=/opt/software/mongodb install-core MONGO_VERSION=5.0.18

# 注意最后一个参数,如果不加,则会将编译中的告警当做错误,中途就会停止编译。
# 编译时间很长,在4C8G的机器上,要5、6个小时。

编译过程报错:

Couldn’t find OpenSSL crypto.h header and library

#编译安装openssl
wget https://www.openssl.org/source/old/3.0/openssl-3.0.0.tar.gz

# 下载地址 --- 下载版本: 3.0.1 (openssl-3.0.1.tar.gz)
https://www.openssl.org/source/old/3.0/

# 解压
tar -zxvf openssl-3.0.1.tar.gz 
cd openssl-3.0.1

# 配置
# --prefix指定安装路径
./config --prefix=/usr/local/openssl

# 这里有个问题,会报如下错误:
Can't locate IPC/Cmd.pm in @INC (@INC contains: /root/Downloads/openssl-3.0.1/util/perl /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 . /root/Downloads/openssl-3.0.1/external/perl/Text-Template-1.56/lib) at /root/Downloads/openssl-3.0.1/util/perl/OpenSSL/config.pm line 18.
BEGIN failed--compilation aborted at /root/Downloads/openssl-3.0.1/util/perl/OpenSSL/config.pm line 18.
Compilation failed in require at /root/Downloads/openssl-3.0.1/Configure line 23.
BEGIN failed--compilation aborted at /root/Downloads/openssl-3.0.1/Configure line 23.

解决方法:

1)安装perl-CPAN
yum install -y perl-CPAN
2)进入CPAN的shell模式
perl -MCPAN -e shell
3)安装缺少的模块
cpan[1]> install IPC/Cmd.pm
...
...
...
cpan[2]>exit
# 退出

# 重新配置
./config --prefix=/usr/local/openssl

# 编译安装
make
make install

# 查看安装结果
[root@linux openssl-3.0.0]# cd /usr/local/openssl
[root@linux openssl]# ls
bin  include  lib  share  ssl

重新编译安装添加ssl参数

[root@linux mongodb-src-r5.0.18]# python3 buildscripts/scons.py --ssl CPPPATH=/usr/local/openssl/include LIBPATH=/usr/local/openssl/lib DESTDIR=/opt/software/mongodb install-core MONGO_VERSION=5.0.18

报错

Checking for C library lzma... no
Cannot find system library 'lzma' required for use with libunwin

解决

[root@linux ~]# /bin/ld.gold  -llzma --verbose
/bin/ld.gold: Attempt to open //lib/liblzma.so failed
/bin/ld.gold: Attempt to open //lib/liblzma.a failed
/bin/ld.gold: Attempt to open //usr/lib/liblzma.so failed
/bin/ld.gold: Attempt to open //usr/lib/liblzma.a failed
/bin/ld.gold: error: cannot find -llzma
/bin/ld.gold: Opened new descriptor 3 for "a.out"

[root@linux ~]# yum install xz-devel

[root@linux ~]# find /usr/ -name liblzma.so

[root@linux ~]# ln -s /usr/lib64/liblzma.so /usr/lib/liblzma.so

[root@linux ~]# /bin/ld.gold  -llzma --verbose
/bin/ld.gold: Opened new descriptor 3 for "//lib/liblzma.so"
/bin/ld.gold: Attempt to open //lib/liblzma.so succeeded
/bin/ld.gold: Unlocking file "//lib/liblzma.so"
/bin/ld.gold: Released descriptor 3 for "//lib/liblzma.so"
/bin/ld.gold: Opened new descriptor 4 for "a.out"

再次编译安装添加ssl参数

[root@linux ~]# cd /usr/local/mongodb/mongodb-src-r5.0.18/

python3 buildscripts/scons.py --ssl CPPPATH=/usr/local/openssl/include LIBPATH=/usr/local/openssl/lib DESTDIR=/opt/software/mongodb install-core MONGO_VERSION=5.0.18

报错

Checking for curl_global_init(0) in C library curl... no
Could not find <curl/curl.h> and curl lib

解决

 yum install -y libcurl-devel

继续编译安装

python3 buildscripts/scons.py --ssl CPPPATH=/usr/local/openssl/include LIBPATH=/usr/local/openssl/lib DESTDIR=/opt/software/mongodb install-core MONGO_VERSION=5.0.18

报错,所有的警告都被视为错误

In file included from /usr/include/string.h:638,
                 from /usr/local/include/c++/9.5.0/cstring:42,
                 from src/third_party/mozjs-60/include/mozilla/Span.h:33,
                 from src/third_party/mozjs-60/include/mozilla/Range.h:12,
                 from src/third_party/mozjs-60/include/jsapi.h:15,
                 from src/mongo/scripting/mozjs/jsstringwrapper.h:33,
                 from src/mongo/scripting/mozjs/jsstringwrapper.cpp:32:
In function 'char* strncpy(char*, const char*, size_t)',
    inlined from 'mongo::mozjs::JSStringWrapper::JSStringWrapper(int32_t)' at src/mongo/scripting/mozjs/jsstringwrapper.cpp:48:12:
/usr/include/bits/string3.h:120:34: error: 'char* __builtin_strncpy(char*, const char*, long unsigned int)' specified bound 64 equals destination size [-Werror=stringop-truncation]
  120 |   return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest));
      |          ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
scons: *** [build/59f4f0dd/mongo/scripting/mozjs/jsstringwrapper.o] Error 1
scons: building terminated because of errors.
build/59f4f0dd/mongo/scripting/mozjs/jsstringwrapper.o failed: Error 1

解决:

方法1:

后来发现官方的构建文档也有说明

Note : For C++ compilers that are newer than the supportedversion, the compiler may issue new warnings that cause MongoDB tofail to build since the build system treats compiler warnings aserrors. To ignore the warnings, pass the switch
--disable-warnings-as-errors to scons.
python3 buildscripts/scons.py install mongod --disable-warnings-as-errors

要忽略这个警告可以加上–disable-warnings-as-errors 这个参数

方法2:需要修改mongo的代码,估计是这个版本官方的一个bug,在mongo源码目录下

vi src/mongo/scripting/mozjs/jsstringwrapper.cpp

# 找到48行删除,添加两行

    strncpy(_buf, formatted.c_str(), sizeof(_buf) - 1);
    _buf[sizeof(_buf) - 1] = '\0';

再次继续编译安装

python3 buildscripts/scons.py --ssl CPPPATH=/usr/local/openssl/include LIBPATH=/usr/local/openssl/lib DESTDIR=/opt/software/mongodb install-core MONGO_VERSION=5.0.18 --disable-warnings-as-errors

大功告成

Linking build/59f4f0dd/mongo/s/mongos
Install file: "build/59f4f0dd/mongo/s/mongos" as "/opt/software/mongodb/bin/mongos"
scons: done building targets.

配置Mongdb

上面我们加了DESTDIR=/opt/software/mongodb,构建好的mongodb就在这个目录下了

设置环境变量

vim /etc/profile

在末尾添加内容

#MongoDB Env
export MONGODB_HOME=/opt/software/mongodb
export PATH=$PATH:$MONGODB_HOME/bin

立即生效

source /etc/profile

创建文件夹

创建数据库文件夹

mkdir -p /opt/software/mongodb/data

创建日志文件夹

mkdir -p /opt/software/mongodb/log

修改配置文件

创建配置文件mongodb.conf

vim /opt/software/mongodb/bin/mongodb.conf

dbpath =  /opt/software/mongodb/data #数据文件存放目录
logpath = /opt/software/mongodb/log #日志文件存放目录
journal=false
auth=true
# bind_ip_all = true                 # 任何机器可以连接
# bind_ip = 127.0.0.1,192.168.0.3     # 本机和192.168.0.3可以访问
bind_ip = 0.0.0.0
port = 27017                        # 实例运行在27017端口(默认)
logappend = true                   # 启动时 添加还是重写日志文件
fork = true                         # 是否后台运行

清理压缩生成的mongo文件

linux中的strip命令简介------给文件脱衣服

cd /opt/software/mongodb/bin

strip mongod
strip mongo
strip mongos

启动MongoDB

mongod -f /opt/software/mongodb/bin/mongodb.conf

启动过程报错

提示libstdc++.so.6文件版本太低

strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

在上面安装gcc的路径搜索

find ./ -name libstdc++.so.6*

拷贝到/usr/lib64路径下

cp ./aarch64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28 /lib64/

# 把原来的软链接删除
mv /lib64/libstdc++.so.6 /lib64/libstdc++.so.6_back

# 创建新的软链接
ln -s /lib64/libstdc++.so.6.0.28 /lib64/libstdc++.so.6

再次使用命令启动就行啦!!!

创建超级用户

MongoDB 没有无敌用户root,只有能管理用户的用户 userAdminAnyDatabase

连接mongoDB服务器端

mongo

进入admin数据库

use admin

创建用户

用户权限列表:

Read:允许用户读取指定数据库。

readWrite:允许用户读写指定数据库。

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile。

userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户。

clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。

readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限。

readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限。

userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限。

dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。

root:只在admin数据库中可用,超级账号,超级权限。

模版:

db.createUser({
     user:用户名,
     pwd:密码, 
     roles:[
      { role:权限类型, db:可访问的db}]
})

例:

创建超级用户

db.createUser({
       user: "root",
       pwd: "root_123",
       roles: [ { role: "root", db: "admin" } ]
      })

创建数据库

连接MongoDB

指定用户进入MongoDB: mongo admin -u 用户名 -p 密码

mongo admin -u root -p
Enter password:
root_123
创建数据库
# 没有则会自动创建
use ga

访问MongoDB

用Navicat连接MongoDB

测试连接,能连接成功即可

操作MongoDB

启动MongoDB
mongod -f /opt/software/mongodb/etc/mongodb.conf
关闭MongoDB

使用超级用户登录MongoDB

mongo admin -u root -p
Enter password:
root_123

进入admin数据库

use admin

关闭MongoDB

db.shutdownServer();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值