分布式數(shù)據(jù)存儲系統(tǒng)的三要素
CAP 理論指出,在分布式系統(tǒng)中,不能同時(shí)滿足一致性、可用性和分區(qū)容錯(cuò)性,指導(dǎo)了分布式數(shù)據(jù)存儲系統(tǒng)的設(shè)計(jì)。
隨著數(shù)據(jù)量和訪問量的增加,單機(jī)性能已經(jīng)不能滿足用戶需求,分布式集群存儲成為一種常用方式。把數(shù)據(jù)分布在多臺存儲節(jié)點(diǎn)上,可以為大規(guī)模應(yīng)用提供大容量、高性能、高可用、 高擴(kuò)展的存儲服務(wù)。而分布式存儲系統(tǒng)就是其具體實(shí)現(xiàn)。
分布式存儲系統(tǒng)的關(guān)鍵三要素:顧客、導(dǎo)購與貨架。
什么是分布式數(shù)據(jù)存儲系統(tǒng)?
分布式存儲系統(tǒng)的核心邏輯:將用戶需要存儲的數(shù)據(jù)根據(jù)某種規(guī)則存儲到不同的機(jī)器上,當(dāng)用戶想要獲取指定數(shù)據(jù)時(shí),再按照規(guī)則到存儲數(shù)據(jù)的機(jī)器里獲取。
如下圖所示,當(dāng)用戶(即應(yīng)用程序)想要訪問數(shù)據(jù) D,分布式操作引擎通過一些映射方式,比如 Hash、一致性 Hash、數(shù)據(jù)范圍分類等,將用戶引導(dǎo)至數(shù)據(jù) D 所屬的存儲節(jié)點(diǎn)獲取數(shù)據(jù)。
獲取數(shù)據(jù)的整個(gè)過程與商店購物的過程類似,顧客到商店購物時(shí),導(dǎo)購會根據(jù)顧客想要購買的商品引導(dǎo)顧客到相應(yīng)的貨架,然后顧客從這 個(gè)貨架上獲取要購買的商品,完成購物。這里的顧客就是圖中的應(yīng)用程序,導(dǎo)購就相當(dāng)于分布式操作引擎,它會按照一定的規(guī)則找到相應(yīng)的貨架,貨架就是存儲數(shù)據(jù)的不同機(jī)器節(jié)點(diǎn)。
這個(gè)過程就是分布式存儲系統(tǒng)中獲取數(shù)據(jù)的通用流程,顧客、導(dǎo)購和貨架組成了分布式存儲系統(tǒng)的三要素,分別對應(yīng)著分布式領(lǐng)域中的數(shù)據(jù)生產(chǎn)者 / 消費(fèi)者、數(shù)據(jù)索引和數(shù)據(jù)存儲。
分布式數(shù)據(jù)存儲系統(tǒng)三要素
顧客就是數(shù)據(jù)的生產(chǎn)者和消費(fèi)者,顧客代表兩類角色,生產(chǎn)者會生產(chǎn)數(shù)據(jù)(比如, 商店購物例子中的供貨商就屬于生產(chǎn)類顧客),將數(shù)據(jù)存儲到分布式數(shù)據(jù)存儲系統(tǒng)中,消費(fèi)者是從分布式數(shù)據(jù)存儲系統(tǒng)中獲取數(shù)據(jù)進(jìn)行消費(fèi)(比如,商店購物例子中購買商品的用戶就屬于消費(fèi)類顧客);導(dǎo)購就是數(shù)據(jù)索引,將訪問數(shù)據(jù)的請求轉(zhuǎn)發(fā)到數(shù)據(jù)所在的存儲節(jié)點(diǎn);貨架就是存儲設(shè)備,用于存儲數(shù)據(jù)。
顧客:生產(chǎn)和消費(fèi)數(shù)據(jù)
顧客相當(dāng)于分布式存儲系統(tǒng)中的應(yīng)用程序,而數(shù)據(jù)是應(yīng)用程序的原動(dòng)力。根據(jù)數(shù)據(jù)的產(chǎn)生和使用,顧客分為生產(chǎn)者和消費(fèi)者兩種類型。生產(chǎn)者負(fù)責(zé)給存儲系統(tǒng)添加數(shù)據(jù),而消費(fèi)者則可以使用系統(tǒng)中存儲的數(shù)據(jù)。
就像是火車票存儲系統(tǒng),鐵路局就相當(dāng)于生產(chǎn)者類型的顧客,而乘客就相當(dāng)于消費(fèi)者類型的顧客。鐵路局將各個(gè)線路的火車票信息發(fā)布到訂票網(wǎng)站的后臺數(shù)據(jù)庫中,乘客通過訂票網(wǎng)站訪問數(shù)據(jù)庫,來進(jìn)行查詢余票、訂票、退票等操作。
生產(chǎn)者和消費(fèi)者生產(chǎn)和消費(fèi)的數(shù)據(jù)通常是多種多樣的,不同應(yīng)用場景中數(shù)據(jù)的類型、格式等都不一樣。根據(jù)數(shù)據(jù)的特征,這些不同的數(shù)據(jù)通常被劃分為三類:結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù):
結(jié)構(gòu)化數(shù)據(jù):指關(guān)系模型數(shù)據(jù),其特征是數(shù)據(jù)關(guān)聯(lián)較大、格式固定?;疖嚻毙畔⒈热缙瘘c(diǎn)站、終點(diǎn)站、車次、票價(jià)等,就是一種結(jié)構(gòu)化數(shù)據(jù)。結(jié)構(gòu)化數(shù)據(jù)具有格式固定的特征,因此一般采用分布式關(guān)系數(shù)據(jù)庫進(jìn)行存儲和查詢。半結(jié)構(gòu)化數(shù)據(jù):指非關(guān)系模型的,有基本固定結(jié)構(gòu)模式的數(shù)據(jù),其特征是數(shù)據(jù)之間關(guān)系比較簡單。比如 HTML 文檔,使用標(biāo)簽書寫內(nèi)容。半結(jié)構(gòu)化數(shù)據(jù)大多可以采用鍵值對形式來表示,比如 HTML 文檔可以將標(biāo)簽設(shè)置為 key,標(biāo)簽對應(yīng)的內(nèi)容可以設(shè)置為 value,因此一般采用分布式鍵值系統(tǒng)進(jìn)行存儲和使用。非結(jié)構(gòu)化數(shù)據(jù):指沒有固定模式的數(shù)據(jù),其特征是數(shù)據(jù)之間關(guān)聯(lián)不大。比如文本數(shù)據(jù)就是一種非結(jié)構(gòu)化數(shù)據(jù)。這種數(shù)據(jù)可以存儲到文檔中,通過 ElasticSearch(一個(gè)分布式全文搜索引擎)等進(jìn)行檢索。
導(dǎo)購:確定數(shù)據(jù)位置
導(dǎo)購是分布式存儲系統(tǒng)必不可少的要素,如果沒有導(dǎo)購, 顧客就需要逐個(gè)貨架去尋找自己想要的商品。如果去訂票網(wǎng)站訂火車票,按照自己的需求點(diǎn)擊查詢車票后,系統(tǒng)會逐個(gè)掃描分布式存儲系統(tǒng)中每臺機(jī)器的數(shù)據(jù),尋找你想要購買的火車票。如果系統(tǒng)中存儲的數(shù)據(jù)不多,響應(yīng)時(shí)間也不會太長,畢竟計(jì)算機(jī)的速度還是很快的;但如果數(shù)據(jù)分布在幾千臺甚至上萬臺機(jī)器中,系統(tǒng)逐個(gè)機(jī)器掃描后再給你響應(yīng),嚴(yán)重影響購票體驗(yàn)。
因此在分布式存儲系統(tǒng)中,必須有相應(yīng)的數(shù)據(jù)導(dǎo)購,否則系統(tǒng)響應(yīng)會很慢,效率很低。為解決這個(gè)問題,數(shù)據(jù)分片技術(shù)就走入了分布式存儲系統(tǒng)中。
數(shù)據(jù)分片技術(shù):指分布式存儲系統(tǒng)按照一定的規(guī)則將數(shù)據(jù)存儲到相對應(yīng)的存儲節(jié)點(diǎn)中,或者到相對應(yīng)的存儲節(jié)點(diǎn)中獲取想要的數(shù)據(jù),優(yōu)點(diǎn):
降低單個(gè)存儲節(jié)點(diǎn)的存儲和訪問壓力;通過規(guī)定好的規(guī)則快速找到數(shù)據(jù)所在的存儲節(jié)點(diǎn),從而大大降低搜索延遲,提高用戶體驗(yàn)。
當(dāng)鐵路局發(fā)布各個(gè)線路的火車票信息時(shí),會按照一定規(guī)則存儲到相應(yīng)的機(jī)器中, 比如北京到上海的火車票存儲到機(jī)器 A 中,西安到重慶的火車票存儲到機(jī)器 B 中。當(dāng)乘客查詢火車票時(shí),系統(tǒng)就可以根據(jù)查詢條件迅速定位到相對應(yīng)的存儲機(jī)器,然后將數(shù)據(jù)返回給用戶,響應(yīng)時(shí)間就大大縮短了。如圖所示,當(dāng)查詢北京 - 上海的火車票相關(guān)信息時(shí),可以與機(jī)器 A 進(jìn)行數(shù)據(jù)交互。
例子中按照數(shù)據(jù)起點(diǎn)、終點(diǎn)的方式劃分?jǐn)?shù)據(jù),將數(shù)據(jù)分為幾部分存儲到不同的機(jī)器節(jié)點(diǎn)中,就是數(shù)據(jù)分片技術(shù)的一種。當(dāng)查詢數(shù)據(jù)時(shí),系統(tǒng)可以根據(jù)查詢條件迅速找到對應(yīng)的存儲節(jié)點(diǎn),從而實(shí)現(xiàn)快速響應(yīng)。 還有其他很多數(shù)據(jù)分片的方案。比如,按照數(shù)據(jù)范圍,采用哈希映射、一致性哈希環(huán)等對數(shù)據(jù)劃分。
針對數(shù)據(jù)范圍的數(shù)據(jù)分片方案:按照某種規(guī)則劃分?jǐn)?shù)據(jù)范圍,然后將在這個(gè)范圍內(nèi)的數(shù)據(jù)歸屬到一個(gè)集合中。這就好比數(shù)學(xué)中通常講的整數(shù)區(qū)間,比如 1~1000 的整數(shù),[1,100] 的整數(shù)屬于一個(gè)子集、[101,1000] 的整數(shù)屬于另一個(gè)子集。
對于前面講的火車票的案例,按照數(shù)據(jù)范圍分片的話,可以將屬于某條線的所有火車票數(shù)據(jù)劃分到一個(gè)子集或分區(qū)進(jìn)行存儲,比如機(jī)器 A 存儲京廣線的火車票數(shù)據(jù),機(jī)器 B 存儲京滬線的火車票數(shù)據(jù)。數(shù)據(jù)范圍的方案是按照范圍或區(qū)間進(jìn)行存儲或查詢。
如圖所示,當(dāng)用戶查詢北京 - 上海的火車票相關(guān)信息時(shí),首先判斷查詢條件屬于哪個(gè)范圍,由于北京 - 上海的火車線路屬于京滬線,因此系統(tǒng)按照規(guī)則將查詢請求轉(zhuǎn)到存取京滬線火車票數(shù)據(jù)的機(jī)器 B,然后由機(jī)器 B 進(jìn)行處理并給用戶返回響應(yīng)結(jié)果。
為了提高分布式系統(tǒng)的可用性與可靠性,除了通過數(shù)據(jù)分片減少單個(gè)節(jié)點(diǎn)的壓力外,數(shù)據(jù)復(fù)制也是一個(gè)非常重要的方法。數(shù)據(jù)復(fù)制是將數(shù)據(jù)進(jìn)行備份,以使得多個(gè)節(jié)點(diǎn)存儲該數(shù)據(jù)。
數(shù)據(jù)復(fù)制和數(shù)據(jù)分片技術(shù)的區(qū)別:
數(shù)據(jù) A 被拆分為兩部分存儲在兩個(gè)節(jié)點(diǎn) Node1 和 Node2 上,屬于數(shù)據(jù)分片;數(shù)據(jù) B 同一份完整的數(shù)據(jù)在兩個(gè)節(jié)點(diǎn)中均有存儲,就屬于數(shù)據(jù)復(fù)制。
在實(shí)際的分布式存儲系統(tǒng)中,數(shù)據(jù)分片和數(shù)據(jù)復(fù)制通常是共存的:
數(shù)據(jù)通過分片方式存儲到不同的節(jié)點(diǎn)上,以減少單節(jié)點(diǎn)的性能瓶頸問題;而數(shù)據(jù)的存儲通常用主備方式保證可靠性,對每個(gè)節(jié)點(diǎn)上存儲的分片數(shù)據(jù),采用主備方式存儲,以保證數(shù)據(jù)的可靠性。主備節(jié)點(diǎn)上數(shù)據(jù)的一致,是通過數(shù)據(jù)復(fù)制技術(shù)實(shí)現(xiàn)的。
Kafka 集群消息存儲架構(gòu)圖,消息數(shù)據(jù)以 Partition(分區(qū))進(jìn)行存儲,一個(gè) Topic(主題)可以由多個(gè) Partition 進(jìn)行存儲,Partition 可以分布到多個(gè) Broker 中;同時(shí),Kafka 還提供了 Partition 副本機(jī)制(對分區(qū)存儲的信息進(jìn)行備份,比如 Broker 1 中的 Topic-1 Partion-0 是對 Broker 0 上的 Topic-1 Partition-0 進(jìn)行的備份),從而保證了消息存儲的可靠性。
貨架:存儲數(shù)據(jù)
貨架是用來存儲數(shù)據(jù)的,因?yàn)閿?shù)據(jù)是由顧客產(chǎn)生和消費(fèi)的,因此貨架存儲的數(shù)據(jù)類型與顧客產(chǎn)生和消費(fèi)的數(shù)據(jù)類型是一致的,即包括結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。
針對這三種不同的數(shù)據(jù)類型,存儲“貨架”劃分為三種:
分布式數(shù)據(jù)庫:通過表格來存儲結(jié)構(gòu)化數(shù)據(jù),方便查找。常用的分布式數(shù)據(jù)庫有 MySQL Sharding、Microsoft SQL Azure、Google Spanner、Alibaba OceanBase 等。分布式鍵值系統(tǒng):通過鍵值對來存儲半結(jié)構(gòu)化數(shù)據(jù)。常用的分布式鍵值系統(tǒng)有 Redis、 Memcache 等,可用作緩存系統(tǒng)。分布式存儲系統(tǒng):通過文件、塊、對象等來存儲非結(jié)構(gòu)化數(shù)據(jù)。常見的分布式存儲系統(tǒng) 有 Ceph、GFS、HDFS、Swift 等。
對存儲介質(zhì)的選擇,本質(zhì)是選擇將數(shù)據(jù)存儲在磁盤還是內(nèi)存(緩存) 上:
磁盤存儲量大,但 IO 開銷大,訪問速度較低,常用于存儲不經(jīng)常使用的數(shù)據(jù)。比如,電商系統(tǒng)中,排名比較靠后或購買量比較少、甚至無人購買的商品信息,通常就存儲在磁盤上。內(nèi)存容量小,訪問速度快,因此常用于存儲需要經(jīng)常訪問的數(shù)據(jù)。比如,電商系統(tǒng)中, 購買量比較多或排名比較靠前的商品信息,通常就存儲在內(nèi)存中。
知識擴(kuò)展:業(yè)界主流的分布式數(shù)據(jù)存儲系統(tǒng)有哪些?
貨架針對結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù),分別對應(yīng)不同的“貨架”,即分布式數(shù)據(jù)庫、分布式鍵值系統(tǒng)和分布式文件系統(tǒng)進(jìn)行存儲。
主流的分布式數(shù)據(jù)庫,主要包括 MySQL Sharding、SQL Azure、 Spanner、OceanBase 等。
主流的分布式存儲系統(tǒng),主要包括 Ceph、GFS、HDFS 和 Swift 等。
總結(jié)
分布式數(shù)據(jù)存儲系統(tǒng)的三要素,即顧客、導(dǎo)購和貨架,對應(yīng)到分布式領(lǐng)域的術(shù)語就是數(shù)據(jù)生產(chǎn)者 / 消費(fèi)者、數(shù)據(jù)索引和數(shù)據(jù)存儲。
顧客包括產(chǎn)生數(shù)據(jù)的顧客和消費(fèi)數(shù)據(jù)的顧客兩類;導(dǎo)購是數(shù)據(jù)索引引擎,包括數(shù)據(jù)存儲時(shí)確定數(shù)據(jù)位置,以及獲取數(shù)據(jù)時(shí)確定數(shù)據(jù)所在位置;貨架負(fù)責(zé)數(shù)據(jù)存儲,包括磁盤、緩存等存儲介質(zhì)等。
不同應(yīng)用場景中,顧客產(chǎn)生的數(shù)據(jù)類型、格式等通常都不一樣。根據(jù)數(shù)據(jù)的特征,這些不同的數(shù)據(jù)可以被劃分為三類:結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。與之相對應(yīng)的,貨架也就是數(shù)據(jù)存儲系統(tǒng),也包括三類:分布式數(shù)據(jù)庫、分布式鍵值系統(tǒng)和分布式文件系統(tǒng)。
到此這篇關(guān)于分布式數(shù)據(jù)存儲系統(tǒng)的三要素的文章就介紹到這了,更多相關(guān)分布式數(shù)據(jù)存儲系統(tǒng)內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。