1.MongoDB shell
mongo其實是資料庫shell.一般假定它和mongod運行在同一台機器上,還假定了mongod綁定了預設連接埠.
如果不是這樣的話,可以在啟動時指定這些參數,讓shell串連另一台伺服器:
mongo 192.168.10.10:10000
這樣就會串連運行在192.168.10.10上連接埠為10000的mongod
shell預設串連test資料庫,要使用別的資料庫,在伺服器位址後添加斜杠和資料庫名:
mongo 192.168.10.10:10000/refactor
這樣會串連192.168.10.10:10000上的refactor資料庫
也可以用--nodb選項啟動shell,而不串連任何資料庫,而只是試試javascript
mongo --nodb
db絕不是僅有的資料庫,從shell中可以串連任意多的資料庫,這對多個伺服器的環境很方便.調用connect(),
並將結果賦值給變數.如在分區環境中,可能想用mongos表示mongos伺服器,還想要有每個片的串連,可以
如下操作:
mongos=connect("127.0.0.1:10000")
shard0=connect("127.0.0.1:10001")
shard1=connect("127.0.0.1:10002")
這樣就能將mongos,shard0,shard1作為db變數使用.
shell工具
對於管理多個資料庫,有多個資料庫變數就比簡單的db有用處,如在分區中,
要維護一個單獨的只想設定管理員的變數:
config=db.getSisterDB("config")
config.shards.find()
2.BSON
MongoDB的文檔是個抽象概念,其具體的呈現形式取決與使用的驅動和程式設計語言.
因為MongoDB中的通訊大量依賴於文檔,所以需要一種所有驅動,工具和進程都能共用的文檔表達方式.
這種表達方式叫Binary JSON(BSON)
BSON是輕量級的二進位格式,能將MongoDB的所有文檔表示為自己字串.資料庫能理解BSON,存在磁碟上的文檔
也是這種格式.
當驅動要插入文檔,或者將文檔作為查詢條件,驅動會將文檔轉化成BSON,然後再發往伺服器.同樣,返回到用戶端的文檔
也是BSON格式的字串.驅動需要將這些資料解碼,編程原生文檔表示,最後返回給用戶端.
用BSON的三個主要原因:
a.效率
BSON設計用來更有效表示資料,暫用更好的空間.最差的情況下,BSON比JSON效率略低,最好的情況下(
比如存放位元據或著大多數),BSON要比JSON要高效的多.
b.可遍曆行
有些時候BSON犧牲了空間效率,換取更容易遍曆的格式.如,在字串前面加入其長度,而不是在結尾處使用一個終結符
這對MongoDB的內嵌文檔很有用.
c.效能
BSON編碼和解碼速度都很快.它用C風格的表現方式表示類型,在大多數程式設計語言中都很快.
2.MongoDB的傳輸協議
驅動在TCP/IP協議的基礎上簡單封裝了MongoDB傳輸協議,用來與MongoDB互動.
MongoDB的傳輸協議基本上是對一個簡單封裝的BSON資料,如,插入訊息會有20位元組的頭部資料(包括
告知伺服器執行寫入操作的代碼,以及訊息長度,要插入的集合名,要插入的BSON文檔列表)
3.資料檔案
MongoDB的資料目錄中,每個資料庫都有幾個獨立的檔案.每個資料有一個.ns檔案和若干資料檔案,資料檔案以
遞增的數字結尾,所以,資料庫refactor會被存放在refactor.ns,refactor.0,refactor.1等檔案中.
每個新的以數字結尾的資料檔案大小會加倍,直到達到最大值2GB.這是為了讓小資料庫不浪費太多的磁碟空間,
同時讓大資料庫使用磁碟上連續的空間.
MongoDB為了保證效能還會預分配資料檔案(可以用--norealloc關閉這一功能).預分配在後台完成,有資料檔案
被填滿時就會自動啟動.這意味著MongoDB伺服器總是視圖在每一個資料庫保留一個額外的空資料檔案來避免
檔案分配產生的阻塞.
4.命名空間和資料域
在資料檔案內部,每個資料庫都是按照 命名空間 組織的,一種類別的資料與其它類別的分開存放.每個集合的文檔都有
自己的命名空間,索引也是.命名空間的中繼資料存放在資料庫的.ns檔案中.
每個命名空間的資料都被分成若干組,放到資料檔案的某一個地區內,這個地區成為資料域.
:
資料庫foo有3個資料檔案,其中第3個是預分配的空檔案.前兩個資料檔案被分成幾個資料域,屬於幾個不同的命名空間
每個命名空間可以有幾個不同的資料域,在磁碟上不必連續.類似於資料庫的資料檔案,每次新分配的命名空間
的資料域大小也會增加.這是為了平衡命名空間浪費的控制項和盡量讓一個命名空間的資料連續做出的這種.
圖中還有個特殊的命名空間$freelist,存放這不再使用的資料域(如刪除集合或索引產生的資料域).
當命名空間分配新的資料域時,系統會先尋找空閑列表,看看有沒有適合大小的資料域可用
5.內從映射儲存引擎
MongoDB預設的儲存引擎是記憶體映射引擎,當伺服器啟動後,將所有資料檔案映射到記憶體,然後由作業系統來
負責將緩衝資料寫入磁碟並將資料調入調出記憶體頁面
這樣的移情有若干重要的特性:
a)MongoDB管理記憶體的代碼非常精鍊,原因是將大部分工作交給了作業系統.
b)MongoDB伺服器處理序的虛擬大小通常會非常大,超過整個資料集的大小,這沒關係,
因為作業系統會處理讓那些資料常駐記憶體.
c)MongoDB不能控制資料寫入到磁碟的順序,也就不能用預寫記錄檔提供單機的持久性.
d)32位的MongoDB伺服器有個限制,每個mongod最多處理2GB資料,這是因為所有資料必須能用32
位地址訪問到.