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.pswp.cn/diannao/93110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93110.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VUE懶加載(4種方式)

第一種 使用 Webpack 的動態導入(Dynamic Imports)第二種 Vue Router 中的懶加載第三種 使用第三方庫第四種 使用 Vuex 進行異步數據加載雖然不是直接的懶加載,但你可以在組件內部或 Vuex store 中使用異步 action 來加載數據,確保…

【ROS1】09-ROS通信機制——參數服務器

目錄 一、參數服務器概念 二、參數操作 2.1 C實現 2.1.1 新增參數 2.1.2 修改參數 2.1.3 查詢參數 2.1.4 刪除參數 2.2 python實現 2.2.1 新增參數 2.2.2 修改參數 2.2.3 查詢參數 2.2.4 刪除參數 一、參數服務器概念 假設正在開發一個復雜的機器人應用&#xff0…

C#.NET dapper 詳解

簡介 Dapper 是由 Stack Overflow 團隊開發的一個簡單、高性能的微型 ORM(Object?Relational Mapper),僅幾千行代碼,依賴于 ADO.NET 的 IDbConnection,通過動態生成 IL 來映射結果到實體對象。 與 EF、NHibernate 這類…

【LeetCode 熱題 100】35. 搜索插入位置——二分查找(左閉右開)

Problem: 35. 搜索插入位置 給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 文章目錄整體思路完整代碼時空復雜度時間…

Python-初學openCV——圖像預處理(四)——濾波器

目錄 一、圖像噪點消除噪聲: 1、概念 2、均值濾波 3、方框濾波 4 、高斯濾波 5、中值濾波 6、雙邊濾波 7、總結 一、圖像噪點消除噪聲: 1、概念 指圖像中的一些干擾因素,通常是由圖像采集設備、傳輸信道等因素造成的,表現…

嵌入式系統可靠性設計

嵌入式系統可靠性設計硬件件可靠性設計1. 硬件設計原則2. 硬件設計注意問題2.1 引腳布局和走線2.2 元器件選擇和布局2.3 電源和地線分離2.4 EMI/EMC設計2.5 系統可靠性2.6 資源利用和擴展性軟件可靠性設計1. 設計原則1.1 模塊化設計1.2 冗余設計1.3 容錯設計1.4 實時性保障1.5 …

cJSON在STM32單片機上使用遇到解析數據失敗問題

我們在單片機上解析JSON格式時(比如在用云平臺物聯網開發時),可以直接使用cJson庫來完成自己的操作,而不需要單獨實現,具體使用方法可以搜一下。 cJson:一個基于 C 語言的 Json 庫,它是一個開源…

python3基礎語法梳理(三)

接上一篇博客 🎮 猜數字小游戲 - Python版 🧠 游戲規則: 系統隨機生成一個 1 到 10 的整數玩家輸入猜測的數字使用 if 語句判斷玩家猜得是否正確提示“猜對了”或“太大/太小了” import randomsecret_number random.randint(1, 10) att…

【docker】將已有mysql腳本導入鏡像內使用

準備SQL腳本將SQL腳本(如init.sql)放在宿主機目錄下,例如:/path/to/sql-scripts/init.sql啟動MySQL容器并掛載腳本使用 -v 參數將SQL腳本掛載到容器的初始化目錄:docker run --name mysql-container \-e MYSQL_ROOT_PA…

【機器學習深度學習】LLamaFactory微調效果與vllm部署效果不一致如何解決

目錄 前言 一、問題本質 1.1 問題說明 1.2 問題本質示意 二、常見原因 LLaMAFactory對話模板規則定義 模型對話模板定義規則 三、解決方法 提取代碼myset.py 創建jinja文件 安裝VLLM 運行VLLM 安裝運行open webui流程 四、流程梳理 前言 本文主要講述的主要內容…

Python入門構建網頁

用純 Python 構建 Web 應用 本教程將帶你從零開始,構建一個交互式的待辦事項清單。 fasthtml 的核心哲學是“回歸初心,大道至簡”。在當今復雜的前后端分離技術棧中 ,它提供了一條返璞歸真的路徑,旨在讓你能用純粹的 Python 構建從…

開源 Arkts 鴻蒙應用 開發(九)通訊--tcp客戶端

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發,公司安排開發app,臨時學習,完成app的開發。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。 相關鏈接: 開源 Arkts …

Go的defer和recover

在 Go 語言中,defer 和 recover 是兩個緊密相關的關鍵字,主要用于錯誤處理和資源清理。它們通常一起使用,特別是在處理panic(運行時崩潰)時,確保程序不會直接崩潰,而是能夠優雅地恢復并繼續執行…

Spring Boot 配置文件常用配置屬性詳解(application.properties / application.yml)

前言 Spring Boot 的一大優勢就是通過簡單的配置文件即可快速定制應用行為,而無需編寫大量 XML 配置或 Java 代碼。Spring Boot 使用 application.properties 或 application.yml 作為核心配置文件,支持豐富的配置屬性。 本文將詳細介紹 Spring Boot 常用…

uni-appDay02

1.首頁-通用輪播組件 輪播圖組件需要再首頁和分類頁使用&#xff0c;封裝成通用組件 準備組件自動導入組件 <script setup lang"ts"> import XtxSwiper from /components/XtxSwiper.vue import CustomNavbar from ./components/CustomNavbar.vue </scrip…

FastAPI入門:請求體、查詢參數和字符串校驗、路徑參數和數值校驗

請求體 FastAPI 使用請求體從客戶端&#xff08;例如瀏覽器&#xff09;向 API 發送數據。請求體是客戶端發送給 API 的數據。響應體是 API 發送給客戶端的數據。 使用 Pydantic 模型聲明請求體&#xff0c;能充分利用它的功能和優點 from fastapi import FastAPI from pydanti…

Docker的docker-compose類比Spring的ApplicationContext

總一句話是&#xff1a;Docker Compose&#xff1a;集中化管理多個容器及其依賴的資源環境&#xff1b;ApplicationContext&#xff1a;集中化管理 多個Bean 及其運行所需的資源和依賴關系。 1. 整體概念 Docker Compose&#xff1a;用于定義和運行多容器 Docker 應用程序&…

Reason-before-Retrieve(CVPR 2025)

研究方向&#xff1a;Image Captioning論文全名&#xff1a;《Reason-before-Retrieve: One-Stage Reflective Chain-of-Thoughts for Training-Free Zero-Shot Composed Image Retrieval》1. 論文介紹組合圖像檢索&#xff08;CIR&#xff09;旨在檢索與參考圖像密切相似的目標…

Idefics2:構建視覺-語言模型時,什么是重要的

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" Idefics2&#xff1a;構建視覺-語言模型時&#xff0c;什么是重要的 摘要 隨著large language models和vision transformers的進步&#xff0c;視覺-語言模型&#xff08;VLMs&#xff09;受到了越來越多的關注…

再談fpga開發(fpga調試方法)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】我們之前在學校學習c、c的時候&#xff0c;其實學校漏掉了很重要的一個教學環節&#xff0c;那就是調試、測試。很多時候我們代碼寫出來了&#xff…