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. 升級建議
- 備份數據:使用
mongodump
導出舊數據。 - 部署新版本(如 MongoDB 6.0),并測試兼容性。
- 優化索引:對
messages.timestamp
、user.status
等高頻查詢字段建立索引。
3. 性能調優
- 啟用 WiredTiger 壓縮(
snappy
或zstd
)減少存儲占用。 - 使用 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. 讀寫操作流程
- 讀操作:
- 客戶端發送查詢請求到 mongod。
- mongod 檢查查詢是否可通過索引完成,若否則進行全表掃描。
- 從內存(Page Cache)或磁盤讀取數據,返回 BSON 格式結果。
- 寫操作:
- 客戶端發送寫入請求(如
insert
,update
)。 - mongod 驗證數據有效性,應用寫入操作。
- 寫入操作記錄到預寫日志(WiredTiger 的
journal
)確保原子性。 - 定期將內存中的臟數據刷新到磁盤(檢查點機制)。
- 客戶端發送寫入請求(如
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. 安裝后的基本配置
- 配置文件位置:
- Linux:
/etc/mongod.conf
- macOS:
/usr/local/etc/mongod.conf
- Linux:
- 重要配置參數:
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
- 啟動/停止服務:
# 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. 生產環境注意事項
- 啟用身份驗證:
# 在 mongod.conf 中添加
security:authorization: enabled
創建管理員用戶:
use admin
db.createUser({user: "admin",pwd: "password",roles: ["root"]
})
- 禁用遠程匿名訪問:
# 將 bindIp 改為服務器實際 IP 或 127.0.0.1
net:bindIp: 127.0.0.1
- 配置防火墻:
# Ubuntu/Debian
sudo ufw allow 27017/tcp# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=27017/tcp
sudo firewall-cmd --reload
- 數據備份:
# 使用 mongodump 備份
mongodump --out /backup/mongodb/$(date +%Y%m%d)# 使用 mongorestore 恢復
mongorestore /backup/mongodb/20250722
總結
MongoDB 的靈活數據模型和分布式架構使其適合高并發、大數據量的應用場景。安裝時需根據實際需求調整配置,生產環境中尤其要關注安全、性能和高可用性。