支持海量数据的 MongoDB NoSQL
關于這個速查卡MongoDB是一個文檔型數據庫,它可以方便的應用于大多數語言。這個小清單列出了MongoDB經常使用和容易忘記的一些操作,命令和技術。 配置選項安裝選項啟動MongoDB的選項可以通過命令行或者配置文件設置,兩者的語法稍微有點不同,這里有一個三種選項的設置例子:
在mongod下運行--help可以列出所有的操作選項,但是這里我們列出了一些最常用的:
如果想安全的啟動mongod,就要使用nohttpinterface和bind_ip操作選項,確定外網不能直接訪問。尤其確保你沒有其余的選項啟動,MongoDB需要以下網絡環境可以訪問:
所有的連接都是通過tcp建立的. | 繆斯的情人 | ||||||||||||||||||||||||||
| 其它翻譯版本(2) |
查看配置如果你6個月前啟動mongod時做了一堆配置,那么現在你如何知道做了什么配置呢?這里提供了一個shell小助手: > db.serverCmdLineOpts() { "argv" : [ "./mongod", "--port", "30000" ], "parsed" : { }, "ok" : 1 }解析后的字段是從配置文件讀取的一些參數列表. 使用shellShell幫助當你忘記一個命令時,mongodb提供了許多功能幫助你: > // basic help > helpdb.help() help on db methodsdb.mycoll.help() help on collection methodssh.help() sharding helpersrs.help() replica set helpershelp admin administrative helphelp connect connecting to a db help...注意對于數據庫,集合,副本集,分片,管理員等提供了單獨了幫助功能。這里沒有一一列出,像游標的幫助功能如下: > // list common cursor functions > db.foo.find().help()你可以使用這個功能和小助手作為一個內置的備忘清單。 | 繆斯的情人 |
查看方法的定義如果你不知道一個方法是干什么用的,你可以在shell中通過去除括號的方式運行它,查看它的源碼: > // run the function > db.serverCmdLineOpts() { "argv" : [ "./mongod" ], "parsed" : { }, "ok" : 1 } > // see its source > db.serverCmdLineOpts function () {return this._adminCommand("getCmdLineOpts"); }這可以幫助我們獲悉這個方法需要什么參數和拋出什么錯誤,以及如何在其他語言中使用。 | 繆斯的情人 |
使用編輯功能shell命令限制多行的支持,因此在里面編寫程序很費勁,shell編輯小助手讓它更加簡單,打開一個文本編輯器,編輯一個變量,例如: > x = function() { /* some function we're going to fill in */ } > edit x在編輯器修改一個變量保存退出。這個變量就在shell里面被設定好了。 不管是編輯器的環境變量或者MongoDB shell的變量編輯環境,都必須設置使用edit模式。你可以在MongoDB shell中通過如下命令配置: > EDITOR="/usr/bin/emacs"編輯模式在JavaScript腳本下是無法使用的,只能在交互的shell中使用。 | 繆斯的情人 |
.mongorc.js如果你的主目錄下有個.mongorc.js文件,那么當你啟動shell時他就會自動運行。使用它可以初始化任何你經常使用的helper方法和你不想意外操作的刪除方法. 比如,你不想使用默認的dropDatabase()方法了,你可以在.mongorc.js文件中添加下面的命令: DB.prototype.dropDatabase = function() {print("No dropping DBs!"); } db.dropDatabase = DB.prototype.dropDatabase;上面的例子改變了dropDatabase() helper方法,使他只打印出一行信息,而沒有真正的刪除數據庫. 注意這個技巧不是一個安全手段,固執的用戶仍然可以在不使用helper前提下刪除數據庫。然而,移除危險的admin權限命令也可以幫助阻止“大堤的奔潰”. 幾個建議在.mongorc.js中使用helper命令時移除的:
? | 繆斯的情人 |
改變提示shell的提示可以通過一個方法設置提示變量的方式來改變: prompt = function() {try {db.getLastError();}catch (e) {print(e);}return (new Date())+"$ "; } 如果你設置了提示,每次執行時都會重新返回提示信息(上面的例子將返回最后執行的信息)。 同時,把任何可能出現異常的用try/catch包裹起來,那是非常惱人的,當你的提示變成了一個異常信息! | 繆斯的情人 |
操作診斷查看和終止操作你可以通過currentOp查看當前操作狀態: > db.currentOp() {"inprog" : [{"opid" : 123,"active" : false,"locktype" : "write","waitingForLock" : false,"secs_running" : 200,"op" : "query","ns" : "foo.bar","query" : {}...},...] }使用上面的opid字段,你可以終止這個操作: > db.killOp(123)不是所有的操作都能被終止或者立刻終止,通常,操作不會被終止,直到他們獲取到鎖. active字段表明操作當前是否在運行,如果一個操作沒有運行,通常是要么沒啟動,要么在等待鎖,要么執行了其他操作。通過numYields你可以查看操作執行的時間. | 繆斯的情人 |
索引使用使用explain()來查看當前查詢操作使用了哪個索引. > db.foo.find(criteria).explain() {"cursor" : "BasicCursor","isMultiKey" : false,"n" : 2,"nscannedObjects" : 2,"nscanned" : 2,"nscannedObjectsAllPlans" : 2,"nscannedAllPlans" : 2,"scanAndOrder" : false,"indexOnly" : false,"nYields" : 0,"nChunkSkips" : 0,"millis" : 0,"indexBounds" : {},"server" : "ubuntu:27017" }explain()輸出中有幾個重要的字段:
? | 繆斯的情人 |
| 游標類型 一旦一個數組被索引,那么索引上就會設定一個“multikey”標記,這就是對上面isMultiKey字段的解釋。這個標記在索引生命周期內一直保存,除非你去掉了數組的索引。 如果應用索引做查詢的話,explain輸出的信息里將包含索引范圍字段,它描述了索引遍歷到的那部分記錄。比如,如果你知道你的文檔里面有個age字 段,并且年齡在0-120之間均勻分布,索引范圍從3-5,你可以看到索引只需掃描一小部分數據就能滿足你的查詢需要。 ? | 繆斯的情人 |
暗示(Hinting)使用hint()能讓查詢強制使用一個特殊的索引: > db.foo.find().hint({x:1})這個暗示必須和你想使用的的索引key相匹配,你可以通過運行下面命令查看可用的索引: > db.foo.getIndexes()一般來說,你可以創建一個索引用于查詢。如果你有一個查詢和排序,建索引最合適的字段取決于你的查詢。如果查詢一個單一的值(如:{x:y}),索引應該 這樣建{queryField: 1, sortField: 1}。如果查詢的是一個范圍或者集合,采用這樣的方式建索引可能更高效:{sortField: 1, queryField: 1}。如果你是用這個索引,MongoDB必須掃描所有的索引查找結果集,但是它可以在不使用內存排序的情況下返回有序的結果。 | 繆斯的情人 |
系統性能分析你可以打開系統分析,看看數據庫的操作信息。雖然性能上會有損失,但可以幫助我們避免慢查詢。 > db.setProfilingLevel(2) // profile all operations > db.setProfilingLevel(1) // profile operations that take longer than 100ms > db.setProfilingLevel(1, 500) // profile operations that take longer than 500ms > db.setProfilingLevel(0) // turn off profiling > db.getProfilingLevel(1) // see current profiling setting性能條目保存在開啟性能分析的數據庫中名為 system.profile 的集合??梢葬槍蝹€數據庫開啟和關閉性能分析。 | Khiyuan |
副本集要找到延遲的復制,連接到一個備節點并運行這個函數: > db.printReplicationStatus() configured oplog size: 2000MB log length start to end: 23091secs (6.4hrs) oplog first event time: Fri Aug 10 2012 04:33:03 GMT+0200 (CEST) oplog last event time: Mon Aug 20 2012 10:56:51 GMT+0200 (CEST) now: Mon Aug 20 2012 10:56:51 GMT+0200 (CEST)要查看某個成員對集合的性能狀況,連接到這個成員,并運行: > rs.status()此命令會告訴你其他成員之于它的狀態和地位。 在一個備節點上運行 rs.status() 將告訴你備節點是從 syncingTo字段中哪個中同步數據的。 | Khiyuan |
分片要查看群集的元數據(分片,數據庫,文件,數據等),請運行下面的函數: > db.printShardingStatus() > db.printShardingStatus(true) // show all chunks您也可以連接到 Mongos ,使用“use config”查看分片,數據庫,集合,或塊的數據,然后查詢相關的集合。 > use config switched to db config > show collections chunks databases lockpings locks mongos settings shards system.indexes version 永遠都連接到 mongos 獲取分片信息。永遠不要直接連接配置服務器。永遠不要直接寫入配置服務器。。永遠使用分片命令和幫助。 通常這個問題將表現為 setShardVersion 失敗的錯誤。 要在數據庫上運用分片,運行: > db.adminCommand({enableSharding: true})要在集合上運用分片,運行: > db.adminCommand({shardCollection: "dbName.collName", unique: true, key: {fieldName: 1}})既不應該已經存在 dbName.collName,也不應該已經索引fieldName(分片關鍵字)。如果你在使用唯一分片關鍵字,它必須是唯一索引的。 | Khiyuan |
| 在集群中,如果你不是在 _id 上分片,_id 無需唯一。不管怎樣,它們都在獨立的分片上(就是說,你可以在 shard1 上有一個_id:123,在 shard2 生也有一個_id:123,但它們不能同時存在于 shard1中)。文件往往在分片間移動,如果是自己生成的_id,你需要確保你的_id唯一。如果你用的是Object_Id 就不會出問題。 要恢復,則使用同樣的命令,傳遞一個 True。 | Khiyuan |
Mongo監控服務 (MMS)MMS 是一種免費的、易操作的監控 MongoDB 的方式。要使用它,先在 http://mms.10gen.com. 創建一個賬號。 查看 http://mms.10gen.com/help 以獲得更多的文檔。 簡單規則數據庫數據庫的名稱不能包含 ".","$","\0"(空字符)。名稱只能包含在你的文件系統中可以用做文件名的字符。Admin,config,local是數據庫的保留名(你可以在其中保存數據,單永遠不要刪除它們)。 另一個強大的選項是 post-commit 鉤子。鉤子將在提交到庫時被觸發。這是比周期構建或 Poll SCM 選項更高效的方法。 | Khiyuan |
集合集合名不能含有 "$" 或 "\0"。前綴為 "system." 的名字為 MongoDB 的保留集合,不能刪除(哪怕是你創建的)?!包c”經常被用于集合名稱的組織,但它們沒有語義。名為“che.se”的集合跟名為“che”的集合以及名為“cheese”的集合沒有任何關聯。 字段名字段名不能含有 "." 或 "\0"。當字段為數據庫引用時,它應當只含有"$"。 索引選項
查詢格式查詢語句通常為一下格式: {key : {$op : value}}例如: {age : {$gte : 18}}有三個例外的規則: $and, $or, 和 $nor,此三者優先級最高: {$or : [{age: {$gte : 18}}, {age : {$lt : 18}, parentalConsent:true}}]}更新格式更新語句總是如下格式: {key : {$mod : value}}例如: {age : {$inc : 1}}? | Khiyuan |
查詢操作符
*參見 http://www.mongodb.org/display/DOCS/Advanced+Queries 獲取全部類型。 更新修飾符
聚合管道操作符聚合框架可以用來做任何事情,從簡單的查詢語句到復雜的聚合查詢。 使用聚合框架,將聚合操作符通過管道傳遞給 aggregate() 函數: > db.collection.aggregate({$match:{x:1}}, ... {$limit:10}, ... {$group:{_id : "$age"}})下面是可用操作符的列表:
要引用一個字段,使用 $fieldName 語句。例如,下面的映射將返回一個重新命名為“time since epoch ” 的原存在的“$time”字段: {$project: {"time since epoch": "$time"}}$project 和 $group 不能同時表達,你可以用 $fieldName 語句,如下:
| Khiyuan |
備份當狀態一致時(備份時沒有發生讀寫操作),最好的備份方式就是把數據庫文件拷貝一份。 恢復備份的方法是拷貝文件到正確的服務器路徑下,重啟。 如果你有一個文件系統來做文件系統快照,你的日志在同樣的卷標下,并且做了RAID共享存儲,你可以使用一個無鎖的快照做處理。既然這樣,當你重啟時,日志就能同步來保持始終一致性。 在特殊情況下可以使用Mongodump做備份。如果你決定使用它,首先不要使用fsync+lock。 | 繆斯的情人 |
| 其它翻譯版本(1) |
副本集維護活躍節點成員的保持停止一個活躍節點的方法是把他的優先級調為0: > var config = rs.config() > config.members[2].priority = 0 > rs.reconfig(config)阻止從節點成為臨時活躍節點的方法是連接到它發送一條凍結命令: > rs.freeze(10*60) // # of seconds to not become primary如果你不想永久的改變優先級只是暫時做維護工作,這個方法是非常方便的. 成員的降級如果一個成員當前是活躍節點,你可以通過下面的方式對它降級: > rs.stepDown(10*60) // # of seconds to not try to become primary again? | 繆斯的情人 |
以獨立服務器的方式啟動一個成員
為了維護,你通常需要啟動一個從節點并且確保它可寫(比如,建索引),為了達到這個目的你需要把從節點作為一個臨時獨立的mongod.
如果從節點初始啟動使用下面的參數:
$ mongod --dbpath /data/db --replSet setName --port 30000關閉清除后使用下面配置重啟:
$ mongod --dbpath /data/db --port 30001注意dbpath沒有改變,但是端口改變了,replSet設置也被移除了。這個mongod將作為一個單獨的服務啟動,其余的副本集將通過30000端口查找成員,而不是30001,因此看起來他只是把其余的副本集降級了.
當你維護完成了,使用初始的參數設置并重啟就ok了.
更多資源
- MongoDB 下載http://www.mongodb.org/downloads
- 文檔?http://docs.mongodb.org
- 里程碑、修改的問題、添加功能http://jira.mongodb.org
- 問題: http://groups.google.com/group/mongodb-user
- IRC chat聊天,能及時得到問題答案:irc.freenode.net/#mongodb
轉載于:https://www.cnblogs.com/shihao/archive/2013/01/25/2876727.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的支持海量数据的 MongoDB NoSQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos怎么安装rpm软件包(内网环
- 下一篇: MYSQL 从头开始-1