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

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 ]; thenecho "! ALERT: Resource threshold exceeded !"# 自动触发连接回收mongo --eval "db.adminCommand({replSetReconfig: {}, force: true})"
fi
sleep 30
done
  1. 日志分析命令:
    ```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. **硬件资源核查**:```bashfree -h       # 内存总量df -h         # 磁盘空间top -o %MEM   # 实时内存占用
  1. 连接来源分析
db.currentOp(true).inprog.forEach(function(op) { print(op.client + " => " + op.opid + " running " + op.secs_running + "s") }
)
  1. 索引健康检查
db.getCollectionNames().forEach( function(coll) {print("Checking indexes for: " + coll);db[coll].getIndexes().forEach(printjson);
});

终极建议

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

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

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

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

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

http://www.lryc.cn/news/595962.html

相关文章:

  • stream流入门
  • 企业知识库软件选型与实践指南
  • LINUX 722 逻辑卷快照
  • useState
  • 3.4 安全-分布式-数据库-挖掘
  • Java并发编程:JUC核心组件全解析
  • IMU(LSM6DSMTR+LIS2MDLTR)
  • 隧道代理与普通代理:一场网络隐身术的“智能革命”
  • 开发者的AI认知指南:用大模型重新理解人工智能(上)
  • 基于AutoJawSegment项目的CBCT图像分割实践指南
  • Qt开发环境搭建全攻略(Windows+Linux+macOS)
  • Navicat 远程连接SQLlite数据库
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页-微博基本信息实现
  • DearMom以“新生儿安全系统”重塑婴儿车价值,揽获CBME双项大奖
  • 数据库隔离级别
  • 在vscode 使用 remote-ssh
  • Vue3 面试题及详细答案120道(16-30 )
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现持械检测(C#代码,UI界面版)
  • 【Altium Designer2025】电子设计自动化(EDA)软件——Altium Designer25版保姆级下载安装详细图文教程(附安装包)
  • ob导出租户所有表记录
  • SpringBoot--Mapper XML 和 Mapper 接口在不同包
  • C++中的list(2)简单复现list中的关键逻辑
  • 文本分类与情感分析Python实战
  • liunx运维进阶脚本
  • 2025.7.25论文阅读
  • VUE2 项目学习笔记 ? 语法 v-if/v-show
  • 为何在 Vue 的 v-model 指令中不能使用可选链(Optional Chaining)?
  • 【Spring Boot】Spring Boot循环依赖破解:@Lazy与Setter注入的取舍指南(流程图修复版)
  • JavaWeb学习打卡10(HttpServletRequest详解应用、获取参数,请求转发实例)
  • 分布在内侧内嗅皮层(MEC)的边界细胞对NLP中的深层语义分析的积极影响和启示