当前位置: 首页 > news >正文

MongoDB数据库高并发商业实践优化·运行优化之不可使用root账户进行MongoDB运行-优雅草卓伊凡

MongoDB数据库高并发商业实践优化·运行优化之不可使用root账户进行MongoDB运行-优雅草卓伊凡

引言

关于最近优雅草卓伊凡发布关于MongoDB的内容是由于我们的甲方上线了一个很老的产品,但是他的用户量极大,并且还有各种人搞事情,不断的来GJ,上线刚开始还能勉强撑着,但是随着用户量急剧上升,包括他们的收入订单各方面,以及请求次数的规模及上升,老古董即便是java +spring +redis 配 cdn 加灵活带宽都抗不住问题,而且上线后出问题后都很复杂,这核心有一点就是数据库,MongoDB 我们的版本是3.4.0 而云数据库也就是腾讯云买900多元一月 基础的云MongoDB数据库都是需要最低4.4版本的,这个可就难了,我们版本太老 ,升级的复杂度不亚于重构,于是在这个环境下我们测试环境已经安排在重构,但是生产环境顶着压力做优化,既然是做优化那么在这么老版本的情况下就有很多挑战,很庆幸在我们技术同事以及技术总监卓伊凡的带领下在7月23日终于得到了突破进展,中途有特别多的问题,由卓伊凡拆分一一记录和学习,让我们对数据的深度理解也非常有帮助,在过程中我们积累了很多知识可以逐步细化消化。

Loaded: loaded (/etc/systemd/system/mongod.service; enabled; preset: disabled)
Active: activating (auto-restart) (Result: exit-code) since Wed 2025-07-23 21:38:10 CST; 1s ago
Docs: What is MongoDB? - Database Manual - MongoDB Docs
Process: 238158 ExecStart=/opt/mongodb-3.4.0/bin/mongod —config /opt/mongodb-3.4.0/mongo.conf (code=exited, status=217/USER)
Main PID: 238158 (code=exited, status=217/USER)
CPU: 690us

在那天我们发现有不正常运行,检查了MongoDB 的运行状态。

由于在教科书中有写到我们不能用root帐号运行也会造成频繁掉线的问题,这就不得详细讲了

在生产环境中,禁止使用 root 用户运行 MongoDB 是一项重要的安全最佳实践。以下从安全风险、权限管理、故障排查和性能影响四个方面详细阐述原因:

一、安全风险:为什么不能用 root 运行 MongoDB?

1. 权限提升攻击风险
  • 任意文件读写:若 MongoDB 被攻击(如通过注入漏洞),root 权限的进程可直接访问/修改系统文件(如 /etc/passwd、SSH 密钥)。
  • 持久化后门:攻击者可利用 root 权限在系统启动脚本中植入后门,实现持久控制。
2. 最小权限原则失效
  • MongoDB 仅需读写数据目录和日志文件的权限,root 权限远超实际需求。
  • 遵循 最小权限原则(Least Privilege)可降低单点故障的影响范围。
3. 防御纵深缺失
  • 若 MongoDB 被攻破,普通用户权限的进程最多只能影响数据目录,而 root 权限将导致整个系统沦陷。

二、权限管理:为什么需要专用用户?

1. 文件所有权隔离
  • 专用用户(如 mongodb)确保数据文件(/data/mongodb)和配置文件(/opt/mongodb-3.4.0)的所有权清晰。
  • 避免与其他服务(如 MySQL、Nginx)的文件权限冲突。
2. 进程隔离
  • systemd 可基于用户限制资源使用(如 LimitNOFILEMemoryMax):
[Service]
User=mongodb
Group=mongodb
LimitNOFILE=64000
MemoryMax=8G  # 限制 MongoDB 最大内存使用
3. 审计追踪
  • 专用用户便于日志审计:
# 查看 mongodb 用户的所有操作
sudo ausearch -ua mongodb

三、故障排查:为什么 root 会掩盖问题?

1. 权限错误被隐藏
  • root 用户可绕过文件权限检查,导致配置错误(如错误的目录权限)在测试阶段不暴露,上线后普通用户无法启动服务。
2. 系统资源竞争
  • root 进程可能无限制占用系统资源(如内存、文件描述符),导致其他服务崩溃。
  • 专用用户可通过 ulimit 限制资源使用:
# 编辑 /etc/security/limits.conf
mongodb hard nofile 64000
mongodb soft nofile 64000

其实这里 也存在一个文件描述 频繁导致掉线也解决的一个问题,我们单独一篇来讲。

我们这个地方 也是修改了

四、性能影响:使用专用用户会变慢吗?

1. 无直接性能损耗
  • 进程权限本身不影响 MongoDB 性能,但错误的权限配置可能间接导致问题:
    • 例如,root 用户创建的文件可能被 MongoDB 用户(如 mongodb)拒绝访问,触发频繁的权限检查。
2. 资源限制优化性能
  • 通过 systemd 限制 MongoDB 内存使用可避免系统 OOM(Out of Memory):
[Service]
MemoryMax=32G  # 适用于 64GB 系统,防止 MongoDB 耗尽内存
3. 权限与磁盘 I/O
  • 专用用户确保文件权限一致性,避免因权限问题导致的磁盘 I/O 性能下降。

五、最佳实践:如何正确配置专用用户?

1. 创建专用用户和组
sudo groupadd -r mongodb
sudo useradd -r -g mongodb -d /data/mongodb -s /bin/false mongodb
2. 设置正确的文件权限
sudo chown -R mongodb:mongodb /data/mongodb
sudo chown -R mongodb:mongodb /opt/mongodb-3.4.0
3. 配置 systemd 服务文件
[Service]
User=mongodb
Group=mongodb
WorkingDirectory=/data/mongodb
ExecStart=/opt/mongodb-3.4.0/bin/mongod --config /opt/mongodb-3.4.0/mongo.conf

这就不得不提到我之前写的蜻蜓I即时通讯 水银版搭建方法中有关于数据库的启动,因此这里非常不严谨

这个就非常的不对,

六、对比实验:root vs 专用用户的差异

指标

root 用户

专用用户

文件权限冲突

高(可能覆盖系统文件)

低(仅访问数据目录)

系统安全风险

极高(权限提升攻击)

低(最小权限原则)

故障排查复杂度

高(权限错误被掩盖)

低(权限问题直接暴露)

资源隔离能力

无(可能耗尽系统资源)

有(可通过 systemd 限制)

审计追踪可行性

困难(与系统操作混淆)

容易(专用用户日志清晰)

七、总结:为什么必须使用专用用户?

  1. 安全层面:降低权限提升攻击风险,遵循最小权限原则。
  2. 管理层面:实现进程隔离、文件权限清晰和审计追踪。
  3. 故障排查:避免权限错误被隐藏,提高问题定位效率。
  4. 性能影响:正确配置下无负面影响,反而可通过资源限制优化性能。

建议:立即将 MongoDB 服务从 root 用户迁移至专用用户,并通过 systemd 确保服务以正确用户身份运行。

我们做到了最终 是以MongoDB 运行。

http://www.xdnf.cn/news/1191277.html

相关文章:

  • 大型微服务项目:听书——12 数据一致性自定义starter封装缓存操作
  • MongoDB数据模型
  • 深度学习(鱼书)day03--神经网络(后两节)
  • 7月26日星期六今日早报简报微语报早读
  • Oracle 误删数据恢复
  • 服务器被网络攻击后该如何进行处理?
  • golang实现一个定时引擎,功能包括按照corntab的时间任务实时增加、修改、删除定时任务
  • C++11 -- emplace、包装器
  • C++ 类型萃取:深入理解与实践
  • MySQL 8.0 OCP 1Z0-908 题目解析(36)
  • pip, github 突然连不上?报错和解决方法如下
  • MyBatis-Plus 通用 Service
  • 基于MySQL实现基础图数据库
  • C++连接MySQL完整教程
  • 智慧水库边缘计算技术路线与框架设计
  • C++五子棋
  • javaSE 6
  • AI使能的SVD算子:基于深度学习的矩阵分解方法
  • connect系统调用及示例
  • 数字化转型 - 企业数字化建设的几点思考
  • sqli-labs通关笔记-第21关 字符型Header-Cookie SQL注入(单引号括号闭合 base64编码绕过 手工注入+脚本注入两种方法)
  • Oracle 11g RAC数据库实例重启的两种方式
  • Linux权限机制:RUID/EUID/SUID与进程安全
  • 服务器之光:Nginx--核心配置详解及演练
  • 【AI论文】MiroMind-M1:通过情境感知多阶段策略优化实现数学推理的开源新进展
  • Golang语言基础—函数调用
  • Spring Cloud Gateway:微服务架构下的 API 网关详解
  • Java,八股,cv,算法——双非研0四修之路day16
  • PYTHON从入门到实践-16数据视图化展示
  • Docker的简单使用