首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MongoDB高并发实践优化之MongoDB运行启动一定要配合systemd以systemctl来启动运行-卓伊凡|贝贝|莉莉

MongoDB高并发实践优化之MongoDB运行启动一定要配合systemd以systemctl来启动运行-卓伊凡|贝贝|莉莉

原创
作者头像
卓伊凡
发布2025-07-26 21:49:39
发布2025-07-26 21:49:39
15400
代码可运行
举报
运行总次数:0
代码可运行

MongoDB高并发实践优化之MongoDB运行启动一定要配合systemd以systemctl来启动运行-卓伊凡|贝贝|莉莉

引言

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

其实本篇讲解的是基础 安装systemd 以及MongoDB 的关系

但是 我们的报错 是 检查 服务状态,提示 sudo systemctl status mongod ● mongod.service - MongoDB Database Server Loaded: loaded (/etc/systemd/system/mongod.service; enabled; preset: disabled) Active: activating (auto-restart) (Result: exit-code) since Wed 2025-07-23 21:58:59 CST; 2s ago Docs: https://docs.mongodb.org/manual Process: 245870 ExecStart=/opt/mongodb-3.4.0/bin/mongod —config /opt/mongodb-3.4.0/mongo.conf (code=exited, status=100) Main PID: 245870 (code=exited, status=100) Tasks: 62 (limit: 403159) Memory: 86.3M CPU: 27ms CGroup: /system.slice/mongod.service └─245321 /opt/mongodb-3.4.0/bin/mongod —config /opt/mongodb-3.4.0/mongo.conf 是否成功

这个反应的 是更多的问题,当然下篇讲

根据最新的状态输出,MongoDB 服务 仍然未能成功启动。状态显示为 activating (auto-restart) 且退出码为 status=100,表明 MongoDB 在启动过程中遇到了 存储引擎初始化失败数据文件损坏 的问题。

关键问题分析

  1. 错误码 100:这是 MongoDB 特有的错误码,表示存储引擎(如 WiredTiger)无法正常初始化。
  2. 数据文件问题:可能由于之前的异常关闭导致数据文件损坏,或权限不足无法访问。
  3. 资源限制:系统资源(如内存、磁盘空间)不足,或配置参数与实际环境不匹配。

Systemd 与 MongoDB 的深度解析

一、Systemd 与 Linux 系统的关系

Systemd 是现代 Linux 系统的初始化系统和服务管理器,它取代了传统的 SysV init 系统,具有以下核心特性:

  1. 系统启动管理
    • 并行启动服务(相比 SysV init 的顺序启动大幅提高启动速度)
    • 精确控制服务启动顺序(通过依赖关系定义)
  2. 服务生命周期管理
    • 提供标准化的服务控制接口(start/stop/restart/status)
    • 支持服务自动重启和故障恢复
  3. 高级功能
    • 日志管理(通过 journald)
    • 挂载点管理
    • 用户会话管理
    • 定时任务管理
  4. 与 Linux 内核的深度集成
    • 利用 cgroups 跟踪和管理进程
    • 使用 inotify 监控文件和目录变化
    • 通过 socket 激活实现按需启动服务

二、为什么使用 Systemd 管理 MongoDB

  1. 标准化管理
    • 统一的服务管理接口(与其他系统服务一致)
    • 摆脱不同发行版之间服务管理方式的差异
  2. 可靠性增强
    • 自动重启崩溃的服务进程
    • 精确控制资源限制(CPU/内存等)
  3. 日志集成
    • 通过 journalctl 集中查看日志
    • 结构化日志记录(带元数据)
  4. 安全特性
    • 沙箱限制(可配置服务运行环境)
    • 用户权限隔离
  5. 性能优势
    • 并行启动加速服务初始化
    • 按需启动减少资源占用

三、Systemd 单元文件解析(MongoDB 示例)

典型的 MongoDB systemd 单元文件(/lib/systemd/system/mongod.service):

代码语言:javascript
代码运行次数:0
运行
复制
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongodb
Group=mongodb
Environment="OPTIONS=--quiet -f /etc/mongod.conf"
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/lib/mongodb
ExecStartPre=/usr/bin/chown mongodb:mongodb /var/lib/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/lib/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongod.pid
# 文件描述符限制
LimitNOFILE=64000
LimitNPROC=64000
# 核心转储配置
LimitCORE=infinity
# 进程特性
PrivateTmp=true
# 重启策略
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

四、MongoDB 的 Systemd 管理命令

1. 启动 MongoDB 服务

代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl start mongod

底层原理

  • systemd 解析单元文件
  • 按顺序执行 ExecStartPre 指令
  • 以指定用户身份执行 ExecStart
  • 将进程纳入 cgroups 管理

2. 停止 MongoDB 服务

代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl stop mongod

底层过程

  1. 发送 SIGTERM 信号
  2. 等待默认超时(DefaultTimeoutStopSec,通常90秒)
  3. 若未停止则发送 SIGKILL

3. 重启服务

代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl restart mongod

等效于

代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl stop mongod
sudo systemctl start mongod

由于我已经全部处理好了 因此 现在 我可以直接执行查看

4. 重载配置(不中断服务)

代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl reload mongod

5. 查看服务状态

代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl status mongod

典型输出解析

代码语言:javascript
代码运行次数:0
运行
复制
● mongod.service - MongoDB Database Server
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2025-07-25 16:00:00 CST; 2h ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 1234 (mongod)
    Tasks: 28 (limit: 4915)
   Memory: 1.2G
   CGroup: /system.slice/mongod.service
           └─1234 /usr/bin/mongod --quiet --config /etc/mongod.conf

6. 启用开机自启

代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl enable mongod

7. 禁止开机自启

代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl disable mongod

五、高级管理技巧

  1. 日志查看
代码语言:javascript
代码运行次数:0
运行
复制
journalctl -u mongod -f  # 实时日志
journalctl -u mongod --since "2025-07-25 16:00:00"  # 时间范围查询
  1. 资源限制调整
代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl edit mongod

添加:

代码语言:javascript
代码运行次数:0
运行
复制
[Service]
LimitNOFILE=128000
  1. 启动参数调试
代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl stop mongod
sudo /usr/bin/mongod --config /etc/mongod.conf --verbose
  1. 安全沙箱配置
代码语言:javascript
代码运行次数:0
运行
复制
[Service]
ProtectSystem=full
PrivateDevices=true
NoNewPrivileges=true

六、与传统 init 系统的对比

特性

Systemd

SysV init

启动速度

快(并行启动)

慢(顺序启动)

服务依赖

精确控制

简单排序

资源管理

cgroups 集成

日志系统

结构化日志(journald)

文本日志

状态监控

实时状态查询

仅运行/停止状态

配置复杂度

集中配置(.service)

分散的init脚本

七、故障排查指南

  1. 服务启动失败
代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl status mongod
journalctl -xe
  1. 端口冲突检查
代码语言:javascript
代码运行次数:0
运行
复制
sudo netstat -tulnp | grep 27017
  1. 配置文件验证
代码语言:javascript
代码运行次数:0
运行
复制
sudo mongod --config /etc/mongod.conf --fork --logpath /var/log/mongodb/validate.log
  1. 数据目录权限
代码语言:javascript
代码运行次数:0
运行
复制
复制sudo chown -R mongodb:mongodb /var/lib/mongodb

systemd 管理 MongoDB 提供了现代 Linux 系统下的标准化、可靠的服务管理方案

以前的 启动命令 方式 为 sh stop sh start 是错的 至少是不严谨的 至少 在我们本次商业实战中是不行的

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB高并发实践优化之MongoDB运行启动一定要配合systemd以systemctl来启动运行-卓伊凡|贝贝|莉莉
  • 引言
    • 关键问题分析
  • Systemd 与 MongoDB 的深度解析
    • 一、Systemd 与 Linux 系统的关系
    • 二、为什么使用 Systemd 管理 MongoDB
    • 三、Systemd 单元文件解析(MongoDB 示例)
    • 四、MongoDB 的 Systemd 管理命令
      • 1. 启动 MongoDB 服务
      • 2. 停止 MongoDB 服务
      • 3. 重启服务
      • 4. 重载配置(不中断服务)
      • 5. 查看服务状态
      • 6. 启用开机自启
      • 7. 禁止开机自启
    • 五、高级管理技巧
    • 六、与传统 init 系统的对比
    • 七、故障排查指南
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档