分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的三要素
前言
CAP 理論指出,在分布式系統(tǒng)中,不能同時(shí)滿足一致性、可用性和分區(qū)容錯(cuò)性,指導(dǎo)了分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的設(shè)計(jì)。
隨著數(shù)據(jù)量和訪問(wèn)量的增加,單機(jī)性能已經(jīng)不能滿足用戶需求,分布式集群存儲(chǔ)成為一種常用方式。把數(shù)據(jù)分布在多臺(tái)存儲(chǔ)節(jié)點(diǎn)上,可以為大規(guī)模應(yīng)用提供大容量、高性能、高可用、 高擴(kuò)展的存儲(chǔ)服務(wù)。而分布式存儲(chǔ)系統(tǒng)就是其具體實(shí)現(xiàn)。
分布式存儲(chǔ)系統(tǒng)的關(guān)鍵三要素:顧客、導(dǎo)購(gòu)與貨架。
什么是分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)?
分布式存儲(chǔ)系統(tǒng)的核心邏輯:將用戶需要存儲(chǔ)的數(shù)據(jù)根據(jù)某種規(guī)則存儲(chǔ)到不同的機(jī)器上,當(dāng)用戶想要獲取指定數(shù)據(jù)時(shí),再按照規(guī)則到存儲(chǔ)數(shù)據(jù)的機(jī)器里獲取。
如下圖所示,當(dāng)用戶(即應(yīng)用程序)想要訪問(wèn)數(shù)據(jù) D,分布式操作引擎通過(guò)一些映射方式,比如 Hash、一致性 Hash、數(shù)據(jù)范圍分類等,將用戶引導(dǎo)至數(shù)據(jù) D 所屬的存儲(chǔ)節(jié)點(diǎn)獲取數(shù)據(jù)。

獲取數(shù)據(jù)的整個(gè)過(guò)程與商店購(gòu)物的過(guò)程類似,顧客到商店購(gòu)物時(shí),導(dǎo)購(gòu)會(huì)根據(jù)顧客想要購(gòu)買的商品引導(dǎo)顧客到相應(yīng)的貨架,然后顧客從這 個(gè)貨架上獲取要購(gòu)買的商品,完成購(gòu)物。這里的顧客就是圖中的應(yīng)用程序,導(dǎo)購(gòu)就相當(dāng)于分布式操作引擎,它會(huì)按照一定的規(guī)則找到相應(yīng)的貨架,貨架就是存儲(chǔ)數(shù)據(jù)的不同機(jī)器節(jié)點(diǎn)。
這個(gè)過(guò)程就是分布式存儲(chǔ)系統(tǒng)中獲取數(shù)據(jù)的通用流程,顧客、導(dǎo)購(gòu)和貨架組成了分布式存儲(chǔ)系統(tǒng)的三要素,分別對(duì)應(yīng)著分布式領(lǐng)域中的數(shù)據(jù)生產(chǎn)者 / 消費(fèi)者、數(shù)據(jù)索引和數(shù)據(jù)存儲(chǔ)。
分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)三要素
顧客就是數(shù)據(jù)的生產(chǎn)者和消費(fèi)者,顧客代表兩類角色,生產(chǎn)者會(huì)生產(chǎn)數(shù)據(jù)(比如, 商店購(gòu)物例子中的供貨商就屬于生產(chǎn)類顧客),將數(shù)據(jù)存儲(chǔ)到分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)中,消費(fèi)者是從分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)中獲取數(shù)據(jù)進(jìn)行消費(fèi)(比如,商店購(gòu)物例子中購(gòu)買商品的用戶就屬于消費(fèi)類顧客);導(dǎo)購(gòu)就是數(shù)據(jù)索引,將訪問(wèn)數(shù)據(jù)的請(qǐng)求轉(zhuǎn)發(fā)到數(shù)據(jù)所在的存儲(chǔ)節(jié)點(diǎn);貨架就是存儲(chǔ)設(shè)備,用于存儲(chǔ)數(shù)據(jù)。
顧客:生產(chǎn)和消費(fèi)數(shù)據(jù)
顧客相當(dāng)于分布式存儲(chǔ)系統(tǒng)中的應(yīng)用程序,而數(shù)據(jù)是應(yīng)用程序的原動(dòng)力。根據(jù)數(shù)據(jù)的產(chǎn)生和使用,顧客分為生產(chǎn)者和消費(fèi)者兩種類型。生產(chǎn)者負(fù)責(zé)給存儲(chǔ)系統(tǒng)添加數(shù)據(jù),而消費(fèi)者則可以使用系統(tǒng)中存儲(chǔ)的數(shù)據(jù)。
就像是火車票存儲(chǔ)系統(tǒng),鐵路局就相當(dāng)于生產(chǎn)者類型的顧客,而乘客就相當(dāng)于消費(fèi)者類型的顧客。鐵路局將各個(gè)線路的火車票信息發(fā)布到訂票網(wǎng)站的后臺(tái)數(shù)據(jù)庫(kù)中,乘客通過(guò)訂票網(wǎng)站訪問(wèn)數(shù)據(jù)庫(kù),來(lái)進(jìn)行查詢余票、訂票、退票等操作。

生產(chǎn)者和消費(fèi)者生產(chǎn)和消費(fèi)的數(shù)據(jù)通常是多種多樣的,不同應(yīng)用場(chǎ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ù)庫(kù)進(jìn)行存儲(chǔ)和查詢。半結(jié)構(gòu)化數(shù)據(jù):指非關(guān)系模型的,有基本固定結(jié)構(gòu)模式的數(shù)據(jù),其特征是數(shù)據(jù)之間關(guān)系比較簡(jiǎn)單。比如 HTML 文檔,使用標(biāo)簽書(shū)寫內(nèi)容。半結(jié)構(gòu)化數(shù)據(jù)大多可以采用鍵值對(duì)形式來(lái)表示,比如 HTML 文檔可以將標(biāo)簽設(shè)置為 key,標(biāo)簽對(duì)應(yīng)的內(nèi)容可以設(shè)置為 value,因此一般采用分布式鍵值系統(tǒng)進(jìn)行存儲(chǔ)和使用。非結(jié)構(gòu)化數(shù)據(jù):指沒(méi)有固定模式的數(shù)據(jù),其特征是數(shù)據(jù)之間關(guān)聯(lián)不大。比如文本數(shù)據(jù)就是一種非結(jié)構(gòu)化數(shù)據(jù)。這種數(shù)據(jù)可以存儲(chǔ)到文檔中,通過(guò) ElasticSearch(一個(gè)分布式全文搜索引擎)等進(jìn)行檢索。
導(dǎo)購(gòu):確定數(shù)據(jù)位置
導(dǎo)購(gòu)是分布式存儲(chǔ)系統(tǒng)必不可少的要素,如果沒(méi)有導(dǎo)購(gòu), 顧客就需要逐個(gè)貨架去尋找自己想要的商品。如果去訂票網(wǎng)站訂火車票,按照自己的需求點(diǎn)擊查詢車票后,系統(tǒng)會(huì)逐個(gè)掃描分布式存儲(chǔ)系統(tǒng)中每臺(tái)機(jī)器的數(shù)據(jù),尋找你想要購(gòu)買的火車票。如果系統(tǒng)中存儲(chǔ)的數(shù)據(jù)不多,響應(yīng)時(shí)間也不會(huì)太長(zhǎng),畢竟計(jì)算機(jī)的速度還是很快的;但如果數(shù)據(jù)分布在幾千臺(tái)甚至上萬(wàn)臺(tái)機(jī)器中,系統(tǒng)逐個(gè)機(jī)器掃描后再給你響應(yīng),嚴(yán)重影響購(gòu)票體驗(yàn)。
因此在分布式存儲(chǔ)系統(tǒng)中,必須有相應(yīng)的數(shù)據(jù)導(dǎo)購(gòu),否則系統(tǒng)響應(yīng)會(huì)很慢,效率很低。為解決這個(gè)問(wèn)題,數(shù)據(jù)分片技術(shù)就走入了分布式存儲(chǔ)系統(tǒng)中。
數(shù)據(jù)分片技術(shù):指分布式存儲(chǔ)系統(tǒng)按照一定的規(guī)則將數(shù)據(jù)存儲(chǔ)到相對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn)中,或者到相對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn)中獲取想要的數(shù)據(jù),優(yōu)點(diǎn):
降低單個(gè)存儲(chǔ)節(jié)點(diǎn)的存儲(chǔ)和訪問(wèn)壓力;通過(guò)規(guī)定好的規(guī)則快速找到數(shù)據(jù)所在的存儲(chǔ)節(jié)點(diǎn),從而大大降低搜索延遲,提高用戶體驗(yàn)。
當(dāng)鐵路局發(fā)布各個(gè)線路的火車票信息時(shí),會(huì)按照一定規(guī)則存儲(chǔ)到相應(yīng)的機(jī)器中, 比如北京到上海的火車票存儲(chǔ)到機(jī)器 A 中,西安到重慶的火車票存儲(chǔ)到機(jī)器 B 中。當(dāng)乘客查詢火車票時(shí),系統(tǒng)就可以根據(jù)查詢條件迅速定位到相對(duì)應(yīng)的存儲(chǔ)機(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ù)分為幾部分存儲(chǔ)到不同的機(jī)器節(jié)點(diǎn)中,就是數(shù)據(jù)分片技術(shù)的一種。當(dāng)查詢數(shù)據(jù)時(shí),系統(tǒng)可以根據(jù)查詢條件迅速找到對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn),從而實(shí)現(xiàn)快速響應(yīng)。 還有其他很多數(shù)據(jù)分片的方案。比如,按照數(shù)據(jù)范圍,采用哈希映射、一致性哈希環(huán)等對(duì)數(shù)據(jù)劃分。
針對(duì)數(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è)子集。
對(duì)于前面講的火車票的案例,按照數(shù)據(jù)范圍分片的話,可以將屬于某條線的所有火車票數(shù)據(jù)劃分到一個(gè)子集或分區(qū)進(jìn)行存儲(chǔ),比如機(jī)器 A 存儲(chǔ)京廣線的火車票數(shù)據(jù),機(jī)器 B 存儲(chǔ)京滬線的火車票數(shù)據(jù)。數(shù)據(jù)范圍的方案是按照范圍或區(qū)間進(jìn)行存儲(chǔ)或查詢。
如圖所示,當(dāng)用戶查詢北京 - 上海的火車票相關(guān)信息時(shí),首先判斷查詢條件屬于哪個(gè)范圍,由于北京 - 上海的火車線路屬于京滬線,因此系統(tǒng)按照規(guī)則將查詢請(qǐng)求轉(zhuǎn)到存取京滬線火車票數(shù)據(jù)的機(jī)器 B,然后由機(jī)器 B 進(jìn)行處理并給用戶返回響應(yīng)結(jié)果。

為了提高分布式系統(tǒng)的可用性與可靠性,除了通過(guò)數(shù)據(jù)分片減少單個(gè)節(jié)點(diǎn)的壓力外,數(shù)據(jù)復(fù)制也是一個(gè)非常重要的方法。數(shù)據(jù)復(fù)制是將數(shù)據(jù)進(jìn)行備份,以使得多個(gè)節(jié)點(diǎn)存儲(chǔ)該數(shù)據(jù)。
數(shù)據(jù)復(fù)制和數(shù)據(jù)分片技術(shù)的區(qū)別:

數(shù)據(jù) A 被拆分為兩部分存儲(chǔ)在兩個(gè)節(jié)點(diǎn) Node1 和 Node2 上,屬于數(shù)據(jù)分片;數(shù)據(jù) B 同一份完整的數(shù)據(jù)在兩個(gè)節(jié)點(diǎn)中均有存儲(chǔ),就屬于數(shù)據(jù)復(fù)制。
在實(shí)際的分布式存儲(chǔ)系統(tǒng)中,數(shù)據(jù)分片和數(shù)據(jù)復(fù)制通常是共存的:
數(shù)據(jù)通過(guò)分片方式存儲(chǔ)到不同的節(jié)點(diǎn)上,以減少單節(jié)點(diǎn)的性能瓶頸問(wèn)題;而數(shù)據(jù)的存儲(chǔ)通常用主備方式保證可靠性,對(duì)每個(gè)節(jié)點(diǎn)上存儲(chǔ)的分片數(shù)據(jù),采用主備方式存儲(chǔ),以保證數(shù)據(jù)的可靠性。主備節(jié)點(diǎn)上數(shù)據(jù)的一致,是通過(guò)數(shù)據(jù)復(fù)制技術(shù)實(shí)現(xiàn)的。
Kafka 集群消息存儲(chǔ)架構(gòu)圖,消息數(shù)據(jù)以 Partition(分區(qū))進(jìn)行存儲(chǔ),一個(gè) Topic(主題)可以由多個(gè) Partition 進(jìn)行存儲(chǔ),Partition 可以分布到多個(gè) Broker 中;同時(shí),Kafka 還提供了 Partition 副本機(jī)制(對(duì)分區(qū)存儲(chǔ)的信息進(jìn)行備份,比如 Broker 1 中的 Topic-1 Partion-0 是對(duì) Broker 0 上的 Topic-1 Partition-0 進(jìn)行的備份),從而保證了消息存儲(chǔ)的可靠性。

貨架:存儲(chǔ)數(shù)據(jù)
貨架是用來(lái)存儲(chǔ)數(shù)據(jù)的,因?yàn)閿?shù)據(jù)是由顧客產(chǎn)生和消費(fèi)的,因此貨架存儲(chǔ)的數(shù)據(jù)類型與顧客產(chǎn)生和消費(fèi)的數(shù)據(jù)類型是一致的,即包括結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。
針對(duì)這三種不同的數(shù)據(jù)類型,存儲(chǔ)“貨架”劃分為三種:
分布式數(shù)據(jù)庫(kù):通過(guò)表格來(lái)存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù),方便查找。常用的分布式數(shù)據(jù)庫(kù)有 MySQL Sharding、Microsoft SQL Azure、Google Spanner、Alibaba OceanBase 等。分布式鍵值系統(tǒng):通過(guò)鍵值對(duì)來(lái)存儲(chǔ)半結(jié)構(gòu)化數(shù)據(jù)。常用的分布式鍵值系統(tǒng)有 Redis、 Memcache 等,可用作緩存系統(tǒng)。分布式存儲(chǔ)系統(tǒng):通過(guò)文件、塊、對(duì)象等來(lái)存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù)。常見(jiàn)的分布式存儲(chǔ)系統(tǒng) 有 Ceph、GFS、HDFS、Swift 等。
對(duì)存儲(chǔ)介質(zhì)的選擇,本質(zhì)是選擇將數(shù)據(jù)存儲(chǔ)在磁盤還是內(nèi)存(緩存) 上:
磁盤存儲(chǔ)量大,但 IO 開(kāi)銷大,訪問(wèn)速度較低,常用于存儲(chǔ)不經(jīng)常使用的數(shù)據(jù)。比如,電商系統(tǒng)中,排名比較靠后或購(gòu)買量比較少、甚至無(wú)人購(gòu)買的商品信息,通常就存儲(chǔ)在磁盤上。內(nèi)存容量小,訪問(wèn)速度快,因此常用于存儲(chǔ)需要經(jīng)常訪問(wèn)的數(shù)據(jù)。比如,電商系統(tǒng)中, 購(gòu)買量比較多或排名比較靠前的商品信息,通常就存儲(chǔ)在內(nèi)存中。
知識(shí)擴(kuò)展:業(yè)界主流的分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)有哪些?
貨架針對(duì)結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù),分別對(duì)應(yīng)不同的“貨架”,即分布式數(shù)據(jù)庫(kù)、分布式鍵值系統(tǒng)和分布式文件系統(tǒng)進(jìn)行存儲(chǔ)。
主流的分布式數(shù)據(jù)庫(kù),主要包括 MySQL Sharding、SQL Azure、 Spanner、OceanBase 等。

主流的分布式存儲(chǔ)系統(tǒng),主要包括 Ceph、GFS、HDFS 和 Swift 等。

總結(jié)
分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的三要素,即顧客、導(dǎo)購(gòu)和貨架,對(duì)應(yīng)到分布式領(lǐng)域的術(shù)語(yǔ)就是數(shù)據(jù)生產(chǎn)者 / 消費(fèi)者、數(shù)據(jù)索引和數(shù)據(jù)存儲(chǔ)。
顧客包括產(chǎn)生數(shù)據(jù)的顧客和消費(fèi)數(shù)據(jù)的顧客兩類;導(dǎo)購(gòu)是數(shù)據(jù)索引引擎,包括數(shù)據(jù)存儲(chǔ)時(shí)確定數(shù)據(jù)位置,以及獲取數(shù)據(jù)時(shí)確定數(shù)據(jù)所在位置;貨架負(fù)責(zé)數(shù)據(jù)存儲(chǔ),包括磁盤、緩存等存儲(chǔ)介質(zhì)等。
不同應(yīng)用場(chǎ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ù)。與之相對(duì)應(yīng)的,貨架也就是數(shù)據(jù)存儲(chǔ)系統(tǒng),也包括三類:分布式數(shù)據(jù)庫(kù)、分布式鍵值系統(tǒng)和分布式文件系統(tǒng)。

到此這篇關(guān)于分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的三要素的文章就介紹到這了,更多相關(guān)分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JDBC大批量寫入數(shù)據(jù)到SQLServer2000,記錄數(shù)大于10000
JDBC大批量寫入數(shù)據(jù)到SQLServer2000,記錄數(shù)大于100002009-12-12
Windows環(huán)境下安裝達(dá)夢(mèng)數(shù)據(jù)庫(kù)的完整步驟
達(dá)夢(mèng)數(shù)據(jù)庫(kù)的安裝大致分為Windows和Linux版本,本文將以dm8 企業(yè)版 Windows_64位 環(huán)境為例,為大家介紹一下達(dá)夢(mèng)數(shù)據(jù)庫(kù)的具體安裝步驟吧2025-03-03
Navicat 導(dǎo)出導(dǎo)入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法
這篇文章主要介紹了Navicat 導(dǎo)出導(dǎo)入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
dbeaver導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)簡(jiǎn)單圖文教程
DBeaver是一款適用于開(kāi)發(fā)人員、數(shù)據(jù)庫(kù)管理員和分析師的多平臺(tái)、多數(shù)據(jù)庫(kù)管理工具,這篇文章主要給大家介紹了關(guān)于dbeaver導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2024-01-01
梧桐數(shù)據(jù)庫(kù)與`mysql`及`oracle`關(guān)于交換服務(wù)器編號(hào)的`SQL`寫法分析(推薦)
本文介紹了如何通過(guò)SQL查詢實(shí)現(xiàn)服務(wù)器編號(hào)的交換操作,以優(yōu)化數(shù)據(jù)中心內(nèi)部服務(wù)器的布局,文章說(shuō)明了不同數(shù)據(jù)庫(kù)(如梧桐數(shù)據(jù)庫(kù)、MySQL和Oracle)的建表語(yǔ)句、數(shù)據(jù)插入以及SQL實(shí)現(xiàn)思路,通過(guò)具體的SQL查詢,文章展示了如何在不同數(shù)據(jù)庫(kù)中交換服務(wù)器編號(hào),并解釋了每個(gè)部分的功能2024-11-11

