
1. 项目概述与背景最近在麒麟系统上折腾一个数据采集项目后端服务需要个文档型数据库来存非结构化的日志和配置信息第一时间就想到了MongoDB。这玩意儿在Linux上装起来本来不算复杂但麒麟系统毕竟是个国产化的Linux发行版基于Debian或CentOS魔改而来底层环境、软件源和依赖库跟原版总有些细微差别。我手头这台机器是银河麒麟V10ARM架构的飞腾CPU从找安装包到处理依赖再到配置服务踩了几个不大不小的坑。今天就把这次完整的安装和配置过程连同遇到的问题和解决方案从头到尾捋一遍。如果你也在国产化平台上做开发或运维尤其是使用麒麟操作系统需要部署MongoDB那这篇记录应该能帮你省下不少查资料和排错的时间。简单说这篇内容会涵盖从零开始在麒麟Linux以银河麒麟V10 ARM版为例上安装、配置、启动MongoDB社区版的完整流程并深入解释关键配置项的含义和调整策略。无论你是开发者还是系统管理员跟着步骤走都能在自己的麒麟机器上把MongoDB服务稳稳当当地跑起来。2. 安装前的关键准备与规划在动手敲命令之前花几分钟做好规划能避免后续很多麻烦。安装数据库不是简单的apt-get install尤其是生产环境或需要长期维护的开发环境。2.1 系统与架构确认第一步必须搞清楚你的麒麟系统具体版本和CPU架构。这直接决定了你需要下载哪个安装包。打开终端执行以下命令cat /etc/os-release uname -m以我的环境为例输出显示是“Kylin Linux Advanced Server release V10 (Sword)”架构是“aarch64”。这说明我的是银河麒麟V10ARM64即aarch64架构。如果你的架构显示是x86_64那就是Intel/AMD的64位CPU。这一点至关重要MongoDB官方为不同的架构提供了不同的二进制包装错了肯定无法运行。注意麒麟系统有多个版本如桌面版、服务器版还有中标麒麟、银河麒麟等不同发行商。它们大多基于Ubuntu或CentOS。我的V10服务器版其包管理命令和文件系统路径与CentOS 8/Red Hat 8系列非常相似。如果你的系统基于Ubuntu可用apt --version确认后续的部分命令如服务管理需要做相应调整。2.2 安装方式选型包管理 vs 二进制包MongoDB官方为Linux提供了几种安装方式通过官方仓库安装推荐添加MongoDB的官方APT或YUM仓库然后用系统包管理器安装。好处是能自动解决依赖、方便后续升级和管理。这是最规范的方式。下载二进制压缩包Tarball手动下载对应架构的.tgz压缩包解压到指定目录然后手动配置环境变量和服务。这种方式更灵活不依赖系统仓库适合需要特定版本或离线环境。使用Docker容器如果系统里装了Docker那docker run mongo是最快的方式。但对于想深入了解系统配置或者环境不允许用Docker的情况就不太合适。对于麒麟系统我强烈推荐使用官方二进制压缩包。原因有几点首先麒麟系统的软件源里通常没有MongoDB的官方包自己编译源码又太耗时。其次官方提供的二进制包是跨Linux发行版通用的只要架构匹配就能运行避开了因系统源差异导致的依赖地狱。最后这种方式让你对安装位置、数据目录、日志目录有完全的控制权符合运维规范。2.3 规划目录结构在Linux系统上胡乱安装软件是大忌。我们需要规划好几个关键目录安装目录/opt/mongodb将MongoDB二进制文件解压到这里。/opt目录通常用于存放第三方应用程序。数据目录/data/dbMongoDB存储数据库文件的地方。默认是/data/db但你可以放在任何有足够空间和权限的位置比如/var/lib/mongodb。日志目录/var/log/mongodb存放MongoDB的运行日志。放在/var/log下符合Linux惯例。配置文件目录/etc/mongod.confMongoDB的主配置文件。通常放在/etc下。在安装前最好用df -h命令检查一下目标磁盘分区的空间是否充足。对于学习和测试环境几十GB够用生产环境则需要根据数据量预估预留充足空间。3. 分步安装与核心配置解析规划好了我们就开始动手。整个过程可以分为下载、安装、配置、启动四个阶段。3.1 下载与解压官方二进制包首先访问MongoDB官方社区版的下载页面。由于网络环境差异你可能需要找一个速度快的镜像。这里我们通过命令行直接下载。确定版本号访问MongoDB官网查看当前最新的稳定版版本号。假设我们安装6.0版本。构造下载链接MongoDB二进制包的命名规则通常是mongodb-linux-架构-发行版-版本.tgz。对于麒麟兼容RHEL8的ARM64系统我们选择RHEL8的包。 在终端执行下载命令请将版本号替换为最新的稳定版wget https://fastdl.mongodb.org/linux/mongodb-linux-aarch64-rhel80-6.0.5.tgz如果wget速度慢可以先用浏览器下载再通过SFTP等工具上传到服务器。解压与部署# 创建安装目录 sudo mkdir -p /opt/mongodb # 解压下载的压缩包 tar -zxvf mongodb-linux-aarch64-rhel80-6.0.5.tgz # 将解压出的内容移动到安装目录 sudo mv mongodb-linux-aarch64-rhel80-6.0.5/* /opt/mongodb/ # 创建必要的系统目录 sudo mkdir -p /data/db /var/log/mongodb # 设置目录权限确保MongoDB进程有读写权限 sudo chown -R whoami /data/db /var/log/mongodb # 将MongoDB的可执行文件路径加入系统环境变量方便在任何位置执行命令 echo export PATH/opt/mongodb/bin:$PATH ~/.bashrc source ~/.bashrc这里把数据目录和日志目录的所有者改成了当前用户是为了测试方便。在生产环境中你应该创建一个专门的mongod系统用户和用户组并将目录权限赋予该用户以提升安全性。3.2 详解配置文件 mongod.confMongoDB的强大和灵活很大程度上体现在它的配置文件上。在/opt/mongodb/bin目录下你可能找不到现成的mongod.conf我们需要自己创建或从模板生成。创建配置文件sudo vim /etc/mongod.conf输入以下核心配置内容# /etc/mongod.conf systemLog: destination: file path: /var/log/mongodb/mongod.log logAppend: true logRotate: reopen storage: dbPath: /data/db journal: enabled: true engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 # 根据你的机器内存调整建议是物理内存的50%-70% processManagement: fork: true # 以守护进程方式运行 pidFilePath: /var/run/mongodb/mongod.pid net: port: 27017 bindIp: 127.0.0.1 # 默认只监听本地生产环境需改为服务器IP或0.0.0.0并配置防火墙 security: authorization: disabled # 首次安装先关闭认证方便初始化。初始化后务必改为enabled让我解释几个关键点cacheSizeGB这是WiredTiger存储引擎的内存缓存大小。它决定了MongoDB能在内存中缓存多少数据和索引。设置太小会影响性能太大可能引发系统内存交换。对于4GB内存的测试机设为1GB是合理的起点。bindIp这是安全的重中之重默认的127.0.0.1只允许本机连接。如果你需要从其他机器访问比如应用服务器需要改为服务器的内网IP或者0.0.0.0监听所有网卡。但改为0.0.0.0后必须配合防火墙和authorization认证否则数据库将完全暴露在公网极其危险authorization先设为disabled让我们能无密码连接创建管理员账户。这是标准的安全初始化流程。3.3 配置系统服务与启动我们不希望每次开机都手动启动MongoDB最好将其配置为系统服务。创建Systemd服务单元文件sudo vim /etc/systemd/system/mongod.service写入服务配置[Unit] DescriptionMongoDB Database Server Documentationhttps://docs.mongodb.org/manual Afternetwork.target [Service] Userwhoami # 生产环境请替换为专门的mongod用户如mongod Groupwhoami # 同上 ExecStart/opt/mongodb/bin/mongod --config /etc/mongod.conf ExecStop/opt/mongodb/bin/mongod --config /etc/mongod.conf --shutdown PIDFile/var/run/mongodb/mongod.pid Typeforking Restarton-failure RestartSec10 StartLimitInterval60 StartLimitBurst3 LimitNOFILE64000 LimitNPROC64000 [Install] WantedBymulti-user.target注意User和Group我这里用了当前用户是为了演示简便。生产环境务必创建一个非root、无登录权限的专用用户如mongod并在mongod.conf中配置对应的文件权限这是基本的安全规范。重载Systemd并启动服务sudo systemctl daemon-reload sudo systemctl start mongod sudo systemctl enable mongod # 设置开机自启检查服务状态sudo systemctl status mongod如果看到active (running)恭喜你MongoDB服务已经成功在后台运行了。同时可以查看日志确认tail -f /var/log/mongodb/mongod.log日志中应该能看到类似[initandlisten] waiting for connections on port 27017的成功信息。4. 安全加固与基础操作服务跑起来只是第一步一个裸奔的数据库是危险的。接下来进行最关键的安全初始化和基础测试。4.1 创建管理员用户与启用认证现在我们可以用Mongo Shell连接本地数据库因为还没开认证。连接Mongo Shell/opt/mongodb/bin/mongo --host 127.0.0.1:27017切换到admin数据库并创建超级用户use admin db.createUser({ user: myAdmin, pwd: YourStrongPassword123!, // 这里一定要换成高强度密码 roles: [ { role: root, db: admin } ] })root角色拥有整个MongoDB实例的最高权限。创建成功后会返回Successfully added user。启用认证并重启服务 退出Mongo Shell输入exit。然后编辑配置文件sudo vim /etc/mongod.conf找到security部分修改为security: authorization: enabled保存后重启MongoDB服务使配置生效sudo systemctl restart mongod使用认证信息重新连接/opt/mongodb/bin/mongo -u myAdmin -p --authenticationDatabase admin输入你设置的密码。连接成功后执行show dbs应该能看到系统数据库列表。至此一个带有基础访问控制的生产级MongoDB实例就配置好了。4.2 基础数据库操作验证让我们快速验证一下数据库的基本功能是否正常。创建测试数据库和集合use testdb db.createCollection(users)插入和查询文档db.users.insertOne({ name: 张三, age: 30, city: 北京 }) db.users.find()如果能看到刚才插入的文档说明读写功能完全正常。检查数据库状态db.stats()这个命令可以查看当前数据库的统计信息如集合数量、文档数量、存储大小等是日常运维的常用命令。5. 性能调优与生产环境考量安装和基础安全完成后如果准备用于生产环境还需要进行一些调优。5.1 内核参数与资源限制调整MongoDB对系统资源有一定要求特别是文件描述符数量和内存。调整文件描述符限制编辑limits配置文件。sudo vim /etc/security/limits.conf在文件末尾添加mongod soft nofile 64000 mongod hard nofile 64000 mongod soft nproc 64000 mongod hard nproc 64000注意这里假设你创建了mongod用户。如果仍用当前用户则将mongod替换为你的用户名。调整虚拟内存参数MongoDB使用内存映射文件需要调整内核的overcommit_memory设置。sudo sysctl -w vm.overcommit_memory1为了使该设置永久生效需要编辑/etc/sysctl.conf文件添加vm.overcommit_memory1。5.2 存储引擎与日志配置优化回到mongod.conf文件我们可以对存储做进一步优化。WiredTiger引擎配置前面我们设置了cacheSizeGB。对于专用数据库服务器可以设置为(物理内存 - 系统预留) * 0.6。例如16GB内存的机器系统预留4GB可以设置为(16-4)*0.6 ≈ 7.2配置为cacheSizeGB: 7。日志轮转我们配置了logRotate: reopen这需要MongoDB以日志文件方式运行。另一种更常见的生产环境做法是使用系统的logrotate工具来管理MongoDB日志避免日志文件无限增大。可以创建一个/etc/logrotate.d/mongod文件进行配置。5.3 网络与防火墙配置如果应用服务器和数据库服务器分离必须正确配置网络。在mongod.conf中绑定IPnet: port: 27017 bindIp: 172.16.1.100,127.0.0.1 # 绑定到内网IP和本地回环地址配置系统防火墙如果使用firewalldsudo firewall-cmd --permanent --add-port27017/tcp sudo firewall-cmd --reload重要只开放给必要的应用服务器IP地址段是更安全的做法可以使用--add-rich-rule进行更精细的控制。6. 故障排查与日常维护指南即使按照步骤操作也可能遇到问题。这里汇总几个我遇到过的典型问题及解决方法。6.1 常见启动失败问题问题现象可能原因排查命令与解决方案systemctl status mongod显示failed1. 配置文件语法错误。2. 数据目录或日志目录权限不足。3. 端口被占用。1.sudo journalctl -xe -u mongod查看详细错误日志。2.sudo ls -ld /data/db /var/log/mongodb检查目录所有者权限确保与运行用户一致。3.sudo netstat -tlnp | grep :27017检查端口占用杀死占用进程或修改mongod.conf中的端口。日志中出现IllegalOperation: Attempted to create a lock file on a read-only directory进程对数据目录没有写权限。sudo chown -R mongod:mongod /data/db将mongod替换为你的运行用户。连接时提示Authentication failed1. 用户名或密码错误。2. 未在正确的认证数据库authenticationDatabase下认证。1. 确认密码无误注意大小写。2. 连接命令确保包含--authenticationDatabase admin。6.2 连接与性能问题从远程无法连接检查mongod.conf中的bindIp是否包含服务器IP或0.0.0.0。检查服务器防火墙如firewalld、iptables是否放行了27017端口。检查云服务商的安全组规则如果使用云服务器。数据库响应慢检查服务器内存和CPU使用率top,htop命令。通过Mongo Shell连接后执行db.currentOp()查看当前正在执行的操作是否有慢查询阻塞。检查/var/log/mongodb/mongod.log中是否有慢查询日志需要先在配置文件中设置operationProfiling模式。6.3 数据备份与恢复基础对于任何数据库备份都是生命线。MongoDB提供了mongodump和mongorestore工具。全量备份/opt/mongodb/bin/mongodump --urimongodb://myAdmin:YourPasswordlocalhost:27017 --out/backup/mongodb-$(date %Y%m%d)这将创建一个包含所有数据库BSON文件的备份目录。恢复备份/opt/mongodb/bin/mongorestore --urimongodb://myAdmin:YourPasswordlocalhost:27017 /backup/mongodb-20231027/重要提醒恢复操作会覆盖目标数据库中已存在的同名集合。生产环境操作前务必在测试环境验证并确保有可靠的备份。在麒麟系统上部署MongoDB核心难点不在于安装命令本身而在于理解国产化环境与通用Linux发行版的细微差异并做好符合生产要求的安全和性能配置。从规划目录、选择二进制安装包到细致地编写配置文件、创建系统服务再到最关键的用户认证和网络绑定每一步都需要根据实际环境仔细考量。尤其是安全部分千万不要在配置好认证和防火墙之前就将bindIp设置为0.0.0.0这是很多内网数据库被入侵的起点。整个流程走下来我感觉最省心的办法还是坚持“二进制包自定义配置Systemd服务”这个组合。它既规避了源依赖问题又给了我们最大的灵活性。最后数据库的稳定运行离不开监控和定期维护建议把日志监控如tail -f或接入ELK和定期备份如通过cron定时任务执行mongodump也纳入你的运维清单里。