本章主要深入探究磁盤存儲(chǔ)與內(nèi)存存儲(chǔ)在大數(shù)據(jù)架構(gòu)中的應(yīng)用垦沉。分別講解磁盤存儲(chǔ)設(shè)備和內(nèi)存存儲(chǔ)設(shè)備煌抒。這一章體量略大,分兩篇來寫厕倍。
1. 磁盤存儲(chǔ)設(shè)備
磁盤存儲(chǔ)方式通常是指用低成本的硬盤進(jìn)行長期存儲(chǔ)寡壮。磁盤存儲(chǔ)可應(yīng)用于分布式文件系統(tǒng)或數(shù)據(jù)庫中。
1)分布式文件系統(tǒng)
分布式文件系統(tǒng)提供的是一種無預(yù)定義結(jié)構(gòu)的存儲(chǔ)讹弯,由于可將數(shù)據(jù)復(fù)制到多個(gè)存儲(chǔ)地點(diǎn)诬像,其具有高可用性。分布式文件系統(tǒng)中可存儲(chǔ)非關(guān)系型數(shù)據(jù)庫闸婴,例如半結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)(對(duì)應(yīng)無預(yù)定義結(jié)構(gòu)存儲(chǔ)方式)坏挠,為滿足大數(shù)據(jù)的“velocity”特征,其具有快速讀寫能力邪乍。
分布式文件系統(tǒng)不適合存儲(chǔ)大量的小文件降狠,因?yàn)檫@會(huì)帶來過多的磁盤搜索行為(disk-seek activity),減慢整體的數(shù)據(jù)獲取速度庇楞,也會(huì)帶來過多的同時(shí)處理多個(gè)更小文件的系統(tǒng)開銷榜配。也就是說,分布式文件系統(tǒng)更適用于存儲(chǔ)更少量吕晌,更大的文件蛋褥。多個(gè)小文件通常被組合成大文件進(jìn)行優(yōu)化存儲(chǔ)和處理。
2)RDBMS數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫管理系統(tǒng)適于處理事務(wù)型的工作量睛驳,包括伴有隨機(jī)讀寫操作的小量數(shù)據(jù)烙心。關(guān)系型數(shù)據(jù)庫管理系統(tǒng)遵循ACID原理(詳見《大數(shù)據(jù)導(dǎo)論》讀書筆記——Chapter 5),通常只有一個(gè)節(jié)點(diǎn)(這里可理解為只有一個(gè)存儲(chǔ)節(jié)點(diǎn)乏沸,后面會(huì)描述到有多個(gè)處理節(jié)點(diǎn)淫茵,一個(gè)存儲(chǔ)節(jié)點(diǎn)的場景),因此不支持像分布式文件系統(tǒng)中提供的那種冗余性和容錯(cuò)性蹬跃。
為了能夠處理大量數(shù)據(jù)快速讀寫匙瘪,關(guān)系型數(shù)據(jù)庫也需要擴(kuò)充,RDBMS采取縱向擴(kuò)充而不是橫向擴(kuò)充蝶缀,這是一種成本更高的擴(kuò)充方式丹喻,基于這種情況,RDBMS相對(duì)于分布式文件系統(tǒng)來說翁都,不太適合長期存儲(chǔ)日益累積的數(shù)據(jù)碍论。(數(shù)據(jù)隨時(shí)間不斷積累,RDBMS就需要不斷擴(kuò)充荐吵,而這種擴(kuò)充相對(duì)于分布式文件系統(tǒng)來說骑冗,成本更高赊瞬,所以不適合先煎。)
但需要注意的是贼涩,一些關(guān)系型數(shù)據(jù)庫,例如IBM DB2 pureScale薯蝎、Sybase ASE Cluster Edition遥倦、Oracle Real Application Clusters (RAC)和Microsoft Parallel Data Warehouse(PDW),可在多個(gè)集群上運(yùn)行占锯,但多個(gè)集群共享同一個(gè)存儲(chǔ)設(shè)備袒哥。(也就是多個(gè)處理節(jié)點(diǎn),一個(gè)存儲(chǔ)節(jié)點(diǎn)的場景消略。)
關(guān)系型數(shù)據(jù)庫需要手動(dòng)分片堡称,通常采用一個(gè)應(yīng)用邏輯(application logic),這個(gè)應(yīng)用邏輯主要用于定位數(shù)據(jù)在哪個(gè)分片上艺演。如下圖中的場景却紧,用戶需要讀取id為1和3的數(shù)據(jù),application logic定位所需讀取的數(shù)據(jù)分別在分片A和分片B上胎撤。
關(guān)系型數(shù)據(jù)庫通常要求數(shù)據(jù)具有一定結(jié)構(gòu)晓殊,故不直接支持半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)。這種對(duì)結(jié)構(gòu)的要求會(huì)在插入或更新數(shù)據(jù)時(shí)伤提,增加檢查數(shù)據(jù)的工作量巫俺,降低系統(tǒng)的處理效率。這一特點(diǎn)使關(guān)系型數(shù)據(jù)庫不適用于高速肿男、大量數(shù)據(jù)處理的場景介汹,正是由于這一局限性,傳統(tǒng)的RDBMS通常不被用于大數(shù)據(jù)場景中的主要存儲(chǔ)設(shè)備舶沛。
3)NoSQL數(shù)據(jù)庫
Not-only SQL(NoSQL)指具有高可擴(kuò)展和容錯(cuò)性的下一代非關(guān)系型數(shù)據(jù)庫相關(guān)技術(shù)痴昧。
A.特征:
用于區(qū)分與關(guān)系型RDBMS的不同,但不是所有的NoSQL存儲(chǔ)設(shè)備都有以下全部特征冠王。
a)結(jié)構(gòu)靈活(無預(yù)定義結(jié)構(gòu))——數(shù)據(jù)可以其原始狀態(tài)被存儲(chǔ)
b)scale out(橫向擴(kuò)展)而不是scale up(縱向擴(kuò)展)——對(duì)于NoSQL數(shù)據(jù)庫赶撰,可以通過增加節(jié)點(diǎn)的方式來擴(kuò)充存儲(chǔ)空間,而不是通過用更高性能或容量的節(jié)點(diǎn)來替換現(xiàn)有節(jié)點(diǎn)的方式柱彻。
c)高可用性——建立在提供容錯(cuò)性的集群技術(shù)基礎(chǔ)上豪娜。
d)低操作成本——許多NoSQL數(shù)據(jù)庫建立在開源平臺(tái)上,沒有版權(quán)許可成本哟楷,并可被部署在商用硬件上瘤载。
e)最終一致性——數(shù)據(jù)從多個(gè)節(jié)點(diǎn)上讀取,雖然不會(huì)在一次寫入操作后立即同步卖擅,但所有節(jié)點(diǎn)最終會(huì)達(dá)到一致的狀態(tài)鸣奔。
f)遵從BASE原理墨技,而不是ACID原理——遵從BASE原理要求數(shù)據(jù)庫在網(wǎng)絡(luò)或節(jié)點(diǎn)故障時(shí),維持高可用性挎狸,而不要求數(shù)據(jù)庫的強(qiáng)一致性扣汪。數(shù)據(jù)庫在達(dá)到最終一致性之前,可處于軟一致性或非一致性的狀態(tài)锨匆。因此崭别,對(duì)于CAP定理,NoSQL數(shù)據(jù)庫通常選擇滿足AP或CP恐锣。
g)API驅(qū)動(dòng)的數(shù)據(jù)接入——數(shù)據(jù)接入通常通過基于API的查詢茅主,包括RESTful API等,一些實(shí)現(xiàn)方式可支持類SQL查詢土榴。
h)自動(dòng)分片及復(fù)制——主要用于支持橫向擴(kuò)展性及提供高可用性诀姚。NoSQL存儲(chǔ)設(shè)備自動(dòng)進(jìn)行分片和復(fù)制,將數(shù)據(jù)集橫向拆分玷禽,并復(fù)制到多個(gè)節(jié)點(diǎn)赫段。
i)互相協(xié)調(diào)的緩存——這種特性使NoSQL數(shù)據(jù)庫不需要第三方分布式緩存系統(tǒng),例如Memcached论衍。
j)分布式查詢支持——NoSQL存儲(chǔ)設(shè)備在多個(gè)分片上保持一致性的查詢行為瑞佩。
k)混合持久性——使用NoSQL數(shù)據(jù)庫并不意味著不用傳統(tǒng)RDBMS,事實(shí)上坯台,可以同時(shí)選用NoSQL數(shù)據(jù)庫和RDBMS數(shù)據(jù)庫炬丸,也就是具有混合持久性,在同樣的解決方案結(jié)構(gòu)中使用不同類型的存儲(chǔ)技術(shù)蜒蕾,這種方式可同時(shí)支持結(jié)構(gòu)化數(shù)據(jù)和半/非結(jié)構(gòu)化數(shù)據(jù)稠炬。
l)聚合——關(guān)系型數(shù)據(jù)庫對(duì)于完全標(biāo)準(zhǔn)化的數(shù)據(jù)處理非常高效。與關(guān)系型數(shù)據(jù)庫不同咪啡,NoSQL數(shù)據(jù)庫可存儲(chǔ)非標(biāo)準(zhǔn)化聚合數(shù)據(jù)(包含融合首启、嵌套數(shù)據(jù)的實(shí)體),無需在數(shù)據(jù)庫中的應(yīng)用對(duì)象和數(shù)據(jù)之間進(jìn)行連接或擴(kuò)展映射撤摸。
B.理論基礎(chǔ)
NoSQL數(shù)據(jù)存儲(chǔ)設(shè)備的出現(xiàn)可歸結(jié)于大數(shù)據(jù)的volume毅桃、velocity和variety特征。
a)Volume(數(shù)據(jù)量大)
為降低成本保持商業(yè)競爭力准夷,增長的數(shù)據(jù)量需要高可擴(kuò)展性的存儲(chǔ)設(shè)備钥飞。NoSQL存儲(chǔ)設(shè)備具有橫向擴(kuò)展能力,可滿足這一需求衫嵌,無需昂貴的設(shè)備读宙。
b)Velocity(速度快時(shí)效高)
快速數(shù)據(jù)流需要具有快速存儲(chǔ)寫入能力的數(shù)據(jù)庫NoSQL存儲(chǔ)設(shè)備采用schema-on-read而不是schema-on-write原理,使快速存儲(chǔ)寫入操作成為可能楔绞。NoSQL數(shù)據(jù)存儲(chǔ)設(shè)備有著高可用性结闸,可確保節(jié)點(diǎn)或網(wǎng)絡(luò)故障時(shí)不出現(xiàn)寫入延時(shí)唇兑。
c)Variety(類型繁多)
存儲(chǔ)設(shè)備需要處理多種數(shù)據(jù)類型,包括文件桦锄、email扎附、圖像、視頻以及其他不完整的數(shù)據(jù)察纯。NoSQL數(shù)據(jù)存儲(chǔ)設(shè)備能夠存儲(chǔ)這些不同的數(shù)據(jù)類型帕棉,包括半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)针肥。同時(shí)饼记,當(dāng)數(shù)據(jù)模型隨數(shù)據(jù)集的變化而演變時(shí),NoSQL存儲(chǔ)設(shè)備能夠存儲(chǔ)無定義結(jié)構(gòu)的數(shù)據(jù)和不完整的數(shù)據(jù)并隨之對(duì)這些數(shù)據(jù)的結(jié)構(gòu)進(jìn)行改變慰枕。也就是說具则,NoSQL數(shù)據(jù)庫支持?jǐn)?shù)據(jù)結(jié)構(gòu)演變。
C.類型
基于存儲(chǔ)數(shù)據(jù)類型和方式的不同具帮,NoSQL存儲(chǔ)設(shè)備被分為四種類型:鍵值存儲(chǔ)博肋、文檔存儲(chǔ)、列簇存儲(chǔ)蜂厅、圖存儲(chǔ)匪凡。
D.鍵值存儲(chǔ)
鍵值存儲(chǔ)設(shè)備以鍵值對(duì)(key-value pair)形式存儲(chǔ)數(shù)據(jù),如同哈希表掘猿,表是由value列組成病游,每個(gè)value由key來區(qū)分。鍵值存儲(chǔ)設(shè)備通常不保存索引稠通,所以寫入操作速度較快衬衬,鍵值存儲(chǔ)設(shè)備基于簡單的存儲(chǔ)模型,具有高可擴(kuò)展性改橘。
鍵值存儲(chǔ)設(shè)備可在一個(gè)表中存儲(chǔ)多種數(shù)據(jù)類型滋尉,如下圖:
適用鍵值存儲(chǔ)設(shè)備的場景:
a)非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ);
b)高性能數(shù)據(jù)讀寫需求飞主;
c)value只由key來區(qū)分狮惜;
d)每個(gè)value都是獨(dú)立的個(gè)體,不需要依賴其他value碌识;
e)所有value都一個(gè)相對(duì)簡單的結(jié)構(gòu)碾篡;
f)數(shù)據(jù)操作方式相對(duì)簡單,包括插入丸冕、選擇耽梅、刪除等操作;
g)在應(yīng)用層對(duì)存儲(chǔ)的value進(jìn)行操作胖烛。
不適用鍵值存儲(chǔ)設(shè)備的場景:
a)在搜索或過濾數(shù)據(jù)時(shí)需要使用value的多個(gè)屬性眼姐;
b)在不同的鍵值對(duì)之間存在關(guān)聯(lián)關(guān)系诅迷;
c)需要在一次事務(wù)中同時(shí)更新多個(gè)鍵值對(duì);
d)需要在一次操作中同時(shí)操作多個(gè)鍵值對(duì)众旗;
e)在不同的value中需要保持?jǐn)?shù)據(jù)結(jié)構(gòu)的一致性罢杉;
f)需要同時(shí)更新一個(gè)value 的多個(gè)屬性。
E.文檔存儲(chǔ)
文檔存儲(chǔ)設(shè)備通常也以鍵值對(duì)的形式存儲(chǔ)數(shù)據(jù)贡歧。與鍵值存儲(chǔ)設(shè)備不同的是滩租,value是以文檔的形式存儲(chǔ),并且能夠被在數(shù)據(jù)庫中查詢利朵。這些文檔有著復(fù)雜的嵌套結(jié)構(gòu)律想,例如下圖:
文檔可為文本類型(例如XML或JSON)或二進(jìn)制類型(例如BSON),在同一個(gè)表中绍弟,每個(gè)文檔可以有不同的結(jié)構(gòu)技即。
適用文檔存儲(chǔ)設(shè)備的場景:
a)存儲(chǔ)包含扁平或嵌套結(jié)構(gòu)的半結(jié)構(gòu)化文檔數(shù)據(jù);
b)文檔結(jié)構(gòu)未知或需要變化時(shí)樟遣;
c)需要對(duì)存儲(chǔ)的文檔做部分更新時(shí)而叼;
d)在文檔的不同字段同時(shí)進(jìn)行搜索時(shí);
e)需在序列對(duì)象表中存儲(chǔ)域名對(duì)象豹悬;
f)數(shù)據(jù)操作方式包括插入葵陵、選擇、更新和刪除瞻佛。
不適用文檔存儲(chǔ)設(shè)備的場景:
a)在一次事務(wù)中需要同時(shí)對(duì)多個(gè)文檔進(jìn)行更新脱篙;
b)在一次操作中需要對(duì)多個(gè)文檔進(jìn)行聯(lián)合操作;
c)文件結(jié)構(gòu)在連續(xù)查詢中改變涤久,需要重建查詢涡尘;
d)存儲(chǔ)的數(shù)據(jù)不是自描述的,并且沒有結(jié)構(gòu)參考响迂。
文檔存儲(chǔ)包括MongoDB考抄、CouchDB、和Terrastore蔗彤。
F.列簇存儲(chǔ)
列簇存儲(chǔ)設(shè)備保存數(shù)據(jù)非常類似傳統(tǒng)的RDBMS川梅,與之不同的是,每列是相關(guān)的幾列的組然遏,成為一個(gè)超級(jí)列贫途,如下圖:
每個(gè)超級(jí)列可包括任意數(shù)量的相關(guān)列,作為一個(gè)統(tǒng)一的組進(jìn)行檢索或更新待侵。每一行包括多個(gè)超級(jí)列丢早,并可有不同的列集,支持靈活的結(jié)構(gòu),每一行有一個(gè)key怨酝。列簇存儲(chǔ)設(shè)備支持有隨機(jī)讀寫能力的快速數(shù)據(jù)接入傀缩,在分離的物理文件中存儲(chǔ)不同的列簇,加快查詢響應(yīng)农猬。
適用列簇存儲(chǔ)設(shè)備的場景:
a)需要實(shí)時(shí)隨機(jī)讀寫能力赡艰,并且數(shù)據(jù)有定義的結(jié)構(gòu);
b)數(shù)據(jù)有著扁平結(jié)構(gòu)斤葱,每一行包括多個(gè)列和相互關(guān)聯(lián)數(shù)據(jù)嵌套的組慷垮;
c)支持結(jié)構(gòu)變化,列簇可被增加或刪除揍堕,不會(huì)造成系統(tǒng)故障料身;
d)一些字段被同時(shí)通過字段名來查詢;
e)當(dāng)數(shù)據(jù)包含少量列時(shí)鹤啡,要求存儲(chǔ)的高效使用:只當(dāng)列簇存在時(shí)惯驼,列簇?cái)?shù)據(jù)庫指定存儲(chǔ)空間蹲嚣,當(dāng)列簇為空時(shí)递瑰,不指定存儲(chǔ)空間;
f)數(shù)據(jù)操作方式包括插入隙畜、選擇抖部、更新和刪除。
不適用列簇存儲(chǔ)設(shè)備的場景:
a)要求關(guān)聯(lián)性的數(shù)據(jù)接入议惰,例如:數(shù)據(jù)間的連接慎颗;
b)需要滿足ACID原理;
c)需要存儲(chǔ)二進(jìn)制數(shù)據(jù)言询;
d)需要進(jìn)行SQL兼容性查詢俯萎;
e)查詢方式需要頻繁改變。
列簇存儲(chǔ)包括Cassandra运杭、HBase和Amazon SimpleDB夫啊。
G.圖存儲(chǔ)
圖存儲(chǔ)設(shè)備用于保存內(nèi)部互相關(guān)聯(lián)的實(shí)體。與其他NoSQL存儲(chǔ)設(shè)備不同辆憔,圖存儲(chǔ)設(shè)備關(guān)注實(shí)體的結(jié)構(gòu)撇眯,并存儲(chǔ)實(shí)體間的關(guān)聯(lián)關(guān)系。
實(shí)體被存儲(chǔ)在節(jié)點(diǎn)中(這里的“節(jié)點(diǎn)”不同于集群“節(jié)點(diǎn)”)虱咧,這里的節(jié)點(diǎn)也被叫做vertices熊榛,實(shí)體間的關(guān)聯(lián)關(guān)系被存儲(chǔ)為edges。在RDBMS中腕巡,每個(gè)節(jié)點(diǎn)可被理解為單獨(dú)的一行玄坦,而在圖存儲(chǔ)中,每個(gè)edge能夠定義多個(gè)節(jié)點(diǎn)的關(guān)聯(lián)關(guān)系绘沉。多個(gè)節(jié)點(diǎn)之間可以有多種關(guān)聯(lián)關(guān)系煎楣,這些關(guān)聯(lián)關(guān)系被存儲(chǔ)在多個(gè)edge中云挟。圖存儲(chǔ)中的查詢基于節(jié)點(diǎn)屬性和/或節(jié)點(diǎn)之間的關(guān)聯(lián)關(guān)系,也就是edge转质。edge可以是單方向的或多方向的园欣,定義了節(jié)點(diǎn)查詢中節(jié)點(diǎn)遍歷的方向。通常休蟹,圖存儲(chǔ)設(shè)備遵循ACID原理沸枯。
圖存儲(chǔ)設(shè)備的可利用程度取決于節(jié)點(diǎn)之間edge的數(shù)目和類型,edge的數(shù)目和類型越多赂弓,圖存儲(chǔ)設(shè)備能夠處理的查詢類型越多绑榴。
圖存儲(chǔ)設(shè)備中可以增加新類型的節(jié)點(diǎn),也可以增加節(jié)點(diǎn)之間新的關(guān)聯(lián)關(guān)系盈魁,而不改變數(shù)據(jù)庫結(jié)構(gòu)翔怎。
適用圖存儲(chǔ)設(shè)備的場景:
a)需要存儲(chǔ)相互關(guān)聯(lián)的實(shí)體;
b)需要通過實(shí)體之間的關(guān)系進(jìn)行查詢杨耙;
c)需要查詢相關(guān)實(shí)體的群組橙依;
d)需要查詢實(shí)體的關(guān)聯(lián)關(guān)系页衙;
e)通過視圖來進(jìn)行數(shù)據(jù)挖掘。
不適用圖存儲(chǔ)設(shè)備的場景:
a)大量的實(shí)體屬性或?qū)嶓w間的關(guān)聯(lián)關(guān)系需要被同時(shí)更新;
b)實(shí)體有較多的屬性或嵌套的數(shù)據(jù)刷喜;
c)需要通過實(shí)體屬性或關(guān)聯(lián)關(guān)系屬性來查詢實(shí)體鳞青。
圖存儲(chǔ)包括Neo4J跌宛、Infinite Graph和OrientDB骡尽。
4)NewSQL數(shù)據(jù)庫
NoSQL存儲(chǔ)設(shè)備具有高可擴(kuò)展性、可用性竹祷、容錯(cuò)性和快速讀寫能力谈跛,遵從BASE原理,滿足最終一致性而不是即時(shí)一致性塑陵,所以存在到達(dá)最終一致性之前的軟狀態(tài)感憾。所以,NoSQL數(shù)據(jù)庫不適用于大規(guī)模事務(wù)型系統(tǒng)(事務(wù)型系統(tǒng)對(duì)即時(shí)一致性的要求較高)猿妈。
NewSQL存儲(chǔ)設(shè)備集RDBMS的ACID特征與NoSQL存儲(chǔ)設(shè)備的可擴(kuò)展性和容錯(cuò)性于一體吹菱。NewSQL數(shù)據(jù)庫通常支持SQL標(biāo)準(zhǔn)語法,并在數(shù)據(jù)存儲(chǔ)中采用邏輯關(guān)系數(shù)據(jù)模型彭则。
NewSQL數(shù)據(jù)庫可以被用于有著大量事務(wù)型業(yè)務(wù)的OLTP系統(tǒng)鳍刷,例如銀行系統(tǒng);也可被用于實(shí)時(shí)分析俯抖,一些分析可在內(nèi)存中進(jìn)行输瓜。
NewSQL存儲(chǔ)設(shè)備既提供類似傳統(tǒng)RDBMS相對(duì)簡單的事務(wù)型操作,也提供高可擴(kuò)展性數(shù)據(jù)庫,支持SQL標(biāo)準(zhǔn)語法尤揣。
NewSQL數(shù)據(jù)庫的例子有VoltDB搔啊、NuoDB和InnoDB。
相關(guān)文章:
《大數(shù)據(jù)導(dǎo)論》讀書筆記——Chapter 1
《大數(shù)據(jù)導(dǎo)論》讀書筆記——Chapter 2
Big Data Adoption and Planning Consideration
《大數(shù)據(jù)導(dǎo)論》讀書筆記——Chapter 4
《大數(shù)據(jù)導(dǎo)論》讀書筆記——Chapter 5
《大數(shù)據(jù)導(dǎo)論》讀書筆記——Chapter 6
END
長按二維碼關(guān)注