首页 / 资讯中心 / 文章详情

CentOS下MongoDB二进制安装全攻略:权限、systemd与认证实战

CentOS下MongoDB二进制安装全攻略:权限、systemd与认证实战 ★ FEATURED ARTICLE
之前有个朋友找我说按照网上教程在 CentOS 上装 MongoDB最后一步启动怎么也起不来日志翻来覆去就一句话Permission denied。我一问数据目录是他用 root 创建的服务却用 mongod 用户来跑当然没权限。这种问题其实特别典型MongoDB 安装本身不复杂但 CentOS 环境里的权限、依赖、systemd、防火墙这些旁路细节才是真正拦路的地方。所以这篇就把我从下载二进制包到开启认证、配置开机自启的完整过程写出来适合刚上手 CentOS MongoDB 的开发者也适合被各种报错折磨过、想系统过一遍的运维照着做。1. 安装方式和版本选择先想清楚再动手1.1 版本兼容性不是玄学很多人一上来就yum install mongodb装到后的版本可能老得连wiredTiger选项都不会认。更麻烦的是CentOS 7 自带的 glibc、OpenSSL 版本都比较保守新版 MongoDB 对系统库的要求却一直在提高。下载二进制包的时候文件命名里的rhel70、rhel80就对应不同系统平台拿错包硬装启动时会直接报libcrypto.so.10: cannot open shared object file这种错。以我这次选择的 5.0.x 版本为例它对应的二进制文件名是mongodb-linux-x86_64-rhel70-5.0.28.tgz。如果你的服务器是 CentOS 7就不要去拿rhel80的包如果是 CentOS 8也同理。生产环境我更赞同选一个已经发布一段时间的稳定版本而不是追最新毕竟资料多、同事踩过的坑也基本都能搜到。1.2 三种安装方式我为什么用二进制包安装方式优点缺点Yum 源安装命令简单升级方便仓库源版本可能滞后且 CentOS 7/8 生命周期结束后第三方源容易失效Docker 容器环境隔离一键启动数据卷、日志、权限都要额外处理小内存机器反而更吃资源二进制包可控性最强路径、版本一目了然升级、卸载要自己管理如果你只是想本地临时试一下Docker 确实快。但要在 CentOS 服务器上长期跑数据我更推荐二进制包因为它能把安装路径、配置内容、日志位置全部固定下来。之后无论是排查问题还是迁移都少一层黑盒。1.3 前置确认系统架构和内存够不够安装前先做两个检查uname -m确认是 x86_64 还是 aarch64这是下载包类型的前提然后free -h看内存。MongoDB 官方给出的最低内存支持是 512MB 左右但这只够功能验证。单节点存真实业务数据我建议至少 2GB 内存4GB 以上会更从容因为 WiredTiger 缓存默认会吃掉不少内存。检查命令很简单cat /etc/centos-release uname -m free -h如果内存很紧张后面配置里就要显式调小wiredTigerCacheSizeGB否则服务虽然能起来但系统随时可能被 OOM 杀掉。2. 安装前的系统准备权限、目录、依赖一次排清2.1 先确认必备工具安装过程会用到wget、tar、curl。CentOS 最小化安装默认可能只有tar所以先补齐yum install -y wget curl tar另外检查一下libcurl和openssl这些基础库。MongoDB 在启动时会动态加载系统库缺了任何一个都会导致莫名其妙的启动失败。2.2 创建专用用户和数据目录这是我最想强调的一步。用 root 启动 mongod 确实能跑但后续日志、备份、文件权限都会变得很难管。合理做法是创建一个不能登录的系统用户useradd -r -s /sbin/nologin mongod mkdir -p /data/mongodb/data mkdir -p /data/mongodb/log chown -R mongod:mongod /data/mongodb我见过很多次问题就出在chown漏掉了。目录是 root 建的服务却用 mongod 用户启动启动日志里只有一句权限不足新手很容易卡在这里。所以每次建完目录都要用ls -ld确认属主ls -ld /data/mongodb/data /data/mongodb/log2.3 依赖检查libssl 这个坑必须提前填解压完二进制包先别急着启动先做一次动态库检查ldd /opt/mongodb/bin/mongod | grep not found如果看到libcrypto.so.10或libssl.so.10说明系统里 OpenSSL 版本太新或太乱CentOS 7 上常见处理方式是安装兼容库yum install -y compat-openssl10装完后再跑一次ldd直到所有依赖都找到为止。这一步虽然不花什么时间但能帮你避免之后启动日志里只留下孤零零的一行加载错误。3. 二进制包的下载解压与路径规划越简单越要细心3.1 下载和校验多花一分钟后面少一个坑二进制包下载地址有固定规则fastdl.mongodb.org/linux/下按版本和平台命名。我在 CentOS 7 上下载 5.0.28 这个版本cd /opt wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.28.tgz下载完不要直接解压先算一下校验值和发布页给的 SHA-256 对比一致再继续sha256sum mongodb-linux-x86_64-rhel70-5.0.28.tgz这一步能排除下载过程中文件损坏的情况。文件损坏时解压可能正常但启动会崩在很奇怪的地方。3.2 解压、建软链接和目录权限我的习惯是把具体版本目录保留再用一个不带版本的软链接指向当前版本这样以后升级时只需要替换软链接服务配置不用改tar -zxvf mongodb-linux-x86_64-rhel70-5.0.28.tgz mv mongodb-linux-x86_64-rhel70-5.0.28 /opt/mongodb-5.0.28 ln -s /opt/mongodb-5.0.28 /opt/mongodb二进制文件本身放在/opt/mongodb下属主保持 root:root 即可给所有用户读权限。数据目录和日志目录放在/data/mongodb下属主是 mongod。这种“程序 root 管数据业务用户管”的分离方式在出问题时会非常清楚。3.3 把 bin 目录加进 PATH为了后续敲命令方便我习惯在/etc/profile.d/下面放一个小脚本cat /etc/profile.d/mongodb.sh EOF export PATH/opt/mongodb/bin:$PATH EOF chmod x /etc/profile.d/mongodb.sh新开一个终端后mongod --version就能直接看到版本。这样做还有个好处以后要卸载删掉这个文件和/opt/mongodb软链接即可没有残留。4. mongod.conf 逐项拆解不复制老配置理解每个参数4.1 一份能跑的配置长什么样MongoDB 的配置文件是 YAML 格式注意缩进不能用 Tab。先给出一份比较完善的单机配置systemLog: destination: file logAppend: true path: /data/mongodb/log/mongod.log logRotate: reopen storage: dbPath: /data/mongodb/data directoryPerDB: true wiredTiger: engineConfig: cacheSizeGB: 1 net: port: 27017 bindIp: 127.0.0.1,192.168.1.10 processManagement: fork: false operationProfiling: mode: slowOp slowOpThresholdMs: 200这里面的directoryPerDB开启后每个数据库会单独一个子目录备份和排查单个库时很方便。logAppend: true表示日志追加而不是覆盖logRotate: reopen配合日志切割使用。4.2 bindIp 和 fork 是新手最容易搞错的两个参数bindIp决定了 MongoDB 监听哪些网络接口。开发环境用127.0.0.1没问题但生产环境需要让内网其他机器连接时有人图省事直接设成0.0.0.0等于把数据库暴露在整个网络上非常危险。正确做法是写内网 IP例如192.168.1.10这样只有同网段的机器能访问。fork参数则是和 systemd 配合的关键。网上很多老教程写fork: true这是为了让 mongod 在后台以守护进程方式运行。但用 systemd 托管时systemd 希望主进程在前台运行由它来维护状态。所以配置文件里我写的是fork: false而 systemd 服务单元则负责后台监管。4.3 WiredTiger 缓存不是越大越好WiredTiger 是 MongoDB 的默认存储引擎它会把常用数据页缓存在内存里以提高性能。默认情况下这个缓存会用到物理内存的 50% 左右在 16GB 内存的服务器上可能直接吃掉 7GB 以上如果这台机器还跑着其他服务就很容易触发内存紧张。我建议优先设置一个保守值。对于内存 2GB 的小机器设置cacheSizeGB: 1内存 8GB 的机器可以先设置2然后看实际业务和free -h的输出再调整。这个参数改完重启即可生效。另外即使设置了较小缓存mongod 的内存占用也可能看起来很高因为系统会把磁盘中的页缓存也算在进程头上这是正常现象不必恐慌。4.4 operationProfiling慢查询日志的开关operationProfiling用于记录执行时间过长的操作。默认情况下 MongoDB 不记录慢查询排查问题时不方便。所以我配置了mode: slowOp和slowOpThresholdMs: 200意思是超过 200 毫秒的操作才会被记录。这个开关对性能影响很小但能避免线上问题全靠猜。要注意的是不要为了排查问题把所有操作都记录mode: all会对性能产生明显影响生产环境慎用。5. systemd 接管从手动启动到开机自启5.1 先手工启动做一次冒烟测试在配置 systemd 服务之前先用命令行手动启动一次减少排错范围。注意我配置里写了fork: false所以临时启动时要在命令行上追加--fork让它在后台拉起sudo -u mongod /opt/mongodb/bin/mongod -f /etc/mongod.conf --fork启动后用最轻量的请求确认状态/opt/mongodb/bin/mongo --host 127.0.0.1 --port 27017 --eval db.runCommand({ ping: 1 })如果返回{ ok : 1 }说明数据库已经能正常干活。这时候先停掉继续配置 systemdsudo -u mongod /opt/mongodb/bin/mongod -f /etc/mongod.conf --shutdown5.2 编写 systemd 服务单元在/etc/systemd/system/mongod.service写入以下内容[Unit] DescriptionMongoDB Database Server Afternetwork.target [Service] Usermongod Groupmongod ExecStart/opt/mongodb/bin/mongod --config /etc/mongod.conf Restarton-failure LimitNOFILE64000 LimitMEMLOCKinfinity [Install] WantedBymulti-user.target这里有几个细节值得解释。LimitNOFILE提高文件句柄上限因为 MongoDB 连接数起来后普通进程默认的 1024 很容易不够用。LimitMEMLOCKinfinity是避免 WiredTiger 因无法锁定内存而警告或失败。Restarton-failure让进程因为异常退出时自动拉起但正常 stop 不会重启。如果配置文件的fork被误设成truesystemd 里就要用Typeforking配套PIDFile麻烦得多。现在用fork: false加Typesimple默认是对 systemd 最友好的方式。5.3 启动、开机自启和验证写完后执行systemctl daemon-reload systemctl enable --now mongod systemctl status mongodenable --now等价于先设置开机自启再立刻启动。看到Active: active (running)就可以了。再检查端口监听和日志ss -lntp | grep 27017 journalctl -u mongod -n 50journalctl里的内容如果出现权限错误第一反应是检查/data/mongodb目录属主如果出现端口占用检查是不是已经有一个 mongod 在跑。6. 开启访问认证把裸奔的数据关进笼子6.1 先创建管理员账号再开认证MongoDB 默认安装后是不需要认证的只要网络能通谁都能连上来。这在开发环境还能忍一旦放到内网或公网后果很严重。正确顺序是先不开启认证启动服务然后连接数据库创建管理员。/opt/mongodb/bin/mongo --host 127.0.0.1 --port 27017 admin在 mongo shell 里执行db.createUser({ user: admin, pwd: 换成你自己的强密码, roles: [{ role: root, db: admin }] })root角色拥有所有数据库的最高权限一般只用于初始化和总管理员。业务应用如果只需要操作某一个库应该另外创建权限更小的账号比如readWrite角色做到最小权限原则。6.2 开启 authorization 并验证效果在/etc/mongod.conf里加上security: authorization: enabled然后重启systemctl restart mongod没有认证直接执行show dbs会看到类似command listDatabases requires authentication的提示。用管理员账号连一次/opt/mongodb/bin/mongo --host 127.0.0.1 --port 27017 -u admin -p 密码 --authenticationDatabase admin连接成功后再show dbs数据库列表就出来了。这一步验证很关键很多教程只让你配置不告诉你重启后可能连不上其实大部分是因为账号建得不对或者认证数据库写错了。6.3 防火墙只放行业务来源CentOS 7 默认可能没开防火墙很多服务虽然起来了但根本走不到网络层。如果开了 firewalld我建议只放行业务网段而不是简单地把 27017 暴露给全世界firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.1.0/24 port protocoltcp port27017 accept firewall-cmd --reload这样只有192.168.1.0/24网段的机器能访问 MongoDB其他人连端口探测都看不到服务。如果服务器上还有其他访问来源按需再加规则。移除规则对应的是--remove-rich-rule别把防火墙规则越堆越多。7. 日常运维复盘备份、日志、缓存与常见故障7.1 备份 mongodump 是最简单可靠的保命牌开启认证后备份命令也需要带账号密码。我常用归档格式备份恢复起来也方便/opt/mongodb/bin/mongodump --host 127.0.0.1 --port 27017 \ --authenticationDatabase admin --username admin --password 密码 \ --db yourdb --gzip --archive/backup/yourdb-$(date %F).gz恢复时用mongorestore注意--drop会先删除目标库里已有数据再恢复别手滑用错库/opt/mongodb/bin/mongorestore --host 127.0.0.1 --port 27017 \ --authenticationDatabase admin --username admin --password 密码 \ --gzip --archive/backup/yourdb-2025-01-01.gz --drop如果数据量很大建议考虑复制集加延迟从节点的方式做持续保护但那是另外一个话题了。至少mongodump这条退路要保证能随时走通。7.2 日志轮转和磁盘告警MongoDB 的日志如果一直追加时间长了会撑满磁盘。我习惯用 logrotate 做每日切割切割后再发送SIGUSR2信号让 mongod 重新打开日志文件/data/mongodb/log/mongod.log { daily rotate 7 compress missingok notifempty postrotate /usr/bin/kill -USR2 $(/usr/bin/pidof mongod) endscript }同时日常检查记得看数据库目录占用du -sh /data/mongodb/data df -h /data磁盘满了之后MongoDB 会拒绝写入甚至导致整个服务不稳定。所以备份文件最好放到另一块磁盘或对象存储里不要和数据库目录放在同一个挂载点。7.3 连接数、缓存和慢查询怎么排查连接数暴涨通常是业务端连接池没设置好或者有慢查询占着连接不放。可以用 mongo shell 快速看一眼db.serverStatus().connections输出里的current是当前连接数available是还剩多少。如果连接数长期打满优先检查慢查询db.currentOp()这个命令会列出正在执行的操作能看到耗时过长的查询和对应集合。结合配置文件里开启的operationProfiling慢日志会写入 MongoDB 的系统集合用db.system.profile.find().sort({ts:-1}).limit(20)就能看到最近的慢操作。排查完记得别让 profiling 一直全量开启否则会拖累性能。7.4 我这里踩过的三个高频故障第一个是数据目录权限错乱。表现为服务起不来日志里出现Permission denied。解决办法是确认/data/mongodb整个链路都 chown 给 mongod注意父目录也要有足够权限。第二个是 socket 文件残留。之前异常断电后/data/mongodb/data目录里会残留mongod.lock或/tmp/mongodb-27017.sock启动时提示地址被占用。先把 mongod 进程完全停掉再删除残留文件最后启动即可。第三个是系统库版本缺失。表现为启动时error while loading shared libraries。这一步我建议把ldd检查当成安装后固定动作别等启动失败了才回头找。最后再分享一点个人体会装 MongoDB 本身其实只需要二十分钟但真正费时间的是配置、权限、认证和备份这些被教程默认忽略的部分。我每次在新服务器上部署都会按本文的顺序先把用户、目录、依赖检查做完再去下载包。把前面的路扫干净后面启动和配置基本就是水到渠成的事。
阅读完成 · 觉得有帮助?
咨询建站