亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 5021 | 回復(fù): 1
打印 上一主題 下一主題

[MongoDB] MongoDB的內(nèi)部構(gòu)造 From 《MongoDB The Definitive Guide》 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-02-21 21:04 |只看該作者 |倒序?yàn)g覽
MongoDB的內(nèi)部構(gòu)造 From 《MongoDB The Definitive Guide》



本文是一篇轉(zhuǎn)載文章,正如作者所言,MongoDB的官方文檔基本是how to do的介紹,而關(guān)于how it worked卻少之又少,本人也剛買了《MongoDB The Definitive Guide》的影印版,還沒來(lái)得及看,本文原作者將其書中一些關(guān)于MongoDB內(nèi)部現(xiàn)實(shí)方面的一些知識(shí)介紹如下,值得一看。

另外,關(guān)于MongoDB內(nèi)部實(shí)現(xiàn)的知識(shí),還可以看一下本站的另一篇文章:《深入MongoDB精髓技巧》

原文鏈接:http://www.cnblogs.com/gpcuster/archive/2010/10/04/1841877.html

今天下載了《MongoDB The Definitive Guide》電子版,瀏覽了里面的內(nèi)容,還是挺豐富的。是官網(wǎng)文檔實(shí)際應(yīng)用方面的一個(gè)補(bǔ)充。和官方文檔類似,介紹MongoDB的內(nèi)部原理是少之又少,只有在附錄的一個(gè)章節(jié)中介紹了相關(guān)內(nèi)容。

對(duì)于大多數(shù)的MongoDB的用戶來(lái)說(shuō),MongoDB就像是一個(gè)大黑盒,但是如果你能夠了解到MongoDB內(nèi)部一些構(gòu)造的話,將有利于你更好地理解和使用MongoDB。

BSON
在MongoDB中,文檔是對(duì)數(shù)據(jù)的抽象,它被使用在Client端和Server端的交互中。所有的Client端(各種語(yǔ)言的Driver)都會(huì)使用這種抽象,它的表現(xiàn)形式就是我們常說(shuō)的BSON(Binary JSON )。

BSON是一個(gè)輕量級(jí)的二進(jìn)制數(shù)據(jù)格式。MongoDB能夠使用BSON,并將BSON作為數(shù)據(jù)的存儲(chǔ)存放在磁盤中。

當(dāng)Client端要將寫入文檔,使用查詢等等操作時(shí),需要將文檔編碼為BSON格式,然后再發(fā)送給Server端。同樣,Server端的返回結(jié)果也是編碼為BSON格式再放回給Client端的。

使用BSON格式出于以下3種目的:

效率
BSON是為效率而設(shè)計(jì)的,它只需要使用很少的空間。即使在最壞的情況下,BSON格式也比JSON格式再最好的情況下存儲(chǔ)效率高。

傳輸性
在某些情況下,BSON會(huì)犧牲額外的空間讓數(shù)據(jù)的傳輸更加方便。比如,字符串的傳輸?shù)那熬Y會(huì)標(biāo)識(shí)字符串的長(zhǎng)度,而不是在字符串的末尾打上結(jié)束的標(biāo)記。這樣的傳輸形式有利于MongoDB修改傳輸?shù)臄?shù)據(jù)。

性能
最后,BSON格式的編碼和解碼都是非?焖俚摹K褂昧薈風(fēng)格的數(shù)據(jù)表現(xiàn)形式,這樣在各種語(yǔ)言中都可以高效地使用。

更多關(guān)于BSON的介紹,可以參考:http://www.bsonspec.org

寫入?yún)f(xié)議
Client端訪問(wèn)Server端使用了輕量級(jí)的TCP/IP寫入?yún)f(xié)議。這種協(xié)議在MongoDB Wiki中有詳細(xì)介紹,它其實(shí)是在BSON數(shù)據(jù)上面做了一層簡(jiǎn)單的包裝。比如說(shuō),寫入數(shù)據(jù)的命令中包含了1個(gè)20字節(jié)的消息頭(由消息的長(zhǎng)度和寫入命令標(biāo)識(shí)組成),需要寫入的Collection名稱和需要寫入的數(shù)據(jù)。

數(shù)據(jù)文件
在MongoDB的數(shù)據(jù)文件夾中(默認(rèn)路徑是/data/db)由構(gòu)成數(shù)據(jù)庫(kù)的所有文件。每一個(gè)數(shù)據(jù)庫(kù)都包含一個(gè).ns文件和一些數(shù)據(jù)文件,其中數(shù)據(jù)文件會(huì)隨著數(shù)據(jù)量的增加而變多。所以如果有一個(gè)數(shù)據(jù)庫(kù)名字叫做foo,那么構(gòu)成foo這個(gè)數(shù)據(jù)庫(kù)的文件就會(huì)由foo.ns,foo.0,foo.1,foo.2等等組成。

數(shù)據(jù)文件每新增一次,大小都會(huì)是上一個(gè)數(shù)據(jù)文件的2倍,每個(gè)數(shù)據(jù)文件最大2G。這樣的設(shè)計(jì)有利于防止數(shù)據(jù)量較小的數(shù)據(jù)庫(kù)浪費(fèi)過(guò)多的空間,同時(shí)又能保證數(shù)據(jù)量較大的數(shù)據(jù)庫(kù)有相應(yīng)的空間使用。

MongoDB會(huì)使用預(yù)分配方式來(lái)保證寫入性能的穩(wěn)定(這種方式可以使用–noprealloc關(guān)閉)。預(yù)分配在后臺(tái)進(jìn)行,并且每個(gè)預(yù)分配的文件都用0進(jìn)行填充。這會(huì)讓MongoDB始終保持額外的空間和空余的數(shù)據(jù)文件,從而避免了數(shù)據(jù)增長(zhǎng)過(guò)快而帶來(lái)的分配磁盤空間引起的阻塞。

名字空間和盤區(qū)
每一個(gè)數(shù)據(jù)庫(kù)都由多個(gè)名字空間組成,每一個(gè)名字空間存儲(chǔ)了相應(yīng)類型的數(shù)據(jù)。數(shù)據(jù)庫(kù)中的每一個(gè)Collection都有各自對(duì)應(yīng)的名字空間,索引文件同樣也有名字空間。所有名字空間的元數(shù)據(jù)都存儲(chǔ)在.ns文件中。

名字空間中的數(shù)據(jù)在磁盤中分為多個(gè)區(qū)間,這個(gè)叫做盤區(qū)。在下圖中,foo這個(gè)數(shù)據(jù)庫(kù)包含3個(gè)數(shù)據(jù)文件,第三個(gè)數(shù)據(jù)文件屬于空的預(yù)分配文件。頭兩個(gè)數(shù)據(jù)文件被分為了相應(yīng)的盤區(qū)對(duì)應(yīng)不同的名字空間。



上圖顯示了名字空間和盤區(qū)的相關(guān)特點(diǎn)。每一個(gè)名字空間可以包含多個(gè)不同的盤區(qū),這些盤區(qū)并不是連續(xù)的。與數(shù)據(jù)文件的增長(zhǎng)相同,每一個(gè)名字空間對(duì)應(yīng)的盤區(qū)大小的也是隨著分配的次數(shù)不斷增長(zhǎng)的。這樣做的目的是為了平衡名字空間浪費(fèi)的空間與保持某一個(gè)名字空間中數(shù)據(jù)的連續(xù)性。上圖中還有一個(gè)需要注意的名字空間:$freelist,這個(gè)名字空間用于記錄不再使用的盤區(qū)(被刪除的Collection或索引)。每當(dāng)名字空間需要分配新的盤區(qū)的時(shí)候,都會(huì)先查看$freelist是否有大小合適的盤區(qū)可以使用。

內(nèi)存映射存儲(chǔ)引擎
MongoDB目前支持的存儲(chǔ)引擎為內(nèi)存映射引擎。當(dāng)MongoDB啟動(dòng)的時(shí)候,會(huì)將所有的數(shù)據(jù)文件映射到內(nèi)存中,然后操作系統(tǒng)會(huì)托管所有的磁盤操作。這種存儲(chǔ)引擎有以下幾種特點(diǎn):

* MongoDB中關(guān)于內(nèi)存管理的代碼非常精簡(jiǎn),畢竟相關(guān)的工作已經(jīng)有操作系統(tǒng)進(jìn)行托管。
* MongoDB服務(wù)器使用的虛擬內(nèi)存將非常巨大,并將超過(guò)整個(gè)數(shù)據(jù)文件的大小。不用擔(dān)心,操作系統(tǒng)會(huì)去處理這一切。
* MongoDB無(wú)法控制數(shù)據(jù)寫入磁盤的順序,這樣將導(dǎo)致MongoDB無(wú)法實(shí)現(xiàn)writeahead日志的特性。所以,如果MongoDB希望提供一種durability的特性(這一特性可以參考我寫的關(guān)于Cassandra文章:http://www.cnblogs.com/gpcuster/tag/Cassandra/),需要實(shí)現(xiàn)另外一種存儲(chǔ)引擎。
* 32位系統(tǒng)的MongoDB服務(wù)器每一個(gè)Mongod實(shí)例只能使用2G的數(shù)據(jù)文件。這是由于地址指針只能支持32位。

其他
在《MongoDB The Definitive Guide》中介紹的MongoDB內(nèi)部構(gòu)造只有這么多,如果真要把它說(shuō)清楚,可能需要另外一本書來(lái)專門講述了。比如內(nèi)部的JS解析,查詢的優(yōu)化,索引的建立等等。有興趣的朋友可以直接參考源代碼


論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-02-24 17:44 |只看該作者
謝謝分享
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP