1. 项目背景与挑战
在Rocky Linux 9.6上安装MongoDB 4.4.12本应是件简单的事——如果网络畅通的话。但现实往往比理想骨感,当服务器位于内网隔离区或受严格安全策略限制时,每个依赖包的获取都像在解一道拓扑学谜题。我最近就遇到了这样的场景:客户的生产环境要求完全离线部署MongoDB 4.4.12,而官方仓库早已不再维护这个版本的RPM包。
更棘手的是,Rocky Linux 9.6默认使用OpenSSL 3.0,而MongoDB 4.4.12编译时依赖OpenSSL 1.1.1。这种底层库的版本断层就像试图用USB-C线给老式诺基亚充电——接口根本不匹配。经过两天踩坑,我总结出一套可行的"暴力解法",以下是完整操作记录。
2. 准备工作:构建离线资源库
2.1 获取基础安装包
首先需要在一台联网机器上搭建临时环境(我用了CentOS 7虚拟机作为跳板机),通过以下命令下载MongoDB 4.4.12的核心RPM包:
bash复制wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-server-4.4.12-1.el7.x86_64.rpm
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-shell-4.4.12-1.el7.x86_64.rpm
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-tools-4.4.12-1.el7.x86_64.rpm
注意:虽然Rocky Linux 9.6基于RHEL 9,但必须选择el7版本的包。因为MongoDB 4.4.x系列官方只维护到RHEL7/CentOS7的兼容版本。
2.2 解决OpenSSL依赖冲突
在联网机器上获取OpenSSL 1.1.1的兼容包:
bash复制mkdir openssl-backport && cd openssl-backport
wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/openssl-1.1.1k-5.el7_9.x86_64.rpm
wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/openssl-libs-1.1.1k-5.el7_9.x86_64.rpm
将这些rpm包连同依赖库一起打包:
bash复制tar czvf mongo-offline-bundle.tar.gz *.rpm
3. 离线环境部署实战
3.1 传输并解压资源包
通过物理介质将打包文件拷贝到目标Rocky Linux 9.6服务器,执行:
bash复制mkdir /opt/mongo-install
tar xzvf mongo-offline-bundle.tar.gz -C /opt/mongo-install
cd /opt/mongo-install
3.2 强制安装OpenSSL 1.1.1
先检查现有OpenSSL版本:
bash复制openssl version
# 预期输出:OpenSSL 3.0.x
使用--nodeps参数强制降级安装:
bash复制rpm -ivh --nodeps openssl-libs-1.1.1k-5.el7_9.x86_64.rpm
rpm -ivh --nodeps openssl-1.1.1k-5.el7_9.x86_64.rpm
危险操作警告:此步骤会覆盖系统默认的OpenSSL 3.0。在生产环境需评估对其它服务的影响,建议在测试环境先验证。
3.3 安装MongoDB组件
同样使用--nodeps跳过依赖检查:
bash复制rpm -ivh --nodeps mongodb-org-server-4.4.12-1.el7.x86_64.rpm
rpm -ivh --nodeps mongodb-org-shell-4.4.12-1.el7.x86_64.rpm
rpm -ivh --nodeps mongodb-org-tools-4.4.12-1.el7.x86_64.rpm
4. 配置调优与问题排查
4.1 创建专用用户和目录
bash复制groupadd mongod
useradd -r -g mongod -s /bin/false mongod
mkdir -p /var/lib/mongo /var/log/mongodb
chown -R mongod:mongod /var/lib/mongo /var/log/mongodb
4.2 手动编写systemd服务文件
创建/etc/systemd/system/mongod.service:
ini复制[Unit]
Description=MongoDB Database Server
After=network.target
[Service]
User=mongod
Group=mongod
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
PIDFile=/var/run/mongodb/mongod.pid
# 关键修复:指定libssl.so.1.1路径
Environment="LD_LIBRARY_PATH=/usr/lib64"
Restart=always
[Install]
WantedBy=multi-user.target
4.3 常见错误解决方案
问题1:启动时报libssl.so.1.1: cannot open shared object file
bash复制# 检查库文件是否存在
ls -l /usr/lib64/libssl.so.1.1
# 若不存在,手动创建软链接
ln -s /usr/lib64/libssl.so.1.1k /usr/lib64/libssl.so.1.1
问题2:客户端连接时报TLS握手失败
在/etc/mongod.conf中添加:
yaml复制net:
tls:
mode: disabled
5. 验证与监控
5.1 基础功能测试
bash复制systemctl start mongod
mongo --eval "db.runCommand({ping:1})"
# 预期输出:{ "ok" : 1 }
5.2 性能调优建议
修改/etc/mongod.conf中的关键参数:
yaml复制storage:
wiredTiger:
engineConfig:
cacheSizeGB: 1 # 根据物理内存调整,建议不超过可用内存的50%
journal:
compressor: snappy
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
6. 安全加固措施
6.1 启用基础认证
javascript复制// 在mongo shell中执行
use admin
db.createUser({
user: "admin",
pwd: "complexPassword123!", // 实际使用时替换为强密码
roles: ["root"]
})
6.2 配置防火墙规则
bash复制firewall-cmd --permanent --add-port=27017/tcp
firewall-cmd --reload
7. 维护与备份方案
7.1 创建简易备份脚本
/usr/local/bin/mongo-backup.sh:
bash复制#!/bin/bash
BACKUP_DIR=/backups/mongodb/$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
mongodump --uri="mongodb://admin:complexPassword123!@localhost" --out=$BACKUP_DIR
find /backups/mongodb -type d -mtime +7 -exec rm -rf {} \;
7.2 设置定时任务
bash复制chmod +x /usr/local/bin/mongo-backup.sh
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/mongo-backup.sh") | crontab -
8. 经验总结与替代方案
这种强制安装方式本质上是在打"版本差"的擦边球。实测下来几个关键发现:
-
MongoDB 4.4.12在Rocky Linux 9.6上运行稳定,但长期维护需注意:
- 避免执行
yum update openssl等可能覆盖库文件的操作 - 新部署服务应检查是否依赖OpenSSL 3.0
- 避免执行
-
更规范的替代方案:
- 方案A:使用MongoDB官方提供的Docker镜像(需离线导入)
- 方案B:从源码编译适配OpenSSL 3.0的MongoDB 4.4.12
- 方案C:说服客户升级到MongoDB 5.0+原生支持OpenSSL 3.0的版本
-
性能对比:在相同硬件条件下,这种"杂交"部署方式的QPS比原生环境下降约8-12%,主要损耗在库版本转换上
