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

下載本文檔

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

文檔簡介

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

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

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

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

file

SSD

Journal

HDDLog

HDD優(yōu)化的IO部署方案mongodDatafile

SSDJournalHD數(shù)據(jù)IO:隨機(jī)訪問為主{

x:

12

}DiskLoc:

xxRead:

DiscLoc:

xxDisckLoc:

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

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

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

每一個(gè)shard包括一個(gè)或多個(gè)服務(wù)和存儲數(shù)據(jù)的mongod進(jìn)程(mongod是MongoDB數(shù)據(jù)的核心進(jìn)程),典型的每個(gè)shard開啟多個(gè)服務(wù)來提高服務(wù)的可用性。這些服務(wù)/mongod進(jìn)程在shard中組成一個(gè)復(fù)制集。硬實(shí)力——負(fù)載均衡2023/1/121一個(gè)典型的集群結(jié)構(gòu)如下:Shards

每一個(gè)shard包括一軟實(shí)力——數(shù)據(jù)類型null

布爾

ture|false整數(shù)

123浮點(diǎn)

12.3字符串

“helloworld”對象ID

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

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

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

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

串長度字符串內(nèi)容參考:/html/3586.htmlLEN=n+5=長度(4字節(jié))+字符串(n字節(jié))+(1字節(jié))2023/1/127字符串表示由于字符采用的UTF-8編碼,目的就是為了實(shí)現(xiàn)字符BSON格式存儲例:{a:'12'}BSON結(jié)構(gòu)如下:Len|vtype|key|0|v|E

長度|value類型|key|0|value|結(jié)束符號

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

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

SELECT*FROMuserMongo:

db.user.find()MySQL:

SELECT*FROMuserWHEREname='foobar'Mongo:

db.user.find({'name':'foobar'})2023/1/137軟實(shí)力——選擇查詢MySQL:2022/12/2737MySQL:

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/1/138MySQL:軟實(shí)力——插入2022/12/2738

MongoDB在執(zhí)行插入時(shí),首先,會將插入的數(shù)據(jù)轉(zhuǎn)換成BSON格式;然后,MongoDB數(shù)據(jù)庫會對BSON進(jìn)行解析,并且檢查是否存在“_id”鍵(_id鍵在插入數(shù)據(jù)庫時(shí)MongoDB會自動生成)。MongoDB還對文檔的大小做了限制。1.8之前的版本,文檔不能超過4MB;1.8之后的版本支持16MB。除了這些之外,沒有別的數(shù)據(jù)校驗(yàn),就是簡單的將文檔原樣存入數(shù)據(jù)庫中。這樣做的壞處是允許插入無限數(shù)據(jù);好處就是不會受到注入式攻擊,讓數(shù)據(jù)庫更加安全。MongoDB在記錄長度變化后,發(fā)現(xiàn)當(dāng)前記錄所在空間后面沒有空余的空間可供其變長。那么這條記錄就會被刪除然后移動到數(shù)據(jù)集的最后。2023/1/139

MySQL:

DELETE*FROMuserMongo:

db.user.remove({})MySQL:

DELETEFROMuserWHEREage<30Mongo:

db.user.remove({'age':{$lt:30}})$gt:>;$gte:>=;$lt:<;$lte:<=;$ne:!=軟實(shí)力——刪除2023/1/140MySQL:軟實(shí)力——刪除2022/12/2740刪除原理位置通過DiskLoc數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲,存儲了數(shù)據(jù)文件編號和塊在文件中的位置,刪除的塊或者域都會在DletedList中標(biāo)記,并不是直接抹掉。2023/1/141刪除原理位置通過DiskLoc數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲,存儲了數(shù)MySQL:

UPDATEuserSET`age`=36WHERE`name`='foobar'Mongo:

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

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

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

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

file

SSD

Journal

HDDLog

HDD優(yōu)化的IO部署方案mongodDatafile

SSDJournalHD數(shù)據(jù)IO:隨機(jī)訪問為主{

x:

12

}DiskLoc:

xxRead:

DiscLoc:

xxDisckLoc:

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

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

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

每一個(gè)shard包括一個(gè)或多個(gè)服務(wù)和存儲數(shù)據(jù)的mongod進(jìn)程(mongod是MongoDB數(shù)據(jù)的核心進(jìn)程),典型的每個(gè)shard開啟多個(gè)服務(wù)來提高服務(wù)的可用性。這些服務(wù)/mongod進(jìn)程在shard中組成一個(gè)復(fù)制集。硬實(shí)力——負(fù)載均衡2023/1/164一個(gè)典型的集群結(jié)構(gòu)如下:Shards

每一個(gè)shard包括一軟實(shí)力——數(shù)據(jù)類型null

布爾

ture|false整數(shù)

123浮點(diǎn)

12.3字符串

“helloworld”對象ID

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

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

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

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

串長度字符串內(nèi)容參考:/html/3586.htmlLEN=n+5=長度(4字節(jié))+字符串(n字節(jié))+(1字節(jié))2023/1/170字符串表示由于字符采用的UTF-8編碼,目的就是為了實(shí)現(xiàn)字符BSON格式存儲例:{a:'12'}BSON結(jié)構(gòu)如下:Len|vtype|key|0|v|E

長度|value類型|key|0|value|結(jié)束符號

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

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

SELECT*FROMuserMongo:

db.user.find()MySQL:

SELECT*FROMuserWHEREname='foobar'Mongo:

db.user.find({'name':'foobar'})2023/1/180軟實(shí)力——選擇查詢MySQL:2022/12/2737MySQL:

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

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

ALTERTABLEuser….ButinMongo,youcanjust:

db.user

溫馨提示

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

最新文檔

評論

0/150

提交評論