MongoDB3.0.6版本wiredtiger與MMAPv1引擎的寫入耗時對比
一、業務需求: 公司某個APP應用的資料庫已經實現了日誌與業務的垂直分割,將原有的一套RAC,拆分成兩套,目前資料庫暫時還比較穩定,伺服器負載也在正常範圍內,但是現有使用者數450萬,日活躍使用者達到100萬,每日日誌產生1000萬條記錄,100G的資料量,而目標使用者數接近1800萬,預估屆時的每日資料庫將達到6000萬/條,且需要滿足單條記錄查詢的需求,計劃採用MongoDB來替代Oracle RAC,現測試MongoDB WiredTiger引擎與MMAPv1引擎的寫入對比。 二、MongoDB3.0.x的版本特性(相對於MongoDB2.6及以下):
- 開源的儲存引擎;
- 支援多核CPU、充分利用記憶體/晶片層級緩衝(註:10月14日剛剛發布的3.0.7版本中,進一步改進了記憶體操作的效能);
- 基於B-TREE及LSM演算法;
- 提供文檔級鎖(document-level concurrency control),類似於關係型資料庫的的行級鎖;
- 支援檔案壓縮(其中snappy壓縮機制可以在5%的額外CPU消耗,減少70%的空間使用,也可以根據需要調節壓縮比例),三種壓縮類型:
- 不壓縮;
- Snappy壓縮:預設的壓縮方式, Snappy是在Google內部生產環境中被許多項目使用的壓縮庫,包括BigTable,MapReduce和RPC等,壓縮速度比Zlib快,但是壓縮處理檔案的大小會比Zlib大20%-100%, Snappy對於純文字的壓縮率為1.5-1.7,對於HTML是2-4,對於JPEG、PNG和其他已經壓縮過的資料壓縮率為1.0。在I7 i7 5500u 單核CPU測試中,壓縮效能可在200M/s-500M/s;
- Zlib壓縮: Z1ib是一個免費、通用、跨平台、不受任何法律阻礙的、無損的資料壓縮開發庫,相對於Snappy壓縮,消耗CPU效能高、壓縮速度慢,但是壓縮效果好。
- MMAPv1引擎(MongoDB2.6及以下版本用的是MMAP引擎):
- collection鎖(collection-level concurrency control),在MMAP版本中,只提供了database的鎖(既當一個使用者對一個collection進行操作時,其他的collection也被掛起);
- 無縫遷移(MMAP版本的資料可以線上遷移至MMAPV1版本,也可以遷移至wiredtiger引擎中)。
- 可插拔的儲存引擎API(類似於mysql的多引擎驅動)
- 通過不同的資料引擎來滿足不同的資料需求;
- 未來更多的情境擴充。
- Ops manager(MongoDB企業版提供的功能)
- 居於web的圖形管理介面
- 減少日常日常和配置的工作
四、測試環境:伺服器硬體設定:172.16.16.169 CPU:2*E5620 @ 2.40GHz、記憶體:8G
用戶端硬體設定:172.16.40.92 CPU: 4*I5-4300U@ 1.90GHz、記憶體:4G
資料庫:mongodb V3.0.6
開發環境:python3.4.3、pycharm4.5.4
測試前提:已安裝完成了mongodb、python、pycharm 五、測試情境:插入100萬條資料的時間消耗對比; 1. 在伺服器端啟動MongoDB(預設為MMAPv1引擎,預設連接埠為27017,在MongoDB的安裝目錄中啟動MongoDB,定義資料和日誌路徑):#./mongod --dbpath=/data/db --logpath=/data/log
2. 登入MongoDB:#./mongo
3. 查看當前的引擎狀態:> db.serverStatus() "storageEngine" : { "name" : "mmapv1"
4. 在伺服器端啟動MongoDB(WiredTiger引擎,連接埠:11111,在MongoDB的安裝目錄中啟動MongoDB,定義資料和日誌路徑,定義WiredTiger引擎):#./mongod --dbpath=/data/wiredtiger --logpath=/data/wiredtiger/log
5. 登入至啟動了WiredTiger引擎的Mongodb:#./mongo 127.0.0.1:11111
6. 查看當前的引擎狀態:> db.serverStatus() "storageEngine" : { "name" : "wiredTiger"
7. python串連MongoDB MMAPv1寫入配置:import timeimport datetimeimport timeitimport mathISOTIMEFORMAT = '%Y-%m-%d %X'from pymongo import MongoClientmc = MongoClient("172.16.16.169",27017)db = mc.usersdef dateDiffInSeconds(date1,date2): timedelta = date2 - date1 return timedelta.days*24*3600 +timedelta.secondsdate1 = datetime.datetime.now()db.users.drop()for i in range(0,1000000) :db.users.insert({"name":"ljai","age":i,"addr":"fuzhou"})c = db.users.find().count()print("count is ",c)date2 = datetime.datetime.now()print(date1)print(date2)print(dateDiffInSeconds(date1,date2),"seconds")mc.close()
8. 測試結果:100萬條資料寫入花費了12分鐘28秒:
2、 python串連MongoDB WiredTiger寫入配置:
import timeimport datetimeimport timeitimport mathISOTIMEFORMAT = '%Y-%m-%d %X'from pymongo import MongoClientmc = MongoClient("172.16.16.169",27017)db = mc.usersdef dateDiffInSeconds(date1,date2): timedelta = date2 - date1 return timedelta.days*24*3600 +timedelta.secondsdate1 = datetime.datetime.now()db.users.drop()for i in range(0,1000000) :db.users.insert({"name":"ljai","age":i,"addr":"fuzhou"})c = db.users.find().count()print("count is ",c)date2 = datetime.datetime.now()print(date1)print(date2)print(dateDiffInSeconds(date1,date2),"seconds")mc.close()
9. 測試結果:100萬條資料寫入花費了10分3秒:
100萬條的資料寫入,WireTiger引擎會比MMAPv1快一些,後續再繼續其他方面的效能測試。更多MongoDB相關內容可以看看以下的有用連結:
MongoDB 3.0 正式版發布下載
CentOS編譯安裝MongoDB
CentOS 編譯安裝 MongoDB與mongoDB的php擴充
CentOS 6 使用 yum 安裝MongoDB及伺服器端配置
Ubuntu 13.04下安裝MongoDB2.4.3
MongoDB入門必讀(概念與實戰並重)
Ubunu 14.04下MongoDB的安裝指南
《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]
Nagios監控MongoDB分區叢集服務實戰
基於CentOS 6.5作業系統搭建MongoDB服務
MongoDB 的詳細介紹:請點這裡
MongoDB 的:請點這裡
本文永久更新連結地址: