文章目錄
- 部署和啟動
- 主從備份
- 冷備份
- 開發協助工具輔助
- 效能監控
- 優缺點
- 最後是NoSQL和RDBMS系統的查詢語言的對比
http://blog.csdn.net/aegis1019/article/details/6902704
公司出於成本上的考慮,打算把曆史資料從Oracle移植到一個開來源資料庫上,正好被分到了MongoDB的調研任務,既然寫完了調研報告,這裡也自己留一份簡單的總結備查吧。
筆記而已,寫的有點亂。
MongoDB是一個分布式文檔型資料庫,目前多大多用於web2.0項目上,可能不太適合我們目前的項目,大多用來輔助關係型資料庫進行儲存,當然也有單獨使用的情況,號稱在海量資料的處理上表現優異。但是實際測試表現並不理想,遠沒有達到Oracle的水平,效能接近MySQL。但是其注重可擴充性,關注點不同,各有各的優勢。
MongoDB最著名的應用的宕機的例子就是4square的由於自動分區問題導致11小時宕機無法處理,直到10gen支援才解決。
部署和啟動
MongoDB服務端可運行在Linux、Windows或OS X平台,支援32位和64位應用,預設連接埠為27017。推薦運行在64位平台,因為MongoDB在32位元模式運行時支援的最大檔案尺寸為2GB。
部署較容易,在MongoDB官網下載對應作業系統的可用版本,mongod.exe –dbpath=/opt/MongDB/data指定資料庫資料目錄,完成啟動。瀏覽器輸入http://localhost:27017/ 會出現連接埠設定的提示。
主從備份
有兩種模式,主從模式和互為主從。兩種模式都不一定需要兩台機器,可以在同一台機器上部署2個資料庫為主從。但是不建議這麼做,因為這樣容災考慮上不好。
主從模式命令:master機 mongod --dbpath ./data/mongodb1 --master --logpath ./data/mongdb1.log --logappened
slave機 mongod --dbpath ./data/mongodb2 --source 127.0.0.1:27017 --autoresync --slavedelay 30 --logpath ./data/mongodb2.log --port 27018 --logappend
--autoresync可使從節點在不同步情況發生10秒鐘之後,自動重啟複製操作。如果指定了--autoresync參數,從節點在10分鐘以內自動重新同步資料的操作只會執行一次。
互為主從模式,就在master機和slave機的命令上都加入 --master --slave,可以根據機器負載自動切換主從。
冷備份
資料冷備份可以通過MongoDB提供的 dump和restore工具來完成。
命令文法:
>mongodump -h dbhost -d dbname -o dbdirectory
-h:MongDB所在伺服器位址,例如:127.0.0.1,當然也可以指定連接埠號碼:127.0.0.1:27017
-d:需要備份的資料庫執行個體,例如:test
-o:備份的資料存放位置,例如:/data/dump,當然該目錄需要提前建立,在備份完成後,系統自動在dump目錄下建立一個test目錄,這個目錄裡面存放該資料庫執行個體的備份資料。
>mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
-h:MongoDB所在伺服器位址
-d:需要恢複的資料庫執行個體,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
--directoryperdb:備份資料所在位置,例如:/data/dump/test。
--drop:恢複的時候,先刪除當前資料,然後恢複備份的資料。就是說,恢複後,備份後添加修改的資料都會被刪除。
分布式的測試沒做。
開發協助工具輔助
內建工具:和Oracle一樣,MongoDB也內建了一些輔助開發工具:mongo.exe,mongoexport.exe,mongoimport.exe,mongodump.exe,mongorestore.exe。其中mongo.exe對應Oracle的sqlPlus,mongoexport.exe和mongoimport.exe是資料匯入匯出工具,mongodump.exe和mongorestore.exe是Database Backup恢複工具。這些工具都是黑屏工具。
現在還有一些第三方開發的MongoDB的開發協助工具輔助,這裡個人推薦一個國人自己寫的基於php的開發工具——rockmongo,可以在code.google上下載,MongoDB官網也有連結,介面類似於pl/sql develop。
效能監控
mongodb可以通過profile來監控資料,進行最佳化。查看當前是否開啟profile功能用命令:
db.getProfilingLevel() 返回level等級,值為0|1|2,分別代表意思:0代表關閉,1代表記錄慢命令,2代表全部。
開始profile功能為:
db.setProfilingLevel(level); #level等級,值同上。level為1的時候,慢命令預設值為100ms,更改為db.setProfilingLevel(level,slowms)如db.setProfilingLevel(1,50)這樣就更改為50毫秒。
通過db.system.profile.find() 查看當前的監控日誌,參數分析:
如果發現時間比較長,那麼就需要作最佳化。比如nscanned數很大,或者接近記錄總數,那麼可能沒有用到索引查詢。reslen很大,有可能返回沒必要的欄位。nreturned很大,那麼有可能查詢的時候沒有加限制。
這裡值的含義是:
ts:命令執行時間
info:命令的內容
query:代表查詢
order.order: 代表查詢的庫與集合
reslen:返回的結果集大小,byte數
nscanned:掃描記錄數量
nquery:後面是查詢條件
nreturned:返回記錄數及用時
millis:所花時間
通過db.serverStatus()查看mongod的運行狀態:
> db.serverStatus()
{
"host" : "baobao-laptop",#主機名稱
"version" : "1.8.2",#版本號碼
"process" : "mongod",#進程名
"uptime" : 15549,#已耗用時間
"uptimeEstimate" : 15351,
"localTime" : ISODate("2011-07-23T06:07:31.220Z"),目前時間
"globalLock" : {
"totalTime" : 15548525410,#總已耗用時間(ns)
"lockTime" : 89206633, #總的鎖時間(ns)
"ratio" : 0.005737305027178137,#鎖比值
"currentQueue" : {
"total" : 0,#當前需要執行的隊列
"readers" : 0,#讀隊列
"writers" : 0#寫隊列
},
"activeClients" : {
"total" : 0,#當前用戶端執行的連結數
"readers" : 0,#讀連結數
"writers" : 0#寫連結數
}
},
"mem" : {#記憶體情況
"bits" : 32,#32位系統
"resident" : 337,#佔有實體記憶體數
"virtual" : 599,#佔有虛擬記憶體
"supported" : true,#是否支援擴充記憶體
"mapped" : 512
},
"connections" : {
"current" : 2,#當前連結數
"available" : 817#可用連結數
},
"extra_info" : {
"note" : "fields vary by platform",
"heap_usage_bytes" : 159008,#堆使用方式位元組
"page_faults" : 907 #頁面故作
},
"indexCounters" : {
"btree" : {
"accesses" : 59963, #索引被訪問數
"hits" : 59963, #所以命中數
"misses" : 0,#索引偏差數
"resets" : 0,#複位元
"missRatio" : 0#未命中率
}
},
"backgroundFlushing" : {
"flushes" : 259, #重新整理次數
"total_ms" : 3395, #重新整理總花費時間長度
"average_ms" : 13.108108108108109, #平均時間長度
"last_ms" : 1, #最後一次時間長度
"last_finished" : ISODate("2011-07-23T06:07:22.725Z")#最後重新整理時間
},
"cursors" : {
"totalOpen" : 0,#開啟遊標數
"clientCursors_size" : 0,#用戶端資料指標大小
"timedOut" : 16#逾時時間
},
"network" : {
"bytesIn" : 285676177,#輸入資料(byte)
"bytesOut" : 286564,#輸出資料(byte)
"numRequests" : 2012348#請求數
},
"opcounters" : {
"insert" : 2010000, #插入運算元
"query" : 51,#查詢運算元
"update" : 5,#更新運算元
"delete" : 0,#刪除運算元
"getmore" : 0,#擷取更多的運算元
"command" : 148#其他命令運算元
},
"asserts" : {#各個斷言的數量
"regular" : 0,
"warning" : 0,
"msg" : 0,
"user" : 2131,
"rollovers" : 0
},
"writeBacksQueued" : false,
"ok" : 1
}
優缺點
優點:
擁有較高的可配置型,可以最大程度的降低營運人員的壓力。容易使用和理解的api.不低的插入和查詢效能,同樣降低開發人員的壓力。document模型的資料存放區,並通過一些內部設計來避免表之間的join,可提供一個簡單方便的容易擴充的架構。而且確保無人誤用導致資料不可切分。MongoDB適合給人手不足的中小型團隊提供的一個處理海量資料的,高並發高可用性的資料化持久工具。開源免費,壓榨機器效能。
缺點:
首先,由於schema free和BSON 的引入使得資料膨脹明顯,一般膨脹5~10倍非常容易,因為每一個doc都會完整儲存所有的鍵和值,即使結構一樣的doc,所以隱藏檔會急劇增大,如果使用32位作業系統很容易達到單個檔案體積上限。所以對於MongoDB必須使用64位作業系統。第二,mmap(2)的使用使得讀寫調度控制以及cache控制不夠細,倒是方便了程式員寫程式的難度。但在資料量極大的超過記憶體的時候,僅憑OS的交換策略不能滿足實際需要,這個時候效能抖動劇烈。第三,不支援多表聯集查詢,不支援事務性操作。還有,安全性不高,需要作業系統為它分配記憶體,佔用和消耗巨大記憶體(這點不同的人有不同的說法,可能是叢集和開發環境造成的),讀寫鎖粒度太粗等。
最後是NoSQL和RDBMS系統的查詢語言的對比
需要注意的是,NoSQL不支援多表聯集查詢,只能查詢單表,幾乎可以達到SQL的同樣水平。
mongodb的vs2005驅動,只能上傳.jpg檔案,rar你懂得