MongoDB频繁掉线频繁断开服务的核心原因以及解决方案-卓伊凡|贝贝|莉莉|糖果

MongoDB频繁掉线频繁断开服务的核心原因以及解决方案-卓伊凡|贝贝|莉莉|糖果

查看日志内容 :2025-07-22T17:05:20.216+0800 I CONTROL [initandlisten] MongoDB starting : pid=34231 port=28018 dbpath=/data/mongodb 64-bit host=VM-0-17-centos

2025-07-22T17:05:20.217+0800 I CONTROL [initandlisten] db version v3.4.0

2025-07-22T17:05:20.217+0800 I CONTROL [initandlisten] git version: f4240c60f005be757399042dc12f6addbc3170c1

2025-07-22T17:05:20.217+0800 I CONTROL [initandlisten] allocator: tcmalloc

2025-07-22T17:05:20.217+0800 I CONTROL [initandlisten] modules: none

2025-07-22T17:05:20.217+0800 I CONTROL [initandlisten] build environment:

2025-07-22T17:05:20.217+0800 I CONTROL [initandlisten] distarch: x86_64

2025-07-22T17:05:20.217+0800 I CONTROL [initandlisten] target_arch: x86_64

2025-07-22T17:05:20.217+0800 I CONTROL [initandlisten] options: { config: "/opt/mongodb-3.4.0/mongo.conf", net: { port: 28018 }, processManagement: { fork: true }, setParameter: { enableLocalhostAuthBypass: "false" }, storage: { dbPath: "/data/mongodb", journal: { enabled: true }, mmapv1: { smallFiles: true }, wiredTiger: { engineConfig: { configString: "cache_size=25G" } } }, systemLog: { destination: "file", logAppend: true, path: "/opt/mongodb-3.4.0/logs/mongodb.log" } }

这是查看日志得到的问题,

MongoDB 服务频繁崩溃的问题已经非常明确。以下是关键问题和解决方案:

核心问题诊断

  1. 致命版本问题
    • 您使用的是 MongoDB 3.4.0(2016年发布),该版本已停止支持7年
    • 旧版 WiredTiger 引擎有严重内存泄漏和索引处理缺陷
  1. 内存配置灾难
    • cache_size=25G 设置过高(日志显示实际分配了31GB)
    • 系统物理内存可能不足,导致 OOM Killer 强制终止进程
  1. 连接风暴
    • 26+ 个连接同时建立(来自Java客户端)
    • 连接池配置不当导致资源耗尽

紧急处理方案(立即执行)

1. 立即降低内存使用
复制代码
# 停止服务
sudo systemctl stop mongod

# 修改配置
sudo nano /opt/mongodb-3.4.0/mongo.conf

调整为:

复制代码
storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 4  # 必须小于可用物理内存的50%
2. 强制限制连接数
复制代码
# 在 mongo.conf 中添加
net:
  maxIncomingConnections: 50  # 紧急限制
3. 修复数据文件(每次崩溃后必须执行)
复制代码
mongod --dbpath /data/mongodb --repair --storageEngine wiredTiger

根治解决方案(必须实施)

1. 立即升级 MongoDB
复制代码
# 1. 备份数据
mongodump --host localhost --port 28018 -o /backup/mongodb_emergency

# 2. 安装MongoDB 6.0
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt update
sudo apt install -y mongodb-org

# 3. 数据迁移
mongorestore --host localhost --port 27017 /backup/mongodb_emergency
2. 关键系统优化
复制代码
# 禁用透明大页(立即生效+永久)
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
sudo bash -c 'echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local'
sudo bash -c 'echo "echo never > /sys/kernel/mm/transparent_hugepage/defrag" >> /etc/rc.local'

# 创建专用mongodb用户
sudo useradd -r -s /bin/false mongodb
sudo chown -R mongodb:mongodb /data/mongodb
3. 客户端连接池修正

Java应用需添加以下配置:

复制代码
MongoClientSettings settings = MongoClientSettings.builder()
    .applyToConnectionPoolSettings(builder -> {
        builder.maxSize(10)             // 最大连接数
              .minSize(1)               // 最小连接数
              .maxWaitTime(15000)       // 等待超时(毫秒)
              .maxConnectionLifeTime(1800000); // 连接存活时间
    })
    .build();

监控与稳定性保障

  1. 实时监控脚本(保存为monitor_mongo.sh):

    #!/bin/bash
    while true; do
    DATE=(date +%Y%m%d-%H%M%S) echo "[DATE] Monitoring..."
    CONNS=(mongo --eval "db.serverStatus().connections.current" | tail -1) MEM=(mongo --eval "db.serverStatus().mem.resident" | tail -1)
    echo " Connections: CONNS | Memory Usage: MEM MB"

    if [ CONNS -gt 40 ] || [ MEM -gt 8000 ]; then
    echo "! ALERT: Resource threshold exceeded !"

    自动触发连接回收

    mongo --eval "db.adminCommand({replSetReconfig: {}, force: true})"
    fi
    sleep 30
    done

  2. 日志分析命令:
    ```bash

检查崩溃记录

grep -A 20 -B 20 "aborting after invariant" /opt/mongodb-3.4.0/logs/mongodb.log

检查OOM记录

dmesg | grep -i "oom|kill"

复制代码
![](https://doc2.youyacao.com/server/index.php?s=/api/attachment/visitFile&sign=f80ab009bcd6f88c4768b0f7af3028e9)
### 后续检查清单

1. **硬件资源核查**:
   ```bash
   free -h       # 内存总量
   df -h         # 磁盘空间
   top -o %MEM   # 实时内存占用
  1. 连接来源分析

    db.currentOp(true).inprog.forEach(
    function(op) {
    print(op.client + " => " + op.opid + " running " + op.secs_running + "s")
    }
    )

  2. 索引健康检查

    db.getCollectionNames().forEach( function(coll) {
    print("Checking indexes for: " + coll);
    db[coll].getIndexes().forEach(printjson);
    });

终极建议

上述措施后问题仍然存在,说明数据文件可能已损坏,需要:

  1. 从备份恢复数据
  2. 考虑搭建副本集提高可用性
  3. 迁移到MongoDB Atlas托管服务

旧版本3.4.0的稳定性问题在社区中已有大量记录,继续使用将无法保证服务可靠性。

但是核心问题就是如果我们升级数据库带来的成本更高,并不是一时半会能搞定的,版本升级路线会面临更多挑战和问题。

用了这些临时治标方案都没解决问题,但是最终我们找到核心问题找了个替代方案能够临时顶一波

相关推荐
jianghx102416 小时前
Docker部署ES,开启安全认证并且设置账号密码(已运行中)
安全·elasticsearch·docker·es账号密码设置
IT小哥哥呀17 小时前
电池制造行业数字化实施
大数据·制造·智能制造·数字化·mom·电池·信息化
Xi xi xi17 小时前
苏州唯理科技近期也正式发布了国内首款神经腕带产品
大数据·人工智能·经验分享·科技
yumgpkpm17 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 、mysql数据库汇聚到Cloudera CDP7.3操作指南
大数据·数据库·mysql·华为·oracle·kafka·cloudera
UMI赋能企业18 小时前
制造业流程自动化提升生产力的全面分析
大数据·人工智能
TDengine (老段)19 小时前
TDengine 数学函数 FLOOR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
派可数据BI可视化21 小时前
商业智能BI 浅谈数据孤岛和数据分析的发展
大数据·数据库·数据仓库·信息可视化·数据挖掘·数据分析
jiedaodezhuti21 小时前
Flink性能调优基石:资源配置与内存优化实践
大数据·flink
阿里云大数据AI技术1 天前
云栖实录 | AI 搜索智能探索:揭秘如何让搜索“有大脑”
人工智能·搜索引擎
Lx3521 天前
Flink窗口机制详解:如何处理无界数据流
大数据