在树莓派 4 上编译安装 MongoDB Embedded 4.2.1

最近想了一个可以跑在树莓派上的新坑,其实也可以跑在别的地方啦,不过既然都买了新的 Raspberry Pi 4 的话,就拿着折腾一下吧(◐‿◑)。

然后这个新坑我计划需要用到 NoSQL 数据库,最后决定选择 MongoDB。 Raspbian 上虽然有自带的 MongoDB,但是已经相当久远了,还停留在 MongoDB 2.4 版本。

emmmmm,为了确保这个项目以后不会经常因为 MongoDB 的版本更新做改动,那就尽量用最新的 MongoDB 版本吧。于是就要在 Raspberry Pi 上开始漫长的编译啦( ;´Д`)

在写这篇 post 时,我的 Raspbian 系统版本如下

$ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

前期准备工作的时间并不算长,但是编译的时间大概就得好几个小时了∑(゚Д゚)不过编译的时候正好摸鱼hhhhhhh

  1. apt 安装依赖
  2. pip3 安装依赖
  3. 编译安装 Mongo C Driver
  4. 编译安装 MongoDB

简单来说就是以上 4 步啦~

1. apt 安装依赖

sudo apt-get install -y scons libssl-dev python3 python3-pip libffi-dev libcurl4-openssl-dev cmake wget

scons 是 MongoDB 构建时使用的工具,可以自动分析源代码间的依赖,而且支持多种语言。还有很多不错的特性,可以参考它的官网~https://scons.org

2. pip3 安装依赖

这里直接参考了 MongoDB 在 GitHub 上的 compile-requirements.txthttps://github.com/mongodb/mongo/blob/r4.3.0/etc/pip/compile-requirements.txt

不过这个 compile-requirements.txt 里面是引用了别的几个 requirements.txt,于是这里就综合了一下

Cheetah3 # src/mongo/base/generate_error_codes.py
psutil
pymongo >= 3.0, != 3.6.0  # See PYTHON-1434, SERVER-34820
PyYAML >= 3.0.0
regex
requests >= 2.0.0
typing >= 3.6.4

可以将上面的内容复制粘贴到 build-requirements.txt 里,随后用 pip3 安装即可

sudo pip3 install -r ./build-requirements.txt

在国内的话,可以指定使用清华大学 TUNA 镜像源

sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r ./build-requirements.txt

3. 编译安装 Mongo C Driver

Mongo C Driver 的一个可选依赖是 snappy,Google 家的一个压缩库,编译安装 snappy 大概只要几分钟,于是就加上吧

3.1 编译安装 snappy

snappy 的源代码在其 GitHub Release 页面下载,https://github.com/google/snappy/releases

在写本文的时候,snappy 最新的 release 是在 17 年 8 月 25 号发布的 1.1.7,于是下载地址就是 https://github.com/google/snappy/archive/1.1.7.tar.gz

SSH 到树莓派上执行如下命令即可~

export SNAPPY_VER=1.1.7
wget https://github.com/google/snappy/archive/\${SNAPPY_VER}.tar.gz -O snappy-\${SNAPPY_VER}.tar.gz
tar xzf snappy-\${SNAPPY_VER}.tar.gz
cd snappy-\${SNAPPY_VER}
mkdir build && cd build
cmake -DBUILD_SHARED_LIBS=ON .. && make -j`nproc` && sudo make install

这里 cmake 的参数里定义了 BUILD_SHARED_LIBS,因为 Mongo C Driver 是动态链接到 libsnappy 的,只编译 snappy 的静态库的话,则会出现报错

3.2 编译安装 Mongo C Driver

Mongo C Driver 的源代码也是在它的 GitHub Release 页面上,https://github.com/mongodb/mongo-c-driver/releases

在写这篇 post 的时候最新版本是 19 年 11 月 7 号发布的 1.15.2,下载链接则是 https://github.com/mongodb/mongo-c-driver/releases/download/1.15.2/mongo-c-driver-1.15.2.tar.gz

编译安装 Mongo C Driver 也很简单,还是老套路

export MONGO_C_VER=1.15.2
wget https://github.com/mongodb/mongo-c-driver/releases/download/\${MONGO_C_VER}/mongo-c-driver-\${MONGO_C_VER}.tar.gz -O mongo-c-driver-\${MONGO_C_VER}.tar.gz
tar xzf mongo-c-driver-\${MONGO_C_VER}.tar.gz
cd mongo-c-driver-\${MONGO_C_VER}
mkdir release && cd release
cmake .. && make -j`nproc` && sudo make install

4. 编译安装 MongoDB Embedded

MongoDB 的源代码则是在它的官网上下载,https://www.mongodb.com/download-center/community。在页面右侧会有一个 Download Source (tgz),下载到 Raspberry Pi 上即可~

截止这篇 post 写作的时候,MongoDB 在其官网上最新的版本是 4.2.1~于是

export MONGODB_VER=4.2.1
wget https://fastdl.mongodb.org/src/mongodb-src-r\${MONGODB_VER}.tar.gz -O mongodb-src-r${MONGODB_VER}.tar.gz
tar xzf mongodb-src-r\${MONGODB_VER}.tar.gz
cd mongodb-src-r\${MONGODB_VER}

不过 r4.2.1 似乎有一处类型转换的问题,因为我在使用 GCC 8.3.0 编译时会有一处报错

所以需要在开始编译前,先修改一下对应文件 src/mongo/util/net/ssl_manager.cpp

在这个文件的 941 行,加上强制转换(高亮部分)即可解决

if (mongoUnsignedAddOverflow64(tagAndLengthByteCount, derLength, (long unsigned int*)outLength)) ||
    *outLength > cdr.length()) {
    return Status(ErrorCodes::InvalidSSLConfiguration, "Invalid DER length");
}

修改好文件之后就可以正常编译啦♪(´ε` )

./buildscripts/scons.py --link-model=dynamic \
    --install-mode=hygienic \
    --disable-warnings-as-errors \
    --enable-free-mon=off \
    --js-engine=none \
    --dbg=off \
    --wiredtiger=off \
    --use-system-mongo-c=on \
    --allocator=system \
    --release=RELEASE \
    CPPPATH="/usr/local/include/libbson-1.0 /usr/local/include/libmongoc-1.0" \
    LIBPATH="/usr/local/lib" \
    CCFLAGS="-mabi=aapcs-linux -march=armv8-a+crc+simd" \
    install-embedded-{dev,test} -j`nproc`

编译成功之后,接下来就是安装 MongoDB Embedded

cd build/install
sudo cp -R * /usr/local

最后就可以使用 MongoDB Embedded 了~

mkdir -p \${HOME}/mongodb
mongoed --dbpath=\${HOME}/mongodb

One thought on “在树莓派 4 上编译安装 MongoDB Embedded 4.2.1”

  1. 感谢分享~
    只是按照你的步骤做下来,最后提示“scons: done building targets”
    也复制到 /usr/local/bin 里面了
    但是在 bin 里面只有 cheetah cheetah-analyze cheetah-compile mongoc_embedded_test mongoc-stat mongo_embedded_test
    没有 mongoed.. 提示 -bash: mongoed:未找到命令 (ㆁ_ㆁ)

Leave a Reply

Your email address will not be published. Required fields are marked *

sixteen + 14 =