MongoDB在Linux中的數據壓縮方法主要圍繞WiredTiger存儲引擎的內置壓縮功能及手動壓縮命令實現,以下是具體方案:
WiredTiger是MongoDB 3.2及以上版本的默認存儲引擎,支持塊級壓縮,可在存儲數據時直接減少磁盤空間占用,且不影響查詢性能(需權衡CPU負載)。
編輯MongoDB主配置文件(通常位于/etc/mongod.conf
),在storage.wiredTiger
section中設置collectionConfig.blockCompressor
參數,選擇壓縮算法(支持snappy
、zlib
、zstd
):
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根據服務器內存調整,避免占用過多內存
collectionConfig:
blockCompressor: zstd # 可選snappy(默認,平衡速度與壓縮比)、zlib(高壓縮比,高CPU消耗)、zstd(高性能壓縮,推薦)
保存后重啟MongoDB服務使配置生效:
sudo systemctl restart mongod
若不想修改配置文件,可在啟動mongod
時通過命令行參數直接指定壓縮算法:
mongod --dbpath /var/lib/mongodb --wiredTigerCollectionBlockCompressor zstd
此方式適用于臨時測試或無需持久化配置的場景。
連接到MongoDB shell,執行serverStatus
命令,查看wiredTiger.collectionStats
中的blockCompressor
字段,確認當前使用的壓縮算法:
mongo --eval 'db.runCommand({ serverStatus: 1 })'
輸出示例:
"storageEngine": {
"wiredTiger": {
"collectionStats": {
"your_collection_name": {
"options": {
"blockCompressor": "zstd" // 表示壓縮已啟用
}
}
}
}
}
WiredTiger的塊壓縮僅在新增數據時生效,對于已有數據(如頻繁更新、刪除后產生的碎片),需通過compact
命令重組數據文件并釋放未使用空間(不會縮小文件大小,但會整理碎片,后續可通過文件系統壓縮進一步釋放空間)。
mongo --eval 'db.getSiblingDB("your_database").runCommand({ compact: "your_collection" })'
mongo --eval 'db.getSiblingDB("your_database").runCommand({ compact: 1 })'
需使用admin數據庫權限:
mongo --eval 'db.adminCommand({ compactAllDatabases: 1 })'
注意事項:
compact
命令會消耗大量CPU和I/O資源,建議在低峰時段執行;若無法修改MongoDB配置或需要更極致的壓縮比,可使用Linux文件系統自帶的壓縮工具(如gzip
、btrfs
、zfs
)壓縮MongoDB數據目錄(/var/lib/mongodb
)。但此方法需停止MongoDB服務,且會影響讀寫性能(每次讀寫需解壓/壓縮),僅適用于歸檔場景。
gzip
為例):sudo systemctl stop mongod
sudo gzip -r /var/lib/mongodb
/var/lib/mongodb.gz
),但需修改應用連接配置,實際使用較少。通過上述方法,可根據業務需求選擇合適的壓縮策略,在存儲空間與性能之間取得平衡。