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