MongoDB概述與存儲(chǔ)結(jié)構(gòu)_第1頁(yè)
MongoDB概述與存儲(chǔ)結(jié)構(gòu)_第2頁(yè)
MongoDB概述與存儲(chǔ)結(jié)構(gòu)_第3頁(yè)
MongoDB概述與存儲(chǔ)結(jié)構(gòu)_第4頁(yè)
MongoDB概述與存儲(chǔ)結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

mongoDB的概述與存儲(chǔ)結(jié)構(gòu)匯報(bào)人:※※※2023/2/4101第一章mongoDB概述02第二章存儲(chǔ)體系結(jié)構(gòu)背后的故事硬實(shí)力軟實(shí)力Contents目錄崛起的法寶2023/2/42背后的故事1崛起的法寶2第一章mongoDB概述2023/2/43背后的故事——Web2.0來(lái)襲1.互聯(lián)網(wǎng)應(yīng)用用戶量劇增2.數(shù)據(jù)量呈幾何級(jí)數(shù)增長(zhǎng)3.高并發(fā)的讀寫(xiě)2023/2/44背后的故事——RDBMS的困境1.數(shù)據(jù)庫(kù)并發(fā)負(fù)載高2.海量數(shù)據(jù)存儲(chǔ)和訪問(wèn)3.數(shù)據(jù)庫(kù)數(shù)據(jù)越來(lái)越大4.事務(wù)管理的負(fù)擔(dān)5.對(duì)關(guān)系型數(shù)據(jù)庫(kù)讀/寫(xiě)實(shí)時(shí)性的忽略6.多表關(guān)聯(lián)查詢(xún)被弱化2023/2/45背后的故事——NoSQL的崛起NoSQL全稱(chēng)是NotOnlySql,指的是非關(guān)系型的數(shù)據(jù)庫(kù)。NoSQL數(shù)據(jù)庫(kù)主要應(yīng)用于web2.0的大規(guī)模系統(tǒng),具有模式靈活、最終一致性、面向海量數(shù)據(jù)、分布式、開(kāi)源、水平可擴(kuò)展、配置簡(jiǎn)單、非關(guān)系型等特點(diǎn)。存儲(chǔ)類(lèi)型NoSQL產(chǎn)品特性列式存儲(chǔ)Hbase、CassandraHypertable按列存儲(chǔ)數(shù)據(jù),最大的特點(diǎn)是方便存儲(chǔ)結(jié)構(gòu)和半結(jié)構(gòu)化數(shù)據(jù),方便做數(shù)據(jù)壓縮,針對(duì)某一列或者某幾列的查詢(xún)有非常大的I/O優(yōu)勢(shì)鍵值存儲(chǔ)Redis、TokyoCabinetTokyoTyrant、Flare可以通過(guò)鍵快速查詢(xún)到值。一般來(lái)說(shuō),存儲(chǔ)不管值的格式,照單全收文檔式存儲(chǔ)MongoDB、CouchDB文檔存儲(chǔ)一般用類(lèi)似JSON格式存儲(chǔ),存儲(chǔ)的內(nèi)容是文檔類(lèi)型的,這樣也就有機(jī)會(huì)對(duì)某些字段建立索引,實(shí)現(xiàn)關(guān)系型數(shù)據(jù)庫(kù)的某些功能對(duì)象式存儲(chǔ)db4oVersant通過(guò)類(lèi)似面向?qū)ο笳Z(yǔ)言的語(yǔ)法操作數(shù)據(jù)庫(kù),通過(guò)對(duì)象的方式存取數(shù)據(jù)2023/2/46背后的故事——mongoDB的前世今生2007年10月,MongoDB由10gen團(tuán)隊(duì)所發(fā)展,2009年2月首度推出MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品MongoDB是由C++語(yǔ)言編寫(xiě)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)MongoDB服務(wù)端可運(yùn)行在Linux、Windows或OS

X平臺(tái),支持32位和64位應(yīng)用2023/2/47崛起的法寶——vsRDBMS2023/2/48崛起的法寶——數(shù)據(jù)模型MongoDB數(shù)據(jù)庫(kù)是一個(gè)面向集合且模式自由的文檔類(lèi)型數(shù)據(jù)庫(kù)。1.面向集合面向集合是指數(shù)據(jù)被分組存在在數(shù)據(jù)集中,被稱(chēng)為一個(gè)集合(Collencton==table)。集合類(lèi)似于關(guān)系型數(shù)據(jù)庫(kù)的表(table),不同于表的是,集合不需要定義任何模式,集合在存儲(chǔ)文檔,一個(gè)文檔類(lèi)似于關(guān)系型數(shù)據(jù)庫(kù)的一條記錄。在MongoDB中,要操作一個(gè)表并不需要?jiǎng)?chuàng)建它,可以直接往集合中插入數(shù)據(jù),如果集合不存在,它會(huì)自動(dòng)創(chuàng)建這個(gè)集合。2.模式自由模式自由就是對(duì)存儲(chǔ)在MongoDB數(shù)據(jù)庫(kù)中的數(shù)據(jù),我們不需要知道它是什么結(jié)構(gòu)(可以是任何的文檔)。3.文檔型文檔型存儲(chǔ)的數(shù)據(jù)是鍵值對(duì)的集合,鍵是字符串,值可以是數(shù)據(jù)類(lèi)型集合中的任意類(lèi)型,包括數(shù)組和文檔。我們把這個(gè)數(shù)據(jù)格式稱(chēng)為BSON(BinarySerializedDocumentNotation)2023/2/49崛起的法寶——功能性1.完整的索引支持:可以對(duì)文檔創(chuàng)建索引,甚至還可以對(duì)內(nèi)嵌文檔以及數(shù)組創(chuàng)建索引。MongoDB的查詢(xún)優(yōu)化器會(huì)自動(dòng)分析查詢(xún)語(yǔ)句,然后生成一個(gè)高效的查詢(xún)集合。2.動(dòng)態(tài)查詢(xún):MongoDB的查詢(xún)指令使用JSON形式,使查詢(xún)表達(dá)式變得非常豐富,還可以非常容易地查詢(xún)文檔中的內(nèi)嵌對(duì)象和數(shù)組。3.查詢(xún)監(jiān)視:MongoDB提供了很多性能監(jiān)視工具,用于分析數(shù)據(jù)庫(kù)操作的性能。

2023/2/410崛起的法寶——功能性(續(xù))4.復(fù)制及自動(dòng)故障轉(zhuǎn)移:MongoDB數(shù)據(jù)庫(kù)支持服務(wù)器之間的復(fù)制,從節(jié)點(diǎn)可以復(fù)制主節(jié)點(diǎn)的數(shù)據(jù),主節(jié)點(diǎn)的所有對(duì)數(shù)據(jù)的操作都會(huì)同步到從節(jié)點(diǎn)。從節(jié)點(diǎn)的數(shù)據(jù)跟主節(jié)點(diǎn)的數(shù)據(jù)是完全一樣的,以作備份。主節(jié)點(diǎn)發(fā)生故障之后,從節(jié)點(diǎn)可以升級(jí)為主節(jié)點(diǎn),也可以通過(guò)從節(jié)點(diǎn)對(duì)故障主節(jié)點(diǎn)進(jìn)行數(shù)據(jù)恢復(fù)。5.高效地傳統(tǒng)存儲(chǔ)方式:支持二進(jìn)制數(shù)據(jù)及大型對(duì)象(如視頻),可以將圖片文件甚至視頻轉(zhuǎn)換成二進(jìn)制的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中。6.自動(dòng)分片以支持云級(jí)別的伸縮性:可以水平擴(kuò)展數(shù)據(jù)庫(kù)集群,動(dòng)態(tài)添加片(服務(wù)器)。2023/2/411崛起的法寶——其他招式1.拓展功能強(qiáng)大2.便于管理3.適用于多種場(chǎng)合2023/2/412硬實(shí)力1軟實(shí)力2第二章存儲(chǔ)結(jié)構(gòu)2023/2/413HDDSSD隨機(jī)訪問(wèn)(IOPS)12512000

(100x)順序讀寫(xiě)(Throughput)~100MB/s~200MB/s(2x)VS.硬實(shí)力——磁盤(pán)數(shù)據(jù)的存儲(chǔ)總離不開(kāi)磁盤(pán),因此mongodb的數(shù)據(jù)存儲(chǔ)設(shè)備當(dāng)然也只能是磁盤(pán)。官方建議采用SSD固態(tài)硬盤(pán)。mongodData

file

SSD

Journal

HDDLog

HDD優(yōu)化的IO部署方案數(shù)據(jù)IO:隨機(jī)訪問(wèn)為主{

x:

12

}DiskLoc:

xxRead:

DiscLoc:

xxDisckLoc:

xx123無(wú)冗余寫(xiě)性能一般寫(xiě)入速度慢條帶化+鏡像性能好+數(shù)據(jù)冗余建議的RAIDLevel硬實(shí)力——存儲(chǔ)引擎存儲(chǔ)引擎是數(shù)據(jù)庫(kù)管理系統(tǒng)的一個(gè)重要組成部分。它的主要職責(zé)就是負(fù)責(zé)把數(shù)據(jù)存儲(chǔ)到硬盤(pán)和把數(shù)據(jù)從硬盤(pán)檢索出來(lái)。MySQL和Riak均支持多個(gè)不同的存儲(chǔ)引擎。不同的存儲(chǔ)引擎對(duì)不同的應(yīng)用需求有特別的優(yōu)化。如某個(gè)存儲(chǔ)引擎可以是專(zhuān)為高并發(fā)寫(xiě)設(shè)計(jì)的,而另一個(gè)則是為高壓縮率設(shè)計(jì)從而達(dá)到節(jié)省磁盤(pán)空間的目標(biāo)。mongoDB默認(rèn)采用的存儲(chǔ)引擎是操作系統(tǒng)底層提供的內(nèi)存映射文件(MMAP)(至今也只有一種)。2023/2/418硬實(shí)力——內(nèi)存映射物理內(nèi)存010000硬盤(pán)480200480虛擬內(nèi)存100000200

mmap()Pagefault,10ms頁(yè)面不在內(nèi)存,缺頁(yè)中斷

10ms頁(yè)面已在內(nèi)存,50us1234硬實(shí)力——故障恢復(fù)復(fù)制集一個(gè)典型的集群結(jié)構(gòu)如下:Shards

每一個(gè)shard包括一個(gè)或多個(gè)服務(wù)和存儲(chǔ)數(shù)據(jù)的mongod進(jìn)程(mongod是MongoDB數(shù)據(jù)的核心進(jìn)程),典型的每個(gè)shard開(kāi)啟多個(gè)服務(wù)來(lái)提高服務(wù)的可用性。這些服務(wù)/mongod進(jìn)程在shard中組成一個(gè)復(fù)制集。硬實(shí)力——負(fù)載均衡2023/2/421軟實(shí)力——數(shù)據(jù)類(lèi)型null

布爾

ture|false整數(shù)

123浮點(diǎn)

12.3字符串

“helloworld”對(duì)象ID

用newObjectId()來(lái)申明。日期用newDate()來(lái)申明時(shí)間戳數(shù)組

[“apple”,”blanan”,”pear”]內(nèi)嵌文檔{“username”:“jone”,“age”:13,“contact”:{“home”:”123”,”moblie”:”456”}}RegExp

正則表達(dá)式/[a-z]/2023/2/422數(shù)字型表示MongoDB對(duì)整型數(shù)字的存儲(chǔ)分兩個(gè)級(jí)別,一個(gè)32位的,一是64位的。浮點(diǎn)數(shù)MongoDB僅支持64位的雙精度浮點(diǎn)數(shù)。整數(shù)表示法:64位浮點(diǎn)數(shù)表示法:0000000000000000000000000000000000000000000000000000000000000001mongo內(nèi)部,所有數(shù)字都是用long存儲(chǔ),所以單個(gè)數(shù)字是8字節(jié)2023/2/423字符型表示MongoDB的所有字符均采用UTF-8編碼。UTF-8(8-bitUnicodeTransformationFormat)是一種針對(duì)Unicode的可變長(zhǎng)度字符編碼,又稱(chēng)萬(wàn)國(guó)碼。由KenThompson于1992年創(chuàng)建?,F(xiàn)在已經(jīng)標(biāo)準(zhǔn)化為RFC3629。UTF-8用1到6個(gè)字節(jié)編碼UNICODE字符。2023/2/424日期表示日期類(lèi)型存儲(chǔ)是從標(biāo)準(zhǔn)紀(jì)元開(kāi)始的毫秒數(shù),不存儲(chǔ)時(shí)區(qū)。JavaScript中,Date對(duì)象用作MongoDB的日期類(lèi)型,由于JavaScript本身的特性,創(chuàng)建一個(gè)Date對(duì)象時(shí),通常會(huì)調(diào)用newDate(…)而不是使用Date(…)。因?yàn)檎{(diào)用Date(…)實(shí)際返回的是對(duì)日期的字符串表示,而不是真正的Date對(duì)象。格式:{“date”:newDate()}

2023/2/425ObjectID詳解不同的機(jī)器都能用全局唯一的同種方法方便的生成它。ObjectId使用12字節(jié)的存儲(chǔ)空間,其生成方式如下:4e931cb6edcd881e1900017f時(shí)間戳機(jī)器IDPID計(jì)數(shù)器時(shí)間戳保證秒級(jí)唯一,機(jī)器ID保證設(shè)計(jì)時(shí)考慮分布式,避免時(shí)鐘同步,PID保證同一臺(tái)服務(wù)器運(yùn)行多個(gè)mongod實(shí)例時(shí)的唯一性,最后的計(jì)數(shù)器保證同一秒內(nèi)的唯一性。2023/2/426字符串表示由于字符采用的UTF-8編碼,目的就是為了實(shí)現(xiàn)字符串的可變格式和可變長(zhǎng)度。\0標(biāo)識(shí)字符

串長(zhǎng)度字符串內(nèi)容參考:/html/3586.htmlLEN=n+5=長(zhǎng)度(4字節(jié))+字符串(n字節(jié))+(1字節(jié))2023/2/427BSON格式存儲(chǔ)例:{a:'12'}BSON結(jié)構(gòu)如下:Len|vtype|key|0|v|E

長(zhǎng)度|value類(lèi)型|key|0|value|結(jié)束符號(hào)

4|1|1|1|2|1=10字節(jié)2023/2/428軟實(shí)力——文件在MongoDB內(nèi)部,每個(gè)數(shù)據(jù)庫(kù)都包含一個(gè).ns文件和一些數(shù)據(jù)文件,而且這些數(shù)據(jù)文件會(huì)隨著數(shù)據(jù)量的增加而變得越來(lái)越多。所以如果系統(tǒng)中有一個(gè)叫做test的數(shù)庫(kù),那么構(gòu)成test這個(gè)數(shù)據(jù)庫(kù)的文件就會(huì)由test.ns,test.0,test.1等等組成。其中*.ns是包含命名空間的文件,保存該數(shù)據(jù)庫(kù)數(shù)據(jù)的相關(guān)信息。*.0和*.1是數(shù)據(jù)文件。32位系統(tǒng)的MongoDB服務(wù)器每一個(gè)Mongod實(shí)例只能使用2G的數(shù)據(jù)文件。這是由于地址指針只能支持32位。2023/2/429命名空間在數(shù)據(jù)文件內(nèi)部,每個(gè)數(shù)據(jù)庫(kù)都是按照命名空間組織的,一種類(lèi)別的數(shù)據(jù)與其他類(lèi)別的分開(kāi)存放。每個(gè)集合的文檔都有自己的命名空間,索引也是。命名空間的元數(shù)據(jù)存放在數(shù)據(jù)庫(kù)的.ns文件中。每個(gè)命名空間的數(shù)據(jù)都被分成若干組,放到數(shù)據(jù)文件的某一區(qū)域內(nèi),這個(gè)區(qū)域稱(chēng)為數(shù)據(jù)域。在圖中可以看到數(shù)據(jù)庫(kù)foo有3個(gè)數(shù)據(jù)文件,其中第

3個(gè)是預(yù)分配的空文件。前兩個(gè)數(shù)據(jù)文件被分成幾個(gè)數(shù)據(jù)域,屬于幾個(gè)不同的命名空間。2023/2/430軟實(shí)力——存儲(chǔ)過(guò)程2023/2/431下圖展示了數(shù)據(jù)庫(kù)是如何跟底層系統(tǒng)打交道的虛擬地址空間2023/2/432內(nèi)部文件格式在名字空間文件中,保存了每個(gè)名字空間的存儲(chǔ)信息元數(shù)據(jù),包括其大小,塊數(shù),第一塊位置,最后一塊位置,被刪除的塊的鏈表以及索引信息2023/2/433塊結(jié)構(gòu)各個(gè)Extent(塊)采用雙鏈表的形式連接2023/2/434塊和記錄各個(gè)文檔數(shù)據(jù)也是采用雙鏈表的形式連接2023/2/435塊相關(guān)特性1.每一條記錄在塊內(nèi)從4的倍數(shù)的字節(jié)處開(kāi)始2.塊的大小不會(huì)動(dòng)態(tài)擴(kuò)增3.盡量數(shù)據(jù)不跨塊,但若記錄的大小大于一個(gè)塊的大小,必然會(huì)跨塊4.相似記錄計(jì)量保持在同一個(gè)塊中2023/2/436軟實(shí)力——選擇查詢(xún)MySQL:

SELECT*FROMuserMongo:

db.user.find()MySQL:

SELECT*FROMuserWHEREname='foobar'Mongo:

db.user.find({'name':'foobar'})2023/2/437MySQL:

INSERTINTOuser(`name`,`age`)values('foobar',25)Mongo:

db.user.insert({'name':'foobar','age':25})ifyouwantaddacolumn`email`onMySQL,youmust:

ALTERTABLEuser….ButinMongo,youcanjust:

db.user.insert({'name':'foobar','age':25,'email':'foo@'})軟實(shí)力——插入2023/2/438

MongoDB在執(zhí)行插入時(shí),首先,會(huì)將插入的數(shù)據(jù)轉(zhuǎn)換成BSON格式;然后,MongoDB數(shù)據(jù)庫(kù)會(huì)對(duì)BSON進(jìn)行解析,并且檢查是否存在“_id”鍵(_id鍵在插入數(shù)據(jù)庫(kù)時(shí)MongoDB會(huì)自動(dòng)生成)。MongoDB還對(duì)文檔的大小做了限制。1.8之前的版本,文檔不能超過(guò)4MB;1.8之后的版本支持16MB。除了這些之外,沒(méi)有別的數(shù)據(jù)校驗(yàn),就是簡(jiǎn)單的將文檔原樣存入數(shù)據(jù)庫(kù)中。這樣做的壞處是允許插入無(wú)限數(shù)據(jù);好處就是不會(huì)受到注入式攻

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論