日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

支持海量数据的 MongoDB NoSQL

發布時間:2023/12/19 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 支持海量数据的 MongoDB NoSQL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于這個速查卡

MongoDB是一個文檔型數據庫,它可以方便的應用于大多數語言。這個小清單列出了MongoDB經常使用和容易忘記的一些操作,命令和技術。

配置選項

安裝選項

啟動MongoDB的選項可以通過命令行或者配置文件設置,兩者的語法稍微有點不同,這里有一個三種選項的設置例子:

命令行配置文件
--dbpath /path/to/dbdbpath=/path/to/db
--authauth=true
-vvvvvv=true

在mongod下運行--help可以列出所有的操作選項,但是這里我們列出了一些最常用的:

操作選項描述
--config /path/to/config指定其他配置選項的配置文件.
--dbpath /path/to/data數據存儲目錄.
--port 27017監聽端口號.
--logpath /path/to/file.log日志輸出文件,這是個明確的文件路徑,不是目錄.
--logappend重啟后,以追加的方式創建日志防止把之前的日志刪除了。在使用--logpath時總是開啟.
--fork把mongod配置為守護進程.
--auth單個服務器的安全驗證.
--keyFile /path/to/key.txt副本集和分片時安全驗證,需要使用一個路徑共享密鑰。
--nohttpinterface關閉http訪問接口
--bind_ip address只允許指定的網絡ip訪問.

如果想安全的啟動mongod,就要使用nohttpinterface和bind_ip操作選項,確定外網不能直接訪問。尤其確保你沒有其余的選項啟動,MongoDB需要以下網絡環境可以訪問:

  • 單個服務器?- 客戶端程序可以獲取訪問連接
  • 副本集?- 任何成員集能夠訪問,包括自己;客戶端能夠訪問任何一個成員集,并且可訪問的成員集都能夠成為主節點(活躍節點).
  • 分片- mongos進程必須能夠連接到配置的服務器和分片,分片必須能夠彼此連接。客戶端程序必須能夠連接到mongos進程。配置服務器沒必要彼此提供訪問連接的支持。

所有的連接都是通過tcp建立的.

繆斯的情人
翻譯于 2天前

6人頂

頂?翻譯的不錯哦!

其它翻譯版本(2)

查看配置

如果你6個月前啟動mongod時做了一堆配置,那么現在你如何知道做了什么配置呢?這里提供了一個shell小助手:

> db.serverCmdLineOpts() { "argv" : [ "./mongod", "--port", "30000" ], "parsed" : { }, "ok" : 1 }

解析后的字段是從配置文件讀取的一些參數列表.

使用shell

Shell幫助

當你忘記一個命令時,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()

你可以使用這個功能和小助手作為一個內置的備忘清單。

繆斯的情人
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

查看方法的定義

如果你不知道一個方法是干什么用的,你可以在shell中通過去除括號的方式運行它,查看它的源碼:

> // run the function > db.serverCmdLineOpts() { "argv" : [ "./mongod" ], "parsed" : { }, "ok" : 1 } > // see its source > db.serverCmdLineOpts function () {return this._adminCommand("getCmdLineOpts"); }

這可以幫助我們獲悉這個方法需要什么參數和拋出什么錯誤,以及如何在其他語言中使用。

繆斯的情人
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

使用編輯功能

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中使用。

繆斯的情人
翻譯于 2天前

1人頂

頂?翻譯的不錯哦!

.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命令時移除的:

  • DB.prototype.shutdownServer
  • DBCollection.prototype.drop
  • DBCollection.prototype.ensureIndex
  • DBCollection.prototype.reIndex
  • DBCollection.prototype.dropIndexes

?

繆斯的情人
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

改變提示

shell的提示可以通過一個方法設置提示變量的方式來改變:

prompt = function() {try {db.getLastError();}catch (e) {print(e);}return (new Date())+"$ "; }

如果你設置了提示,每次執行時都會重新返回提示信息(上面的例子將返回最后執行的信息)。
嘗試在你的提示里面調用db.getLastError()方法,這將包含默認的提示和服務器重新連接以及返回的錯誤信息.

同時,把任何可能出現異常的用try/catch包裹起來,那是非常惱人的,當你的提示變成了一個異常信息!

繆斯的情人
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

操作診斷

查看和終止操作

你可以通過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你可以查看操作執行的時間.

繆斯的情人
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

索引使用

使用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()輸出中有幾個重要的字段:

  • n: 返回記錄行數.
  • nscanned: 使用索引讀取的記錄數量.
  • nscannedObjects: 被掃描的文檔數量.
  • indexOnly: 如果查詢沒有使用集合本身.
  • nYields: 查詢讀取鎖的釋放時間和等待下次操作時間.
  • indexBounds: 當使用索引時,顯示的索引掃描范圍.

?

繆斯的情人
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

游標類型
一個遍歷游標(BasicCursor)意味著沒有使用索引;一個B樹游標(BtreeCursor)意味著使用了一個常用的索引;平行游標被用于分片;二維空間索引(geospatial indexes)使用他們自己特殊的游標。

一旦一個數組被索引,那么索引上就會設定一個“multikey”標記,這就是對上面isMultiKey字段的解釋。這個標記在索引生命周期內一直保存,除非你去掉了數組的索引。

如果應用索引做查詢的話,explain輸出的信息里將包含索引范圍字段,它描述了索引遍歷到的那部分記錄。比如,如果你知道你的文檔里面有個age字 段,并且年齡在0-120之間均勻分布,索引范圍從3-5,你可以看到索引只需掃描一小部分數據就能滿足你的查詢需要。

?

繆斯的情人
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

暗示(Hinting)

使用hint()能讓查詢強制使用一個特殊的索引:

> db.foo.find().hint({x:1})

這個暗示必須和你想使用的的索引key相匹配,你可以通過運行下面命令查看可用的索引:

> db.foo.getIndexes()

一般來說,你可以創建一個索引用于查詢。如果你有一個查詢和排序,建索引最合適的字段取決于你的查詢。如果查詢一個單一的值(如:{x:y}),索引應該 這樣建{queryField: 1, sortField: 1}。如果查詢的是一個范圍或者集合,采用這樣的方式建索引可能更高效:{sortField: 1, queryField: 1}。如果你是用這個索引,MongoDB必須掃描所有的索引查找結果集,但是它可以在不使用內存排序的情況下返回有序的結果。

繆斯的情人
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

系統性能分析

你可以打開系統分析,看看數據庫的操作信息。雖然性能上會有損失,但可以幫助我們避免慢查詢。

> 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
翻譯于 2天前

1人頂

頂?翻譯的不錯哦!

副本集

要找到延遲的復制,連接到一個備節點并運行這個函數:

> 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
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

分片

要查看群集的元數據(分片,數據庫,文件,數據等),請運行下面的函數:

> 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 獲取分片信息。永遠不要直接連接配置服務器。永遠不要直接寫入配置服務器。。永遠使用分片命令和幫助。
在維護之后,有時實際上沒有實施維護的 mongos 進程的配置版本號將不會更新。無論是回彈服務還是運行 flushRouterConfig 命令都能快速解決問題。

> use admin > db.runCommand({flushRouterConfig:1})

通常這個問題將表現為 setShardVersion 失敗的錯誤。
無需擔心日志中的 setShardVersion 錯誤,但它們不應該出現在您的應用程序中(除非 mongos 無法連接到任何配置服務器,否則你不應該得到錯誤)。D
要添加新的分片,運行:

> db.addShard("rsName/seed1,seed2,seed3")

要在數據庫上運用分片,運行:

> db.adminCommand({enableSharding: true})

要在集合上運用分片,運行:

> db.adminCommand({shardCollection: "dbName.collName", unique: true, key: {fieldName: 1}})

既不應該已經存在 dbName.collName,也不應該已經索引fieldName(分片關鍵字)。如果你在使用唯一分片關鍵字,它必須是唯一索引的。

Khiyuan
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

在集群中,如果你不是在 _id 上分片,_id 無需唯一。不管怎樣,它們都在獨立的分片上(就是說,你可以在 shard1 上有一個_id:123,在 shard2 生也有一個_id:123,但它們不能同時存在于 shard1中)。文件往往在分片間移動,如果是自己生成的_id,你需要確保你的_id唯一。如果你用的是Object_Id 就不會出問題。
要關閉均衡器,通過的 mongos 更新 config.settings 集合:

> sh.setBalancerState(false)

要恢復,則使用同樣的命令,傳遞一個 True。

Khiyuan
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

Mongo監控服務 (MMS)

MMS 是一種免費的、易操作的監控 MongoDB 的方式。要使用它,先在 http://mms.10gen.com. 創建一個賬號。

查看 http://mms.10gen.com/help 以獲得更多的文檔。

簡單規則

數據庫

數據庫的名稱不能包含 ".","$","\0"(空字符)。名稱只能包含在你的文件系統中可以用做文件名的字符。Admin,config,local是數據庫的保留名(你可以在其中保存數據,單永遠不要刪除它們)。

另一個強大的選項是 post-commit 鉤子。鉤子將在提交到庫時被觸發。這是比周期構建或 Poll SCM 選項更高效的方法。

Khiyuan
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

集合

集合名不能含有 "$" 或 "\0"。前綴為 "system." 的名字為 MongoDB 的保留集合,不能刪除(哪怕是你創建的)?!包c”經常被用于集合名稱的組織,但它們沒有語義。名為“che.se”的集合跟名為“che”的集合以及名為“cheese”的集合沒有任何關聯。

字段名

字段名不能含有 "." 或 "\0"。當字段為數據庫引用時,它應當只含有"$"。

索引選項

background 在后臺建立索引,同時可數據庫可讀寫
unique 每個鍵的值都是唯一的。
sparse 不索引不存在的值。輕松索引文檔中的唯一字段,而沒有該字段的文檔不參與索引。
expireAfterSeconds 設定集合的生存時間。
dropDups 當創建唯一索引時,遭遇重復則刪除,而非報錯。注意,這個選項將刪除有重復值的文檔。

查詢格式

查詢語句通常為一下格式:

{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
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

查詢操作符

  • √: 匹配
  • x: 不匹配
操作符 查詢示例 文檔示例
$gt, $gte, $lt, $lte, $ne {numSold : {$lt:3}} √ {numSold: 1}
x {numSold: "hello"}
x {x : 1}
$in, $nin {age : {$in : [10, 14,
21]}}
√ {age: 21}
√ {age: [9, 10, 11]}
x {age: 9}
$all {hand : {$all :
["10","J","Q","K","A"]}}
√ {hand: ["7", "8", "9",
"10", "J", "Q", "K", "A"]}
x {hand:["J","Q","K"]}
$not {name : {$not : /jon/i}} √ {name: "Jon"}
x {name: "John"}
$mod {age : {$mod : [10, 0]}} √ {age: 50}
x {age: 42}
$exists {phone: {$exists: true}} √ {phone: "555-555-
5555"}
x {phones: ["555-555-
5555", "1-800-555-
5555"]}
$type* {age : {$type : 2}} √ {age : "42"}
x {age : 42}
$size {"top-three":{$size:3}} √ {"top-three":["gold","s
ilver","bronze"]}
x {"top-three":["blue
ribbon"]}

*參見 http://www.mongodb.org/display/DOCS/Advanced+Queries 獲取全部類型。

更新修飾符

修飾符 初始文檔 修改示例 最終文檔
$set {x:"foo"} {$set:{x:[1,2,3]}} {x:[1,2,3]}
$unset {x:"foo"} {$unset:{x:true}} {}
$inc {countdown:5} {$inc:{countdown:-1}} {countdown:4}
$push, $pushAll {votes:[-1,-1,1]} {$push:{votes:-1}} {votes:[-1,-1,1,-1}}
$pull, $pullAll {blacklist:["ip1","ip2","ip3"]} {$pull:{blacklist:"ip2"}} {blacklist:"ip1",
"ip3"} {blacklist:
"ip1","ip3"}
$pop {queue:["1pm","3pm","8pm"]} {$pop:{queue:-‐1}} {queue:["3pm","8pm"]}
$addToSet,$each {ints:[0,1,3,4]} {$addToSet:{ints:{
$each:[1,2,3]}}}
{ints:[0,1,2,3,4]}
$rename {nmae:"sam"} {$rename:{nmae:"name"}} {name:"sam"}
$bit {permission:6} {$bit:{permissions:{or:1}}} {permission:7}

聚合管道操作符

聚合框架可以用來做任何事情,從簡單的查詢語句到復雜的聚合查詢。

使用聚合框架,將聚合操作符通過管道傳遞給 aggregate() 函數:

> db.collection.aggregate({$match:{x:1}}, ... {$limit:10}, ... {$group:{_id : "$age"}})

下面是可用操作符的列表:

操作符簡述
{$project : projection}包含、排除、重命名和顯示字段。
{$match : match}查詢,需要同 find() 一樣的參數。
{$limit : num}限制結果數量
{$skip : skip}忽略結果的數量。
{$sort : sort}按照給定字段排序結果。
{$group : group}按照給定表達式(見下)組合結果。
{$unwind : field}分割的嵌入數組到其自己頂層文件。

要引用一個字段,使用 $fieldName 語句。例如,下面的映射將返回一個重新命名為“time since epoch ” 的原存在的“$time”字段:

{$project: {"time since epoch": "$time"}}

$project 和 $group 不能同時表達,你可以用 $fieldName 語句,如下:

表達操作符示例簡述
$add : ["$age", 1]age 字段加1.
$divide : ["$sum", "$count"]使用 sum 字段 除以 count 字段
$mod : ["$sum", "$count"]sum 字段除以 count 字段后的余數。
$multiply : ["$mph", 24, 365]mph 字段乘以 24*365.
$subtract : ["$price","$discount"]price 字段減去 discount 字段。
$strcasecmp : ["ZZ", "$name"]如果 name 字段小于 “ZZ” 則為 1,如果 name 字段大于 “ZZ” 則為 0。 -1 if name is greater than ZZ.
$substr : ["$phone", 0, 3]獲取的電話區號(前三個字符)。
$toLower : "$str"Converts str to all lowercase.
$toUpper : "$str"str 字段全部大寫。
$ifNull : ["$mightExist",
$add : ["$doesExist", 1]]
若 mightExist 不為空,則返回 mightExist 的值,否則返回第二個表達式的結果。
$cond : [exp1, exp2, exp3] 如果 exp1 結果為真,返回 exp2的結果,否則返回 exp2的結果。
Khiyuan
翻譯于 2天前

0人頂

頂?翻譯的不錯哦!

備份

當狀態一致時(備份時沒有發生讀寫操作),最好的備份方式就是把數據庫文件拷貝一份。

  • 使用fsync+lock命令。這個命令將所有的寫操作強制寫入磁盤,并且阻止了新的寫入。> db.fsyncLock()
  • 把數據庫文件拷貝到本地一個新路徑下
  • 使用unlock命令解鎖數據庫。> db.fsyncUnlock()
  • 恢復備份的方法是拷貝文件到正確的服務器路徑下,重啟。

    如果你有一個文件系統來做文件系統快照,你的日志在同樣的卷標下,并且做了RAID共享存儲,你可以使用一個無鎖的快照做處理。既然這樣,當你重啟時,日志就能同步來保持始終一致性。

    在特殊情況下可以使用Mongodump做備份。如果你決定使用它,首先不要使用fsync+lock。

    繆斯的情人
    翻譯于 2天前

    0人頂

    頂?翻譯的不錯哦!

    其它翻譯版本(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

    ?

    繆斯的情人
    翻譯于 2天前

    0人頂

    頂?翻譯的不錯哦!

    以獨立服務器的方式啟動一個成員
    為了維護,你通常需要啟動一個從節點并且確保它可寫(比如,建索引),為了達到這個目的你需要把從節點作為一個臨時獨立的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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。