MongoDB數據庫詳解-針對大型分布式項目采用的原因以及基礎原理和發展-卓伊凡|貝貝|莉莉

MongoDB數據庫詳解-針對大型分布式項目采用的原因以及基礎原理和發展-卓伊凡|貝貝|莉莉

由于老產品即時通訊私有化軟件就是采用MongoDB ,但是版本實在太低,要做大更新,其次針對10年前完美運營的項目來到10年后的現在就不一定行,優雅草卓伊凡最近一直在研究,同事們都忙著開發,但是疑難問題一直比較難處理,最近兩周多一直在花時間處理數據庫的問題。

MongoDB 簡介

MongoDB 是一款開源的 NoSQL 文檔型數據庫,由 MongoDB Inc.(原 10gen 公司)開發并維護。它采用 BSON(Binary JSON) 格式存儲數據,支持動態模式(Schema-less),適用于處理非結構化或半結構化數據,如社交網絡、物聯網(IoT)、實時分析等場景。

MongoDB 的推出公司

MongoDB 由 Dwight Merriman、Eliot Horowitz 和 Kevin Ryan(DoubleClick 創始團隊)于 2007 年 創立,最初是為了解決傳統關系型數據庫在 可擴展性靈活性 方面的不足。

  • 2009 年,MongoDB 1.0 正式發布,并開源。
  • 2013 年,公司更名為 MongoDB Inc.,并推出商業版本 MongoDB Enterprise Advanced
  • 2017 年,MongoDB 在納斯達克上市,并推出 MongoDB Atlas(全托管云數據庫服務)。


MongoDB 發展史(版本演進)

MongoDB 自 2009 年發布以來,經歷了多個重要版本迭代,以下是關鍵版本及其特性:

版本

發布時間

主要改進

1.0

2009.02

首個正式版本,支持基本查詢功能

2.0

2010.08

引入 分片(Sharding)副本集(Replica Set)

3.0

2015.03

引入 WiredTiger 存儲引擎,大幅提升寫入性能

4.0

2018.06

支持 多文檔 ACID 事務(跨集合事務)

5.0

2021.07

新增 時間序列集合(Time Series Collections)

6.0

2022.07

支持 加密數據查詢

7.0

2023.11

優化 分布式事務性能查詢引擎

您的項目使用的是 MongoDB 3.4.0(2016年發布),該版本已 停止維護,存在以下問題:

  • 存儲引擎落后:默認使用 MMAPv1(已被 WiredTiger 取代,3.0+ 支持)。
  • 無事務支持:4.0 之前僅支持單文檔原子操作,無法保證跨文檔一致性。
  • 安全漏洞:舊版本存在未授權訪問等風險。

建議升級至 MongoDB 6.0+,以獲取:
? 更高效的 WiredTiger 存儲引擎
? 完整 ACID 事務支持
? 更好的分片與副本集管理


MongoDB 相比其他數據庫的優勢

1. 靈活的數據模型(Schema-less)

  • 無需預定義表結構,可動態增減字段,適合快速迭代的業務(如即時通訊消息存儲)。
  • 支持 嵌套文檔數組,減少關聯查詢(如聊天記錄可直接嵌入用戶文檔)。

2. 高性能讀寫

  • WiredTiger 引擎 提供高效的 壓縮存儲內存映射,比 MySQL 等關系型數據庫寫入更快。
  • 索引優化:支持 地理空間索引、全文索引,適合即時通訊的“附近的人”功能。

3. 高可擴展性(分片+副本集)

  • 水平擴展(Sharding):數據可分布到多臺服務器,適合 蜻蜓I水銀版 的高并發需求。
  • 自動故障轉移(Replica Set):主節點宕機時,從節點自動接管,保障服務連續性。

4. 適合即時通訊場景

  • 消息存儲:聊天記錄可存儲為 JSON 文檔,支持 消息狀態(已讀/未讀)、撤回、歷史記錄查詢
  • 在線狀態管理:利用 TTL 索引 自動清理離線用戶數據。
  • 群組聊天:嵌套文檔可存儲成員列表、權限等復雜結構。

MongoDB 在蜻蜓I水銀版即時通訊中的應用建議

1. 數據結構設計

// 用戶文檔
{"_id": "user123","name": "Alice","status": "online","chats": [{ "chatId": "room1", "lastRead": "2025-07-22T10:00:00Z" }]
}// 聊天室文檔
{"_id": "room1","members": ["user123", "user456"],"messages": [{ "sender": "user123", "text": "Hello!", "timestamp": "2025-07-22T10:00:00Z" }]
}

2. 升級建議

  1. 備份數據:使用 mongodump 導出舊數據。
  2. 部署新版本(如 MongoDB 6.0),并測試兼容性。
  3. 優化索引:對 messages.timestampuser.status 等高頻查詢字段建立索引。

3. 性能調優

  • 啟用 WiredTiger 壓縮snappyzstd)減少存儲占用。
  • 使用 Change Streams 監聽消息實時變更,替代輪詢查詢。

總結

  • MongoDB 由 MongoDB Inc. 推出,適用于 靈活、高并發的場景(如即時通訊)。
  • 3.4.0 版本已過時,建議升級至 6.0+ 以獲取事務、安全性和性能優化。
  • 相比 MySQL,MongoDB 在 Schema 靈活性、水平擴展、嵌套數據存儲 方面更具優勢,但 復雜關聯查詢 稍弱。

如需進一步優化 蜻蜓I水銀版 的 MongoDB 部署,可參考 MongoDB Atlas(云托管方案)或 分片集群 架構。

但是目前騰訊云而言MongoDB的數據庫版本最低都得4.0,因此升級迫在眉睫

MongoDB 運行原理詳解

MongoDB 是一個開源的、面向文檔的 NoSQL 數據庫,采用 BSON(二進制 JSON)格式存儲數據,具有高性能、高可擴展性和靈活的數據模型。以下是其核心運行原理:

1. 數據模型與存儲結構
  • 文檔(Document):MongoDB 的基本數據單元,類似于關系型數據庫中的行,但更靈活(如字段可動態添加、數據類型可變化)。
  • 集合(Collection):一組相關的文檔,類似于關系型數據庫中的表,但無需預定義模式。
  • BSON 存儲:文檔以 BSON 格式存儲在磁盤上,支持嵌套結構、數組和二進制數據,便于高效讀寫。
  • 索引:MongoDB 支持多種索引類型(如單字段、復合、文本、地理空間),提升查詢效率。
2. 核心組件與架構
  • mongod 進程:MongoDB 的核心服務進程,負責處理數據請求、管理數據文件和維護索引。
  • 內存管理
    • 使用系統虛擬內存(mmap)管理數據文件,依賴操作系統的頁面緩存(Page Cache)提高讀寫性能。
    • WiredTiger 存儲引擎支持壓縮和內存控制(通過 cache_size 參數)。
  • 存儲引擎
    • WiredTiger(默認):支持文檔級鎖、壓縮和高性能寫入。
    • MMAPv1(舊版):基于內存映射文件,支持表級鎖,已逐步淘汰。
3. 讀寫操作流程
  • 讀操作
    1. 客戶端發送查詢請求到 mongod。
    2. mongod 檢查查詢是否可通過索引完成,若否則進行全表掃描。
    3. 從內存(Page Cache)或磁盤讀取數據,返回 BSON 格式結果。
  • 寫操作
    1. 客戶端發送寫入請求(如 insert, update)。
    2. mongod 驗證數據有效性,應用寫入操作。
    3. 寫入操作記錄到預寫日志(WiredTiger 的 journal)確保原子性。
    4. 定期將內存中的臟數據刷新到磁盤(檢查點機制)。
4. 高可用性與復制
  • 副本集(Replica Set)
    • 一組維護相同數據集的 mongod 實例,包含一個主節點(Primary)和多個從節點(Secondary)。
    • 主節點處理所有寫操作,從節點通過 oplog(操作日志)同步數據。
    • 自動故障轉移:當主節點故障時,從節點通過選舉機制選出新的主節點。
  • 讀寫分離:客戶端可選擇從從節點讀取數據,減輕主節點壓力。
5. 水平擴展與分片
  • 分片集群(Sharded Cluster)
    • 分片(Shards):存儲實際數據的節點或副本集。
    • 配置服務器(Config Servers):存儲集群元數據(如分片鍵、數據分布)。
    • 路由進程(mongos):客戶端與集群的接口,負責請求路由和結果合并。
  • 分片策略
    • 哈希分片:基于哈希值均勻分布數據。
    • 范圍分片:基于鍵的范圍劃分數據。
6. 事務處理
  • MongoDB 從 4.0 版本開始支持多文檔事務(在副本集或分片集群中)。
  • 事務保證 ACID 特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。
  • 適用于需要跨文檔或跨集合的原子操作場景。

MongoDB 安裝方法

以下介紹在主流 Linux 系統和 macOS 上安裝 MongoDB 的步驟。

1. 在 Ubuntu/Debian 上安裝
# 導入 MongoDB 官方 GPG 密鑰
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -# 添加 MongoDB 軟件源
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# 更新包列表并安裝 MongoDB
sudo apt-get update
sudo apt-get install -y mongodb-org# 啟動并設置開機自啟
sudo systemctl start mongod
sudo systemctl enable mongod# 驗證安裝
mongo --version
2. 在 CentOS/RHEL 上安裝
# 創建 MongoDB 配置文件
sudo tee /etc/yum.repos.d/mongodb-org-6.0.repo <<EOF
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
EOF# 安裝 MongoDB
sudo yum install -y mongodb-org# 啟動并設置開機自啟
sudo systemctl start mongod
sudo systemctl enable mongod# 驗證安裝
mongo --version
3. 在 macOS 上安裝(使用 Homebrew)
# 安裝 Homebrew(如果未安裝)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"# 添加 MongoDB 源
brew tap mongodb/brew# 安裝 MongoDB 社區版
brew install mongodb-community@6.0# 啟動 MongoDB 服務
brew services start mongodb-community@6.0# 驗證安裝
mongosh --version
4. 安裝后的基本配置
  1. 配置文件位置
    • Linux:/etc/mongod.conf
    • macOS:/usr/local/etc/mongod.conf
  1. 重要配置參數
systemLog:destination: filepath: /var/log/mongodb/mongod.log  # 日志路徑logAppend: true
storage:dbPath: /var/lib/mongo  # 數據文件路徑journal:enabled: true
net:port: 27017bindIp: 0.0.0.0  # 監聽所有IP,生產環境建議改為具體IP
  1. 啟動/停止服務
# Linux
sudo systemctl start mongod    # 啟動
sudo systemctl stop mongod     # 停止
sudo systemctl restart mongod  # 重啟# macOS(使用 Homebrew)
brew services start mongodb-community@6.0
brew services stop mongodb-community@6.0
5. 連接與驗證
# 連接到 MongoDB 服務
mongosh# 在 shell 中驗證
> db.version()  # 查看版本
> db.createCollection("test")  # 創建集合
> db.test.insertOne({name: "MongoDB"})  # 插入文檔
> db.test.find()  # 查詢文檔
6. 生產環境注意事項
  1. 啟用身份驗證
# 在 mongod.conf 中添加
security:authorization: enabled

創建管理員用戶:

use admin
db.createUser({user: "admin",pwd: "password",roles: ["root"]
})
  1. 禁用遠程匿名訪問
# 將 bindIp 改為服務器實際 IP 或 127.0.0.1
net:bindIp: 127.0.0.1
  1. 配置防火墻
# Ubuntu/Debian
sudo ufw allow 27017/tcp# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=27017/tcp
sudo firewall-cmd --reload
  1. 數據備份
# 使用 mongodump 備份
mongodump --out /backup/mongodb/$(date +%Y%m%d)# 使用 mongorestore 恢復
mongorestore /backup/mongodb/20250722

總結

MongoDB 的靈活數據模型和分布式架構使其適合高并發、大數據量的應用場景。安裝時需根據實際需求調整配置,生產環境中尤其要關注安全、性能和高可用性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90209.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90209.shtml

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

相關文章

Kotlin 中的單例模式(Singleton)與對象聲明

在 Kotlin 中&#xff0c;類描述的是一種通用結構&#xff0c;可以多次實例化&#xff0c;也可以用多種方式實例化。但有時我們只需要單個實例&#xff0c;不多不少。單例模式能幫你更好地組織代碼&#xff0c;把相關的方法聚合在一起。 單例模式是什么&#xff1f; 單例模式是…

Shell 編程基礎入門從認識到實戰

對于剛接觸 Linux 或 Unix 系統的開發者來說&#xff0c;Shell 腳本往往是自動化操作的第一道門檻。它不像 Python 那樣語法簡潔&#xff0c;也不像 Java 那樣有完善的面向對象體系&#xff0c;但卻能以極少的代碼實現強大的系統管理功能。本文將從 Shell 的基本概念講起&#…

混合遺傳粒子群算法在光伏系統MPPT中的應用研究

混合遺傳粒子群算法在光伏系統MPPT中的應用研究 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家&#xff0c;覺得好請收藏。點擊跳轉到網站。 摘要 本文針對光伏系統最大功率點跟蹤(MPPT)問題&#xff0…

機器視覺的布料絲印應用

在紡織印染行業&#xff0c;布料絲印工藝的精度直接決定產品外觀質量與市場競爭力。傳統絲印設備依賴機械定位與人工校準&#xff0c;面對高密度圖案、柔性面料或復雜紋理時&#xff0c;易出現套色偏移、油墨滲透不均等問題&#xff0c;導致良品率波動與生產成本攀升。 隨著機…

前端常用類庫

常用類庫 類庫作用 類庫可以幫助我們快速實現項目業務的開發與功能的實現, 幫助我們解放勞動力提高生產效率, 前端中的類庫與框架都是由原生javascript編寫, 提供給其他開發者應用于某一業務環境或者需求。一般有開發者/團隊開源維護. 優秀的類庫需要具備高度封裝可用, 穩定, …

通俗易懂循環神經網絡(RNN)指南

本文用直觀類比、圖表和代碼&#xff0c;帶你輕松理解RNN及其變體&#xff08;LSTM、GRU、雙向RNN&#xff09;的原理和應用。什么是循環神經網絡 循環神經網絡&#xff08;Recurrent Neural Network, RNN&#xff09;是一類專門用于處理序列數據的神經網絡。與前饋神經網絡不同…

【SVM】支持向量機實例合集

基于Java的SVM(支持向量機)實例合集 以下是一個基于Java的SVM(支持向量機)實例合集,包含核心代碼示例和應用場景說明。這些例子基于流行的機器學習庫(如LIBSVM、Weka、JSAT)實現。 數據準備與加載 使用LIBSVM格式加載數據集: // 加載LIBSVM格式數據 svm_problem pr…

Python100個庫分享第38個—lxml(爬蟲篇)

目錄專欄導讀&#x1f4da; 庫簡介&#x1f3af; 主要特點&#x1f6e0;? 安裝方法Windows安裝Linux/macOS安裝驗證安裝&#x1f680; 快速入門基本使用流程HTML vs XML解析&#x1f50d; 核心功能詳解1. XPath選擇器2. CSS選擇器支持3. 元素操作&#x1f577;? 實戰爬蟲案例…

imx6ull-系統移植篇17——linux頂層 Makefile(上)

目錄 前言 頂層 Makefile 源碼簡析 版本號 MAKEFLAGS 變量 命令輸出 靜默輸出 設置編譯結果輸出目錄 代碼檢查 模塊編譯 設置目標架構和交叉編譯器 調用 scripts/Kbuild.include 文件 交叉編譯工具變量設置 頭文件路徑變量 導出變量 make xxx_defconfig 過程 …

OpenCV 官翻6 - Computational Photography

文章目錄圖像去噪目標理論OpenCV中的圖像去噪1、cv.fastNlMeansDenoisingColored()2、cv.fastNlMeansDenoisingMulti()附加資源圖像修復目標基礎概念代碼補充資源練習高動態范圍成像&#xff08;HDR&#xff09;目標理論基礎曝光序列HDR1、將曝光圖像加載到列表中2、將曝光序列…

APT32F1732RBT8愛普特微電子 32位MCU國產芯片 智能家居/工業控制 首選

APT32F1732RBT8 愛普特微電子&#xff0c;32位MCU國產芯片一、產品簡介APT32F1732RBT8 是愛普特微電子&#xff08;APT&#xff09;推出的高性能32位ARM Cortex-M0內核MCU&#xff0c;主頻高達48MHz&#xff0c;內置64KB Flash8KB RAM&#xff0c;專為智能家居、工業控制、消費…

Smart Tomcat

本篇博客的內容是教你借助idea中的插件,把tomcat集成到idea中安裝 Smart Tomcat 插件搜索下載 ,如果一直處于加載界面,就嘗試一下科學上網配置 Smart Tomcat 插件 點擊右上角的 "Add Configuration"選擇左側的 "Smart Tomcat" 在 Name 這一欄填寫一個名字(…

Linux_shell編寫

title: Linux_4 shell編寫 shell pwd (/root/A/2025_7/19/myshell) 首先需要設計命令行提示 &#xff08;MakeCommandLine()&#xff09; 首先獲取相關信息 getenv(“name”) // 獲取用戶名 const char* GetUserName() {const char* name getenv("USER");if (name …

【數據結構】棧的深入解析--用C語言實現

文章目錄1.棧的概念2.棧的底層結構3.棧的功能4.棧的實現4.1.棧結構的定義4.2.棧的初始化4.3.棧的銷毀4.4.入棧4.5.出棧4.6.取棧頂元素4.7.獲取棧中有效元素個數5.完整代碼Stack.hStack.cmain.c運行結果1.棧的概念 是一種特殊的線性表&#xff0c;只允許數據在固定的一段進行插…

Git倉庫核心概念與工作流程詳解:從入門到精通

Git倉庫的基本概念版本庫&#xff08;Repository&#xff09;是Git的核心概念&#xff0c;你可以簡單理解為一個被Git管理的目錄。這個目錄里的所有文件都能被Git跟蹤&#xff0c;記錄每次修改和刪除&#xff0c;讓你可以隨時追溯歷史或在未來某個時刻"還原"文件。Gi…

Web開發 05

1 React庫&#xff08;人話詳解版&#xff09;別慌&#xff0c;React 剛接觸時是會有點懵&#xff0c;咱們用 “人話 類比” 一步步拆&#xff1a;核心概念先抓牢組件&#xff08;Component&#xff09;把它想成 “樂高積木”&#xff0c;比如做個社交 App&#xff0c;頂部導航…

RustDesk 自建中繼服務器教程(Mac mini)

&#x1f4d6; 教程目標 在家里的 Mac mini 上部署 RustDesk 中繼服務器 (hbbs hbbr)&#xff0c;讓你從辦公室、筆電或手機 低延遲、安全 地遠程控制家里的 Windows 和 Mac mini。 ? 不依賴第三方服務器 ? 支持 P2P 和中繼雙模式 ? 全流量可控、跨平臺 &#x1f3d7;? 架…

數據庫—修改某字段默認值

前言有時候&#xff0c;數據庫的字段默認值沒有正確設置&#xff0c;這時候需要改默認值。以下是我做的改默認值的記錄&#xff0c;希望對網友有所幫助。1.SQL SERVER下面的示例假設你要修改名為 YourColumnName 的字段&#xff0c;并為其設置一個新的默認值 NewDefaultValue。…

Spring快速整合Mybatis

MyBatis是一個優秀的持久層框架&#xff0c;Spring則是廣泛使用的Java應用框架。可以將兩者整合可以充分發揮各自的優勢。 1、Spring整合MyBatis的基本配置 添加依賴&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spri…

基于深度學習的語音識別:從音頻信號到文本轉錄

前言 語音識別&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能領域中一個極具挑戰性和應用前景的研究方向。它通過將語音信號轉換為文本&#xff0c;為人們提供了更加自然和便捷的人機交互方式。近年來&#xff0c;深度學習技術在語音識別領域取得了顯著…