大數(shù)據(jù)技術(shù)原理與應(yīng)用第五章NoSQL數(shù)據(jù)庫(kù)_第1頁(yè)
大數(shù)據(jù)技術(shù)原理與應(yīng)用第五章NoSQL數(shù)據(jù)庫(kù)_第2頁(yè)
大數(shù)據(jù)技術(shù)原理與應(yīng)用第五章NoSQL數(shù)據(jù)庫(kù)_第3頁(yè)
大數(shù)據(jù)技術(shù)原理與應(yīng)用第五章NoSQL數(shù)據(jù)庫(kù)_第4頁(yè)
大數(shù)據(jù)技術(shù)原理與應(yīng)用第五章NoSQL數(shù)據(jù)庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩67頁(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)介

第5章NoSQL數(shù)據(jù)庫(kù)提綱5.1NoSQL簡(jiǎn)介5.2NoSQL興起的原因5.3NoSQL與關(guān)系數(shù)據(jù)庫(kù)的比較5.4NoSQL的四大類型5.5NoSQL的三大基石5.6從NoSQL到NewSQL數(shù)據(jù)庫(kù)5.7文檔數(shù)據(jù)庫(kù)MongoDB本章小結(jié)5.1NoSQL簡(jiǎn)介通常,NoSQL數(shù)據(jù)庫(kù)具有以下幾個(gè)特點(diǎn):(1)靈活的可擴(kuò)展性(2)靈活的數(shù)據(jù)模型(3)與云計(jì)算緊密融合5.1NoSQL簡(jiǎn)介現(xiàn)在已經(jīng)有很多公司使用了NoSQL數(shù)據(jù)庫(kù):GoogleFacebookMozillaAdobeFoursquareLinkedInDiggMcGraw-HillEducationVermontPublicRadio百度、騰訊、阿里、新浪、華為……5.2NoSQL興起的原因1、關(guān)系數(shù)據(jù)庫(kù)已經(jīng)無(wú)法滿足Web2.0的需求。主要表現(xiàn)在以下幾個(gè)方面:(1)無(wú)法滿足海量數(shù)據(jù)的管理需求(2)無(wú)法滿足數(shù)據(jù)高并發(fā)的需求(3)無(wú)法滿足高可擴(kuò)展性和高可用性的需求5.2NoSQL興起的原因復(fù)雜性:部署、管理、配置很復(fù)雜數(shù)據(jù)庫(kù)復(fù)制:MySQL主備之間采用復(fù)制方式,只能是異步復(fù)制,當(dāng)主庫(kù)壓力較大時(shí)可能產(chǎn)生較大延遲,主備切換可能會(huì)丟失最后一部分更新事務(wù),這時(shí)往往需要人工介入,備份和恢復(fù)不方便擴(kuò)容問(wèn)題:如果系統(tǒng)壓力過(guò)大需要增加新的機(jī)器,這個(gè)過(guò)程涉及數(shù)據(jù)重新劃分,整個(gè)過(guò)程比較復(fù)雜,且容易出錯(cuò)動(dòng)態(tài)數(shù)據(jù)遷移問(wèn)題:如果某個(gè)數(shù)據(jù)庫(kù)組壓力過(guò)大,需要將其中部分?jǐn)?shù)據(jù)遷移出去,遷移過(guò)程需要總控節(jié)點(diǎn)整體協(xié)調(diào),以及數(shù)據(jù)庫(kù)節(jié)點(diǎn)的配合。這個(gè)過(guò)程很難做到自動(dòng)化MySQL集群是否可以完全解決問(wèn)題?5.2NoSQL興起的原因MySQL集群是否可以完全解決問(wèn)題?5.2NoSQL興起的原因2、“Onesizefitsall”模式很難適用于截然不同的業(yè)務(wù)場(chǎng)景關(guān)系模型作為統(tǒng)一的數(shù)據(jù)模型既被用于數(shù)據(jù)分析,也被用于在線業(yè)務(wù)。但這兩者一個(gè)強(qiáng)調(diào)高吞吐,一個(gè)強(qiáng)調(diào)低延時(shí),已經(jīng)演化出完全不同的架構(gòu)。用同一套模型來(lái)抽象顯然是不合適的Hadoop就是針對(duì)數(shù)據(jù)分析MongoDB、Redis等是針對(duì)在線業(yè)務(wù),兩者都拋棄了關(guān)系模型5.2NoSQL興起的原因3、關(guān)系數(shù)據(jù)庫(kù)的關(guān)鍵特性包括完善的事務(wù)機(jī)制和高效的查詢機(jī)制。但是,關(guān)系數(shù)據(jù)庫(kù)引以為傲的兩個(gè)關(guān)鍵特性,到了Web2.0時(shí)代卻成了雞肋,主要表現(xiàn)在以下幾個(gè)方面:(1)Web2.0網(wǎng)站系統(tǒng)通常不要求嚴(yán)格的數(shù)據(jù)庫(kù)事務(wù)(2)Web2.0并不要求嚴(yán)格的讀寫實(shí)時(shí)性(3)Web2.0通常不包含大量復(fù)雜的SQL查詢(去結(jié)構(gòu)化,存儲(chǔ)空間換取更好的查詢性能)5.3NoSQL與關(guān)系數(shù)據(jù)庫(kù)的比較比較標(biāo)準(zhǔn)RDBMSNoSQL備注數(shù)據(jù)庫(kù)原理完全支持部分支持RDBMS有關(guān)系代數(shù)理論作為基礎(chǔ)NoSQL沒(méi)有統(tǒng)一的理論基礎(chǔ)數(shù)據(jù)規(guī)模大超大RDBMS很難實(shí)現(xiàn)橫向擴(kuò)展,縱向擴(kuò)展的空間也比較有限,性能會(huì)隨著數(shù)據(jù)規(guī)模的增大而降低NoSQL可以很容易通過(guò)添加更多設(shè)備來(lái)支持更大規(guī)模的數(shù)據(jù)數(shù)據(jù)庫(kù)模式固定靈活RDBMS需要定義數(shù)據(jù)庫(kù)模式,嚴(yán)格遵守?cái)?shù)據(jù)定義和相關(guān)約束條件NoSQL不存在數(shù)據(jù)庫(kù)模式,可以自由靈活定義并存儲(chǔ)各種不同類型的數(shù)據(jù)查詢效率快可以實(shí)現(xiàn)高效的簡(jiǎn)單查詢,但是不具備高度結(jié)構(gòu)化查詢等特性,復(fù)雜查詢的性能不盡人意RDBMS借助于索引機(jī)制可以實(shí)現(xiàn)快速查詢(包括記錄查詢和范圍查詢)很多NoSQL數(shù)據(jù)庫(kù)沒(méi)有面向復(fù)雜查詢的索引,雖然NoSQL可以使用MapReduce來(lái)加速查詢,但是,在復(fù)雜查詢方面的性能仍然不如RDBMS5.3NoSQL與關(guān)系數(shù)據(jù)庫(kù)的比較比較標(biāo)準(zhǔn)RDBMSNoSQL備注一致性強(qiáng)一致性弱一致性RDBMS嚴(yán)格遵守事務(wù)ACID模型,可以保證事務(wù)強(qiáng)一致性很多NoSQL數(shù)據(jù)庫(kù)放松了對(duì)事務(wù)ACID四性的要求,而是遵守BASE模型,只能保證最終一致性數(shù)據(jù)完整性容易實(shí)現(xiàn)很難實(shí)現(xiàn)任何一個(gè)RDBMS都可以很容易實(shí)現(xiàn)數(shù)據(jù)完整性,比如通過(guò)主鍵或者非空約束來(lái)實(shí)現(xiàn)實(shí)體完整性,通過(guò)主鍵、外鍵來(lái)實(shí)現(xiàn)參照完整性,通過(guò)約束或者觸發(fā)器來(lái)實(shí)現(xiàn)用戶自定義完整性但是,在NoSQL數(shù)據(jù)庫(kù)卻無(wú)法實(shí)現(xiàn)擴(kuò)展性一般好RDBMS很難實(shí)現(xiàn)橫向擴(kuò)展,縱向擴(kuò)展的空間也比較有限NoSQL在設(shè)計(jì)之初就充分考慮了橫向擴(kuò)展的需求,可以很容易通過(guò)添加廉價(jià)設(shè)備實(shí)現(xiàn)擴(kuò)展可用性好很好RDBMS在任何時(shí)候都以保證數(shù)據(jù)一致性為優(yōu)先目標(biāo),其次才是優(yōu)化系統(tǒng)性能,隨著數(shù)據(jù)規(guī)模的增大,RDBMS為了保證嚴(yán)格的一致性,只能提供相對(duì)較弱的可用性大多數(shù)NoSQL都能提供較高的可用性5.3NoSQL與關(guān)系數(shù)據(jù)庫(kù)的比較比較標(biāo)準(zhǔn)RDBMSNoSQL備注標(biāo)準(zhǔn)化是否RDBMS已經(jīng)標(biāo)準(zhǔn)化(SQL)NoSQL還沒(méi)有行業(yè)標(biāo)準(zhǔn),不同的NoSQL數(shù)據(jù)庫(kù)都有自己的查詢語(yǔ)言,很難規(guī)范應(yīng)用程序接口StoneBraker認(rèn)為:NoSQL缺乏統(tǒng)一查詢語(yǔ)言,將會(huì)拖慢NoSQL發(fā)展技術(shù)支持高低RDBMS經(jīng)過(guò)幾十年的發(fā)展,已經(jīng)非常成熟,Oracle等大型廠商都可以提供很好的技術(shù)支持NoSQL在技術(shù)支持方面仍然處于起步階段,還不成熟,缺乏有力的技術(shù)支持可維護(hù)性復(fù)雜復(fù)雜RDBMS需要專門的數(shù)據(jù)庫(kù)管理員(DBA)維護(hù)NoSQL數(shù)據(jù)庫(kù)雖然沒(méi)有DBMS復(fù)雜,也難以維護(hù)5.3NoSQL與關(guān)系數(shù)據(jù)庫(kù)的比較總結(jié)(1)關(guān)系數(shù)據(jù)庫(kù)優(yōu)勢(shì):以完善的關(guān)系代數(shù)理論作為基礎(chǔ),有嚴(yán)格的標(biāo)準(zhǔn),支持事務(wù)ACID四性,借助索引機(jī)制可以實(shí)現(xiàn)高效的查詢,技術(shù)成熟,有專業(yè)公司的技術(shù)支持劣勢(shì):可擴(kuò)展性較差,無(wú)法較好支持海量數(shù)據(jù)存儲(chǔ),數(shù)據(jù)模型過(guò)于死板、無(wú)法較好支持Web2.0應(yīng)用,事務(wù)機(jī)制影響了系統(tǒng)的整體性能等5.3NoSQL與關(guān)系數(shù)據(jù)庫(kù)的比較總結(jié)(2)NoSQL數(shù)據(jù)庫(kù)優(yōu)勢(shì):可以支持超大規(guī)模數(shù)據(jù)存儲(chǔ),靈活的數(shù)據(jù)模型可以很好地支持Web2.0應(yīng)用,具有強(qiáng)大的橫向擴(kuò)展能力等劣勢(shì):缺乏數(shù)學(xué)理論基礎(chǔ),復(fù)雜查詢性能不高,大都不能實(shí)現(xiàn)事務(wù)強(qiáng)一致性,很難實(shí)現(xiàn)數(shù)據(jù)完整性,技術(shù)尚不成熟,缺乏專業(yè)團(tuán)隊(duì)的技術(shù)支持,維護(hù)較困難等5.3NoSQL與關(guān)系數(shù)據(jù)庫(kù)的比較總結(jié)關(guān)系數(shù)據(jù)庫(kù)和NoSQL數(shù)據(jù)庫(kù)各有優(yōu)缺點(diǎn),彼此無(wú)法取代關(guān)系數(shù)據(jù)庫(kù)應(yīng)用場(chǎng)景:電信、銀行等領(lǐng)域的關(guān)鍵業(yè)務(wù)系統(tǒng),需要保證強(qiáng)事務(wù)一致性NoSQL數(shù)據(jù)庫(kù)應(yīng)用場(chǎng)景:互聯(lián)網(wǎng)企業(yè)、傳統(tǒng)企業(yè)的非關(guān)鍵業(yè)務(wù)(比如數(shù)據(jù)分析)5.3NoSQL與關(guān)系數(shù)據(jù)庫(kù)的比較總結(jié)采用混合架構(gòu)案例:亞馬遜公司就使用不同類型的數(shù)據(jù)庫(kù)來(lái)支撐它的電子商務(wù)應(yīng)用對(duì)于“購(gòu)物籃”這種臨時(shí)性數(shù)據(jù),采用鍵值存儲(chǔ)會(huì)更加高效當(dāng)前的產(chǎn)品和訂單信息則適合存放在關(guān)系數(shù)據(jù)庫(kù)中大量的歷史訂單信息則適合保存在類似MongoDB的文檔數(shù)據(jù)庫(kù)中5.4NoSQL的四大類型NoSQL數(shù)據(jù)庫(kù)雖然數(shù)量眾多,但是,歸結(jié)起來(lái),典型的NoSQL數(shù)據(jù)庫(kù)通常包括鍵值數(shù)據(jù)庫(kù)、列族數(shù)據(jù)庫(kù)、文檔數(shù)據(jù)庫(kù)和圖形數(shù)據(jù)庫(kù)5.4NoSQL的四大類型5.4NoSQL的四大類型5.4NoSQL的四大類型文檔數(shù)據(jù)庫(kù)圖數(shù)據(jù)庫(kù)鍵值數(shù)據(jù)庫(kù)列族數(shù)據(jù)庫(kù)5.4.1鍵值數(shù)據(jù)庫(kù)相關(guān)產(chǎn)品Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached數(shù)據(jù)模型鍵/值對(duì)鍵是一個(gè)字符串對(duì)象值可以是任意類型的數(shù)據(jù),比如整型、字符型、數(shù)組、列表、集合等典型應(yīng)用涉及頻繁讀寫、擁有簡(jiǎn)單數(shù)據(jù)模型的應(yīng)用內(nèi)容緩存,比如會(huì)話、配置文件、參數(shù)、購(gòu)物車等存儲(chǔ)配置和用戶數(shù)據(jù)信息的移動(dòng)應(yīng)用優(yōu)點(diǎn)擴(kuò)展性好,靈活性好,大量寫操作時(shí)性能高缺點(diǎn)無(wú)法存儲(chǔ)結(jié)構(gòu)化信息,條件查詢效率較低不適用情形不是通過(guò)鍵而是通過(guò)值來(lái)查:鍵值數(shù)據(jù)庫(kù)根本沒(méi)有通過(guò)值查詢的途徑需要存儲(chǔ)數(shù)據(jù)之間的關(guān)系:在鍵值數(shù)據(jù)庫(kù)中,不能通過(guò)兩個(gè)或兩個(gè)以上的鍵來(lái)關(guān)聯(lián)數(shù)據(jù)需要事務(wù)的支持:在一些鍵值數(shù)據(jù)庫(kù)中,產(chǎn)生故障時(shí),不可以回滾使用者百度云數(shù)據(jù)庫(kù)(Redis)、GitHub(Riak)、BestBuy(Riak)、Twitter(Redis和Memcached)、StackOverFlow(Redis)、Instagram(Redis)、Youtube(Memcached)、Wikipedia(Memcached)5.4.1鍵值數(shù)據(jù)庫(kù)鍵值數(shù)據(jù)庫(kù)成為理想的緩沖層解決方案Redis有時(shí)候會(huì)被人們稱為“強(qiáng)化版的Memcached”支持持久化、數(shù)據(jù)恢復(fù)、更多數(shù)據(jù)類型5.4.2列族數(shù)據(jù)庫(kù)相關(guān)產(chǎn)品BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS數(shù)據(jù)模型列族典型應(yīng)用分布式數(shù)據(jù)存儲(chǔ)與管理數(shù)據(jù)在地理上分布于多個(gè)數(shù)據(jù)中心的應(yīng)用程序可以容忍副本中存在短期不一致情況的應(yīng)用程序擁有動(dòng)態(tài)字段的應(yīng)用程序擁有潛在大量數(shù)據(jù)的應(yīng)用程序,大到幾百TB的數(shù)據(jù)優(yōu)點(diǎn)查找速度快,可擴(kuò)展性強(qiáng),容易進(jìn)行分布式擴(kuò)展,復(fù)雜性低缺點(diǎn)功能較少,大都不支持強(qiáng)事務(wù)一致性不適用情形需要ACID事務(wù)支持的情形,Cassandra等產(chǎn)品就不適用使用者Ebay(Cassandra)、Instagram(Cassandra)、NASA(Cassandra)、Twitter(CassandraandHBase)、Facebook(HBase)、Yahoo!(HBase)5.4.3文檔數(shù)據(jù)庫(kù)“文檔”其實(shí)是一個(gè)數(shù)據(jù)記錄,這個(gè)記錄能夠?qū)Π臄?shù)據(jù)類型和內(nèi)容進(jìn)行“自我描述”。XML文檔、HTML文檔和JSON文檔就屬于這一類。SequoiaDB就是使用JSON格式的文檔數(shù)據(jù)庫(kù),它的存儲(chǔ)的數(shù)據(jù)是這樣的:關(guān)系數(shù)據(jù)庫(kù):必須有schema信息才能理解數(shù)據(jù)的含義學(xué)生(學(xué)號(hào),姓名,性別,年齡,系,年級(jí))(1001,張三,男,20,計(jì)算機(jī),2002)一個(gè)XML文檔:<configuration>

<property>

<name>hbase.rootdir</name>

<value>hdfs://localhost:9000/hbase</value>

</property></configuration>

5.4.3文檔數(shù)據(jù)庫(kù)數(shù)據(jù)是不規(guī)則的,每一條記錄包含了所有的有關(guān)“SequoiaDB”的信息而沒(méi)有任何外部的引用,這條記錄就是“自包含”的這使得記錄很容易完全移動(dòng)到其他服務(wù)器,因?yàn)檫@條記錄的所有信息都包含在里面了,不需要考慮還有信息在別的表沒(méi)有一起遷移走同時(shí),因?yàn)樵谝苿?dòng)過(guò)程中,只有被移動(dòng)的那一條記錄(文檔)需要操作,而不像關(guān)系型中每個(gè)有關(guān)聯(lián)的表都需要鎖住來(lái)保證一致性,這樣一來(lái)ACID的保證就會(huì)變得更快速,讀寫的速度也會(huì)有很大的提升5.4.3文檔數(shù)據(jù)庫(kù)相關(guān)產(chǎn)品MongoDB、CouchDB、Terrastore、ThruDB、RavenDB、SisoDB、RaptorDB、CloudKit、Perservere、Jackrabbit數(shù)據(jù)模型鍵/值值(value)是版本化的文檔典型應(yīng)用存儲(chǔ)、索引并管理面向文檔的數(shù)據(jù)或者類似的半結(jié)構(gòu)化數(shù)據(jù)比如,用于后臺(tái)具有大量讀寫操作的網(wǎng)站、使用JSON數(shù)據(jù)結(jié)構(gòu)的應(yīng)用、使用嵌套結(jié)構(gòu)等非規(guī)范化數(shù)據(jù)的應(yīng)用程序優(yōu)點(diǎn)性能好(高并發(fā)),靈活性高,復(fù)雜性低,數(shù)據(jù)結(jié)構(gòu)靈活提供嵌入式文檔功能,將經(jīng)常查詢的數(shù)據(jù)存儲(chǔ)在同一個(gè)文檔中既可以根據(jù)鍵來(lái)構(gòu)建索引,也可以根據(jù)內(nèi)容構(gòu)建索引缺點(diǎn)缺乏統(tǒng)一的查詢語(yǔ)法不適用情形在不同的文檔上添加事務(wù)。文檔數(shù)據(jù)庫(kù)并不支持文檔間的事務(wù),如果對(duì)這方面有需求則不應(yīng)該選用這個(gè)解決方案使用者百度云數(shù)據(jù)庫(kù)(MongoDB)、SAP(MongoDB)、Codecademy(MongoDB)、Foursquare(MongoDB)、NBCNews(RavenDB)5.4.4圖形數(shù)據(jù)庫(kù)相關(guān)產(chǎn)品Neo4J、OrientDB、InfoGrid、InfiniteGraph、GraphDB數(shù)據(jù)模型圖結(jié)構(gòu)典型應(yīng)用專門用于處理具有高度相互關(guān)聯(lián)關(guān)系的數(shù)據(jù),比較適合于社交網(wǎng)絡(luò)、模式識(shí)別、依賴分析、推薦系統(tǒng)以及路徑尋找等問(wèn)題優(yōu)點(diǎn)靈活性高,支持復(fù)雜的圖形算法,可用于構(gòu)建復(fù)雜的關(guān)系圖譜缺點(diǎn)復(fù)雜性高,只能支持一定的數(shù)據(jù)規(guī)模使用者Adobe(Neo4J)、Cisco(Neo4J)、T-Mobile(Neo4J)5.4.5不同類型數(shù)據(jù)庫(kù)比較分析MySQL產(chǎn)生年代較早,而且隨著LAMP大潮得以成熟。盡管其沒(méi)有什么大的改進(jìn),但是新興的互聯(lián)網(wǎng)使用的最多的數(shù)據(jù)庫(kù)MongoDB是個(gè)新生事物,提供更靈活的數(shù)據(jù)模型、異步提交、地理位置索引等五花十色的功能HBase是個(gè)“仗勢(shì)欺人”的大象兵。依仗著Hadoop的生態(tài)環(huán)境,可以有很好的擴(kuò)展性。但是就像象兵一樣,使用者需要養(yǎng)一頭大象(Hadoop),才能驅(qū)使他Redis是鍵值存儲(chǔ)的代表,功能最簡(jiǎn)單。提供隨機(jī)數(shù)據(jù)存儲(chǔ)。就像一根棒子一樣,沒(méi)有多余的構(gòu)造。但是也正是因此,它的伸縮性特別好。就像悟空手里的金箍棒,大可捅破天,小能成縮成針5.5NoSQL的三大基石5.5.1CAP所謂的CAP指的是:C(Consistency):一致性,是指任何一個(gè)讀操作總是能夠讀到之前完成的寫操作的結(jié)果,也就是在分布式環(huán)境中,多點(diǎn)的數(shù)據(jù)是一致的,或者說(shuō),所有節(jié)點(diǎn)在同一時(shí)間具有相同的數(shù)據(jù)A:(Availability):可用性,是指快速獲取數(shù)據(jù),可以在確定的時(shí)間內(nèi)返回操作結(jié)果,保證每個(gè)請(qǐng)求不管成功或者失敗都有響應(yīng);P(ToleranceofNetworkPartition):分區(qū)容忍性,是指當(dāng)出現(xiàn)網(wǎng)絡(luò)分區(qū)的情況時(shí)(即系統(tǒng)中的一部分節(jié)點(diǎn)無(wú)法和其他節(jié)點(diǎn)進(jìn)行通信),分離的系統(tǒng)也能夠正常運(yùn)行,也就是說(shuō),系統(tǒng)中任意信息的丟失或失敗不會(huì)影響系統(tǒng)的繼續(xù)運(yùn)作。5.5.1CAPCAP理論告訴我們,一個(gè)分布式系統(tǒng)不可能同時(shí)滿足一致性、可用性和分區(qū)容忍性這三個(gè)需求,最多只能同時(shí)滿足其中兩個(gè),正所謂“魚和熊掌不可兼得”。5.5.1CAP(a)初始狀態(tài)一個(gè)犧牲一致性來(lái)?yè)Q取可用性的實(shí)例

5.5.1CAP(b)正常執(zhí)行過(guò)程一個(gè)犧牲一致性來(lái)?yè)Q取可用性的實(shí)例

5.5.1CAP(c)更新傳播失敗時(shí)的執(zhí)行過(guò)程

一個(gè)犧牲一致性來(lái)?yè)Q取可用性的實(shí)例

5.5.1CAP當(dāng)處理CAP的問(wèn)題時(shí),可以有幾個(gè)明顯的選擇:CA:也就是強(qiáng)調(diào)一致性(C)和可用性(A),放棄分區(qū)容忍性(P),最簡(jiǎn)單的做法是把所有與事務(wù)相關(guān)的內(nèi)容都放到同一臺(tái)機(jī)器上。很顯然,這種做法會(huì)嚴(yán)重影響系統(tǒng)的可擴(kuò)展性。傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)(MySQL、SQLServer和PostgreSQL),都采用了這種設(shè)計(jì)原則,因此,擴(kuò)展性都比較差CP:也就是強(qiáng)調(diào)一致性(C)和分區(qū)容忍性(P),放棄可用性(A),當(dāng)出現(xiàn)網(wǎng)絡(luò)分區(qū)的情況時(shí),受影響的服務(wù)需要等待數(shù)據(jù)一致,因此在等待期間就無(wú)法對(duì)外提供服務(wù)AP:也就是強(qiáng)調(diào)可用性(A)和分區(qū)容忍性(P),放棄一致性(C),允許系統(tǒng)返回不一致的數(shù)據(jù)5.5.1CAP圖5-5不同產(chǎn)品在CAP理論下的不同設(shè)計(jì)原則5.5.2BASEACIDBASE原子性(Atomicity)基本可用(Basically

Available)一致性(Consistency)軟狀態(tài)/柔性事務(wù)(Softstate)隔離性(Isolation)最終一致性(Eventualconsistency)持久性(Durable)

說(shuō)起B(yǎng)ASE(BasicallyAvailble,Soft-state,Eventualconsistency),不得不談到ACID。5.5.2BASE一個(gè)數(shù)據(jù)庫(kù)事務(wù)具有ACID四性:A(Atomicity):原子性,是指事務(wù)必須是原子工作單元,對(duì)于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行C(Consistency):一致性,是指事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致?tīng)顟B(tài)I(Isolation):隔離性,是指由并發(fā)事務(wù)所做的修改必須與任何其它并發(fā)事務(wù)所做的修改隔離D(Durability):持久性,是指事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的,該修改即使出現(xiàn)致命的系統(tǒng)故障也將一直保持5.5.2BASEBASE的基本含義是基本可用(BasicallyAvailble)、軟狀態(tài)(Soft-state)和最終一致性(Eventualconsistency):基本可用

基本可用,是指一個(gè)分布式系統(tǒng)的一部分發(fā)生問(wèn)題變得不可用時(shí),其他部分仍然可以正常使用,也就是允許分區(qū)失敗的情形出現(xiàn)軟狀態(tài)

“軟狀態(tài)(soft-state)”是與“硬狀態(tài)(hard-state)”相對(duì)應(yīng)的一種提法。數(shù)據(jù)庫(kù)保存的數(shù)據(jù)是“硬狀態(tài)”時(shí),可以保證數(shù)據(jù)一致性,即保證數(shù)據(jù)一直是正確的?!败洜顟B(tài)”是指狀態(tài)可以有一段時(shí)間不同步,具有一定的滯后性5.5.2BASEBASE的基本含義是基本可用(BasicallyAvailble)、軟狀態(tài)(Soft-state)和最終一致性(Eventualconsistency):最終一致性

一致性的類型包括強(qiáng)一致性和弱一致性,二者的主要區(qū)別在于高并發(fā)的數(shù)據(jù)訪問(wèn)操作下,后續(xù)操作是否能夠獲取最新的數(shù)據(jù)。對(duì)于強(qiáng)一致性而言,當(dāng)執(zhí)行完一次更新操作后,后續(xù)的其他讀操作就可以保證讀到更新后的最新數(shù)據(jù);反之,如果不能保證后續(xù)訪問(wèn)讀到的都是更新后的最新數(shù)據(jù),那么就是弱一致性。而最終一致性只不過(guò)是弱一致性的一種特例,允許后續(xù)的訪問(wèn)操作可以暫時(shí)讀不到更新后的數(shù)據(jù),但是經(jīng)過(guò)一段時(shí)間之后,必須最終讀到更新后的數(shù)據(jù)。最常見(jiàn)的實(shí)現(xiàn)最終一致性的系統(tǒng)是DNS(域名系統(tǒng))。一個(gè)域名更新操作根據(jù)配置的形式被分發(fā)出去,并結(jié)合有過(guò)期機(jī)制的緩存;最終所有的客戶端可以看到最新的值。5.5.3最終一致性

最終一致性根據(jù)更新數(shù)據(jù)后各進(jìn)程訪問(wèn)到數(shù)據(jù)的時(shí)間和方式的不同,又可以區(qū)分為:因果一致性:如果進(jìn)程A通知進(jìn)程B它已更新了一個(gè)數(shù)據(jù)項(xiàng),那么進(jìn)程B的后續(xù)訪問(wèn)將獲得A寫入的最新值。而與進(jìn)程A無(wú)因果關(guān)系的進(jìn)程C的訪問(wèn),仍然遵守一般的最終一致性規(guī)則“讀己之所寫”一致性:可以視為因果一致性的一個(gè)特例。當(dāng)進(jìn)程A自己執(zhí)行一個(gè)更新操作之后,它自己總是可以訪問(wèn)到更新過(guò)的值,絕不會(huì)看到舊值單調(diào)讀一致性:如果進(jìn)程已經(jīng)看到過(guò)數(shù)據(jù)對(duì)象的某個(gè)值,那么任何后續(xù)訪問(wèn)都不會(huì)返回在那個(gè)值之前的值5.5.3最終一致性

最終一致性根據(jù)更新數(shù)據(jù)后各進(jìn)程訪問(wèn)到數(shù)據(jù)的時(shí)間和方式的不同,又可以區(qū)分為:會(huì)話一致性:它把訪問(wèn)存儲(chǔ)系統(tǒng)的進(jìn)程放到會(huì)話(session)的上下文中,只要會(huì)話還存在,系統(tǒng)就保證“讀己之所寫”一致性。如果由于某些失敗情形令會(huì)話終止,就要建立新的會(huì)話,而且系統(tǒng)保證不會(huì)延續(xù)到新的會(huì)話單調(diào)寫一致性:系統(tǒng)保證來(lái)自同一個(gè)進(jìn)程的寫操作順序執(zhí)行。系統(tǒng)必須保證這種程度的一致性,否則就非常難以編程了5.5.3最終一致性如何實(shí)現(xiàn)各種類型的一致性?對(duì)于分布式數(shù)據(jù)系統(tǒng):N—數(shù)據(jù)復(fù)制的份數(shù)W—更新數(shù)據(jù)是需要保證寫完成的節(jié)點(diǎn)數(shù)R—讀取數(shù)據(jù)的時(shí)候需要讀取的節(jié)點(diǎn)數(shù)如果W+R>N,寫的節(jié)點(diǎn)和讀的節(jié)點(diǎn)重疊,則是強(qiáng)一致性。例如對(duì)于典型的一主一備同步復(fù)制的關(guān)系型數(shù)據(jù)庫(kù),N=2,W=2,R=1,則不管讀的是主庫(kù)還是備庫(kù)的數(shù)據(jù),都是一致的。一般設(shè)定是R+W=N+1,這是保證強(qiáng)一致性的最小設(shè)定如果W+R<=N,則是弱一致性。例如對(duì)于一主一備異步復(fù)制的關(guān)系型數(shù)據(jù)庫(kù),N=2,W=1,R=1,則如果讀的是備庫(kù),就可能無(wú)法讀取主庫(kù)已經(jīng)更新過(guò)的數(shù)據(jù),所以是弱一致性。5.5.3最終一致性對(duì)于分布式系統(tǒng),為了保證高可用性,一般設(shè)置N>=3。不同的N,W,R組合,是在可用性和一致性之間取一個(gè)平衡,以適應(yīng)不同的應(yīng)用場(chǎng)景。如果N=W,R=1,任何一個(gè)寫節(jié)點(diǎn)失效,都會(huì)導(dǎo)致寫失敗,因此可用性會(huì)降低,但是由于數(shù)據(jù)分布的N個(gè)節(jié)點(diǎn)是同步寫入的,因此可以保證強(qiáng)一致性。實(shí)例:HBase是借助其底層的HDFS來(lái)實(shí)現(xiàn)其數(shù)據(jù)冗余備份的。HDFS采用的就是強(qiáng)一致性保證。在數(shù)據(jù)沒(méi)有完全同步到N個(gè)節(jié)點(diǎn)前,寫操作是不會(huì)返回成功的。也就是說(shuō)它的W=N,而讀操作只需要讀到一個(gè)值即可,也就是說(shuō)它R=1。像Voldemort,Cassandra和Riak這些類Dynamo的系統(tǒng),通常都允許用戶按需要設(shè)置N,R,W三個(gè)值,即使是設(shè)置成W+R<=N也是可以的。也就是說(shuō)他允許用戶在強(qiáng)一致性和最終一致性之間自由選擇。而在用戶選擇了最終一致性,或者是W<N的強(qiáng)一致性時(shí),則總會(huì)出現(xiàn)一段“各個(gè)節(jié)點(diǎn)數(shù)據(jù)不同步導(dǎo)致系統(tǒng)處理不一致的時(shí)間”。為了提供最終一致性的支持,這些系統(tǒng)會(huì)提供一些工具來(lái)使數(shù)據(jù)更新被最終同步到所有相關(guān)節(jié)點(diǎn)。5.6從NoSQL到NewSQL數(shù)據(jù)庫(kù)圖5-6大數(shù)據(jù)引發(fā)數(shù)據(jù)處理架構(gòu)變革5.6從NoSQL到NewSQL數(shù)據(jù)庫(kù)圖5-7關(guān)系數(shù)據(jù)庫(kù)、NoSQL和NewSQL數(shù)據(jù)庫(kù)產(chǎn)品分類圖5.7文檔數(shù)據(jù)庫(kù)MongoDB5.7.1MongoDB簡(jiǎn)介5.7.2MongoDB概念解析5.7.3安裝MongoDB5.7.1MongoDB簡(jiǎn)介MongoDB是由C++語(yǔ)言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。MongoDB旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB文檔類似于JSON對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。5.7.1MongoDB簡(jiǎn)介5.7.1MongoDB簡(jiǎn)介提供了一個(gè)面向文檔存儲(chǔ),操作起來(lái)比較簡(jiǎn)單和容易可以設(shè)置任何屬性的索引來(lái)實(shí)現(xiàn)更快的排序具有較好的水平可擴(kuò)展性支持豐富的查詢表達(dá)式,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段MongoDB中的Map/Reduce主要是用來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作支持各種編程語(yǔ)言:RUBY,PYTHON,JAVA,C++,PHP,C#等語(yǔ)言MongoDB安裝簡(jiǎn)單主要特點(diǎn)5.7.2MongoDB概念解析SQL術(shù)語(yǔ)/概念MongoDB術(shù)語(yǔ)/概念解釋/說(shuō)明databasedatabase數(shù)據(jù)庫(kù)tablecollection數(shù)據(jù)庫(kù)表/集合rowdocument數(shù)據(jù)記錄行/文檔columnfield數(shù)據(jù)字段/域indexindex索引tablejoins

表連接,MongoDB不支持primarykeyprimarykey主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵在mongodb中基本的概念是文檔、集合、數(shù)據(jù)庫(kù)5.7.2MongoDB概念解析通過(guò)下圖實(shí)例,我們也可以更直觀的的了解MongoDB中的一些概念:iduser_nameemailagecity1MarkHanksmark@25LosAngeles2RichardPeterrichard@31Dallas{"_id":ObjectId("5146bb52d8524270060001f3"),"age":25,"city":"LosAngeles","email":"mark@","user_name":"MarkHanks"}{ "_id":ObjectId("5146bb52d8524270060001f2"), "age":31, "city":"Dallas", "email":"richard@", "user_name":"RichardPeter"}5.7.2MongoDB概念解析舉例2:在一個(gè)關(guān)系型數(shù)據(jù)庫(kù)中,一篇博客(包含文章內(nèi)容、評(píng)論、評(píng)論的投票)會(huì)被打散在多張數(shù)據(jù)表中。在文檔數(shù)據(jù)庫(kù)MongoDB中,能用一個(gè)文檔來(lái)表示一篇博客,評(píng)論與投票作為文檔數(shù)組,放在正文主文檔中。這樣數(shù)據(jù)更易于管理,消除了傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中影響性能和水平擴(kuò)展性的“JOIN”操作。author:blogposts:comments:5.7.2MongoDB概念解析{“id”:1,“author”:”Jane”,“blogposts”:{“tile”:”MyFirstPost”,“comment”:{“by”:”Ada”,”text”:”Goodpost”}}}關(guān)系數(shù)據(jù)庫(kù)中的其中一條記錄,在文檔數(shù)據(jù)庫(kù)MongoDB中的存儲(chǔ)方式類似如下:5.7.2MongoDB概念解析數(shù)據(jù)庫(kù)一個(gè)mongodb中可以建立多個(gè)數(shù)據(jù)庫(kù)。MongoDB的默認(rèn)數(shù)據(jù)庫(kù)為"db",該數(shù)據(jù)庫(kù)存儲(chǔ)在data目錄中。MongoDB的單個(gè)實(shí)例可以容納多個(gè)獨(dú)立的數(shù)據(jù)庫(kù),每一個(gè)都有自己的集合和權(quán)限,不同的數(shù)據(jù)庫(kù)也放置在不同的文件中。5.7.2MongoDB概念解析文檔文檔是一個(gè)鍵值(key-value)對(duì)(即BSON)。MongoDB的文檔不需要設(shè)置相同的字段,并且相同的字段不需要相同的數(shù)據(jù)類型,這與關(guān)系型數(shù)據(jù)庫(kù)有很大的區(qū)別,也是MongoDB非常突出的特點(diǎn)。一個(gè)簡(jiǎn)單的文檔例子如下:{“site”:“”,“name”:“中北大學(xué)軟件學(xué)院實(shí)驗(yàn)室"}

5.7.2MongoDB概念解析下表列出了RDBMS與MongoDB對(duì)應(yīng)的術(shù)語(yǔ):RDBMSMongoDB數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)表格集合行文檔列字段表聯(lián)合嵌入文檔主鍵主鍵(MongoDB提供了key為_(kāi)id)數(shù)據(jù)庫(kù)服務(wù)和客戶端Mysqld/Oraclemongodmysql/sqlplusmongo5.7.2MongoDB概念解析集合集合就是MongoDB文檔組,類似于RDBMS(關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng):RelationalDatabaseManagementSystem)中的表格。集合存在于數(shù)據(jù)庫(kù)中,集合沒(méi)有固定的結(jié)構(gòu),這意味著你在對(duì)集合可以插入不同格式和類型的數(shù)據(jù),但通常情況下我們插入集合的數(shù)據(jù)都會(huì)有一定的關(guān)聯(lián)性。比如,我們可以將以下不同數(shù)據(jù)結(jié)構(gòu)的文檔插入到集合中:{"site":""}{“site”:“”,“name”:“中北大學(xué)軟件學(xué)院實(shí)驗(yàn)室"}

{"site":"","name":"菜鳥教程","num":5}5.7.2MongoDB概念解析MongoDB數(shù)據(jù)類型數(shù)據(jù)類型描述String字符串。存儲(chǔ)數(shù)據(jù)常用的數(shù)據(jù)類型。在MongoDB中,UTF-8編碼的字符串才是合法的。Integer整型數(shù)值。用于存儲(chǔ)數(shù)值。根據(jù)你所采用的服務(wù)器,可分為32位或64位。Boolean布爾值。用于存儲(chǔ)布爾值(真/假)。Double雙精度浮點(diǎn)值。用于存儲(chǔ)浮點(diǎn)值。Min/Maxkeys將一個(gè)值與BSON(二進(jìn)制的JSON)元素的最低值和最高值相對(duì)比。Arrays用于將數(shù)組或列表或多個(gè)值存儲(chǔ)為一個(gè)鍵。Timestamp時(shí)間戳。記錄文檔修改或添加的具體時(shí)間。Object用于內(nèi)嵌文檔。Null用于創(chuàng)建空值。Symbol符號(hào)。該數(shù)據(jù)類型基本上等同于字符串類型,但不同的是,它一般用于采用特殊符號(hào)類型的語(yǔ)言。Date日期時(shí)間。用UNIX時(shí)間格式來(lái)存儲(chǔ)當(dāng)前日期或時(shí)間。你可以指定自己的日期時(shí)間:創(chuàng)建Date對(duì)象,傳入年月日信息。ObjectID對(duì)象ID。用于創(chuàng)建文檔的ID。BinaryData二進(jìn)制數(shù)據(jù)。用于存儲(chǔ)二進(jìn)制數(shù)據(jù)。Code代碼類型。用于在文檔中存儲(chǔ)JavaScript代碼。Regularexpression正則表達(dá)式類型。用于存儲(chǔ)正則表達(dá)式。5.7.3安裝MongoDBWindow平臺(tái)安裝

MongoDBMongoDB提供了可用于32位和64位系統(tǒng)的預(yù)編譯二進(jìn)制包,你可以從MongoDB官網(wǎng)下載安裝,MongoDB預(yù)編譯二進(jìn)制包下載地址:/downloads注意:在MongoDB2.2版本后已經(jīng)不再支持WindowsXP系統(tǒng)。5.7.3安裝MongoDBLinux平臺(tái)安裝MongoDBMongoDB提供了linux平臺(tái)上32位和64位的安裝包,你可以在官網(wǎng)下載安裝包。下載地址:/downloads啟動(dòng)MongoDB服務(wù)只需要在MongoDB安裝目錄的bin目錄下執(zhí)行'mongod'即可5.7.4訪問(wèn)MongoDB

使用MongoDBshell訪問(wèn)MongoDB

使用Java程序訪問(wèn)MongoDB

使用MongoDBshell訪問(wèn)MongoDBmongodb://localhost使用MongoDBshell來(lái)連接MongoDB服務(wù)器使用用戶名和密碼連接登陸到指定數(shù)據(jù)庫(kù):mongodb://admin:123456@localhost/test

使用MongoDBshell訪問(wèn)MongoDBMongoDB創(chuàng)建數(shù)據(jù)庫(kù)MongoDB創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)法格式如下:useDATABASE_NAME如果數(shù)據(jù)庫(kù)不存在,則創(chuàng)建數(shù)據(jù)庫(kù),否則切換到指定數(shù)據(jù)庫(kù)。如果你想查看所有數(shù)據(jù)庫(kù),可以使用

showdbs

命令創(chuàng)建集合MongoDB沒(méi)有單獨(dú)創(chuàng)建集合名的shell命令,在插入數(shù)據(jù)的時(shí)候,MongoDB會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)的集合。

使用MongoDBshell訪問(wèn)MongoDBMongoDB

插入文檔文檔的數(shù)據(jù)結(jié)構(gòu)和JSON基本一樣。所有存儲(chǔ)在集合中的數(shù)據(jù)都是BSON格式。BSON是一種類JSON的一種二進(jìn)制形式的存儲(chǔ)格式,簡(jiǎn)稱BinaryJSON。MongoDB使用insert()或save()方法向集合中插入文檔,語(yǔ)法如下:db.COLLECTION_NAME.insert(document)

使用MongoDBshell訪問(wèn)MongoDB實(shí)例>db.col.insert({title:

'MongoDB教程',

description:

'MongoDB是一個(gè)Nosql數(shù)據(jù)庫(kù)',

by:

‘廈門大學(xué)數(shù)據(jù)庫(kù)實(shí)驗(yàn)室',

url:

'http://',

tags:

['mongodb',

'database',

'NoSQL'],

likes:

100

})

使用Java程序訪問(wèn)MongoDBMongoDBJava環(huán)境配置在Java程序中如果要使用MongoDB,需要確保已經(jīng)安裝了Java環(huán)境及MongoDBJDBC驅(qū)動(dòng)。首先必須下載mongojar包,下載地址:/mongodb/mongo-java-driver/downloads,請(qǐng)確保下載最新版本。需要將mongo.jar包含在你的classpath中使用Java程序訪問(wèn)MongoDB(1)連接數(shù)據(jù)庫(kù)importcom.mongodb.MongoClient;……//這里省略其他需要導(dǎo)入的包publicclassMongoDBJDBC{publicstaticvoidmain(Stringargs[]){try{ //連接到mongodb服務(wù)

MongoClientmongoClient=newMongoClient("localhost",27017);//連接到數(shù)據(jù)庫(kù)

DBdb=mongoClient.getDB("test"); System.out.println("Connecttodatabasesuccessfully");booleanauth=db.authenticate(myUserName,myPassword); System.out.println("Authentication:"+auth);}catch(Exceptione){ System.err.println(e.getClass().getName()+":"+e.getMessage()); }}}使用Java程序訪問(wèn)MongoDB(2)創(chuàng)建集合publicclassMongoDBJDBC{publicstaticvoidmain(Stringargs[]){try{ //連接到mongodb服務(wù)

MongoClientmongoClient=newMongoClient("localhost",27017);//連接到數(shù)據(jù)庫(kù)

DBdb=mongoClient.getDB("test"); System.out.println("Connecttodatabasesuccessfully");booleanauth=db.authenticate(myUserName,myPassword); System.out.println("Authentication:"+auth);

DBCollectioncoll=db.createCollection("mycol"

溫馨提示

  • 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)論