分布式數(shù)據(jù)存儲系統(tǒng)的三要素
前言
CAP 理論指出,在分布式系統(tǒng)中,不能同時滿足一致性、可用性和分區(qū)容錯性,指導(dǎo)了分布式數(shù)據(jù)存儲系統(tǒng)的設(shè)計。
隨著數(shù)據(jù)量和訪問量的增加,單機(jī)性能已經(jīng)不能滿足用戶需求,分布式集群存儲成為一種常用方式。把數(shù)據(jù)分布在多臺存儲節(jié)點上,可以為大規(guī)模應(yīng)用提供大容量、高性能、高可用、 高擴(kuò)展的存儲服務(wù)。而分布式存儲系統(tǒng)就是其具體實現(xiàn)。
分布式存儲系統(tǒng)的關(guān)鍵三要素:顧客、導(dǎo)購與貨架。
什么是分布式數(shù)據(jù)存儲系統(tǒng)?
分布式存儲系統(tǒng)的核心邏輯:將用戶需要存儲的數(shù)據(jù)根據(jù)某種規(guī)則存儲到不同的機(jī)器上,當(dāng)用戶想要獲取指定數(shù)據(jù)時,再按照規(guī)則到存儲數(shù)據(jù)的機(jī)器里獲取。
如下圖所示,當(dāng)用戶(即應(yīng)用程序)想要訪問數(shù)據(jù) D,分布式操作引擎通過一些映射方式,比如 Hash、一致性 Hash、數(shù)據(jù)范圍分類等,將用戶引導(dǎo)至數(shù)據(jù) D 所屬的存儲節(jié)點獲取數(shù)據(jù)。
獲取數(shù)據(jù)的整個過程與商店購物的過程類似,顧客到商店購物時,導(dǎo)購會根據(jù)顧客想要購買的商品引導(dǎo)顧客到相應(yīng)的貨架,然后顧客從這 個貨架上獲取要購買的商品,完成購物。這里的顧客就是圖中的應(yīng)用程序,導(dǎo)購就相當(dāng)于分布式操作引擎,它會按照一定的規(guī)則找到相應(yīng)的貨架,貨架就是存儲數(shù)據(jù)的不同機(jī)器節(jié)點。
這個過程就是分布式存儲系統(tǒng)中獲取數(shù)據(jù)的通用流程,顧客、導(dǎo)購和貨架組成了分布式存儲系統(tǒng)的三要素,分別對應(yīng)著分布式領(lǐng)域中的數(shù)據(jù)生產(chǎn)者 / 消費者、數(shù)據(jù)索引和數(shù)據(jù)存儲。
分布式數(shù)據(jù)存儲系統(tǒng)三要素
顧客就是數(shù)據(jù)的生產(chǎn)者和消費者,顧客代表兩類角色,生產(chǎn)者會生產(chǎn)數(shù)據(jù)(比如, 商店購物例子中的供貨商就屬于生產(chǎn)類顧客),將數(shù)據(jù)存儲到分布式數(shù)據(jù)存儲系統(tǒng)中,消費者是從分布式數(shù)據(jù)存儲系統(tǒng)中獲取數(shù)據(jù)進(jìn)行消費(比如,商店購物例子中購買商品的用戶就屬于消費類顧客);導(dǎo)購就是數(shù)據(jù)索引,將訪問數(shù)據(jù)的請求轉(zhuǎn)發(fā)到數(shù)據(jù)所在的存儲節(jié)點;貨架就是存儲設(shè)備,用于存儲數(shù)據(jù)。
顧客:生產(chǎn)和消費數(shù)據(jù)
顧客相當(dāng)于分布式存儲系統(tǒng)中的應(yīng)用程序,而數(shù)據(jù)是應(yīng)用程序的原動力。根據(jù)數(shù)據(jù)的產(chǎn)生和使用,顧客分為生產(chǎn)者和消費者兩種類型。生產(chǎn)者負(fù)責(zé)給存儲系統(tǒng)添加數(shù)據(jù),而消費者則可以使用系統(tǒng)中存儲的數(shù)據(jù)。
就像是火車票存儲系統(tǒng),鐵路局就相當(dāng)于生產(chǎn)者類型的顧客,而乘客就相當(dāng)于消費者類型的顧客。鐵路局將各個線路的火車票信息發(fā)布到訂票網(wǎng)站的后臺數(shù)據(jù)庫中,乘客通過訂票網(wǎng)站訪問數(shù)據(jù)庫,來進(jìn)行查詢余票、訂票、退票等操作。
生產(chǎn)者和消費者生產(chǎn)和消費的數(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站、終點站、車次、票價等,就是一種結(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(一個分布式全文搜索引擎)等進(jìn)行檢索。
導(dǎo)購:確定數(shù)據(jù)位置
導(dǎo)購是分布式存儲系統(tǒng)必不可少的要素,如果沒有導(dǎo)購, 顧客就需要逐個貨架去尋找自己想要的商品。如果去訂票網(wǎng)站訂火車票,按照自己的需求點擊查詢車票后,系統(tǒng)會逐個掃描分布式存儲系統(tǒng)中每臺機(jī)器的數(shù)據(jù),尋找你想要購買的火車票。如果系統(tǒng)中存儲的數(shù)據(jù)不多,響應(yīng)時間也不會太長,畢竟計算機(jī)的速度還是很快的;但如果數(shù)據(jù)分布在幾千臺甚至上萬臺機(jī)器中,系統(tǒng)逐個機(jī)器掃描后再給你響應(yīng),嚴(yán)重影響購票體驗。
因此在分布式存儲系統(tǒng)中,必須有相應(yīng)的數(shù)據(jù)導(dǎo)購,否則系統(tǒng)響應(yīng)會很慢,效率很低。為解決這個問題,數(shù)據(jù)分片技術(shù)就走入了分布式存儲系統(tǒng)中。
數(shù)據(jù)分片技術(shù):指分布式存儲系統(tǒng)按照一定的規(guī)則將數(shù)據(jù)存儲到相對應(yīng)的存儲節(jié)點中,或者到相對應(yīng)的存儲節(jié)點中獲取想要的數(shù)據(jù),優(yōu)點:
降低單個存儲節(jié)點的存儲和訪問壓力;通過規(guī)定好的規(guī)則快速找到數(shù)據(jù)所在的存儲節(jié)點,從而大大降低搜索延遲,提高用戶體驗。
當(dāng)鐵路局發(fā)布各個線路的火車票信息時,會按照一定規(guī)則存儲到相應(yīng)的機(jī)器中, 比如北京到上海的火車票存儲到機(jī)器 A 中,西安到重慶的火車票存儲到機(jī)器 B 中。當(dāng)乘客查詢火車票時,系統(tǒng)就可以根據(jù)查詢條件迅速定位到相對應(yīng)的存儲機(jī)器,然后將數(shù)據(jù)返回給用戶,響應(yīng)時間就大大縮短了。如圖所示,當(dāng)查詢北京 - 上海的火車票相關(guān)信息時,可以與機(jī)器 A 進(jìn)行數(shù)據(jù)交互。
例子中按照數(shù)據(jù)起點、終點的方式劃分?jǐn)?shù)據(jù),將數(shù)據(jù)分為幾部分存儲到不同的機(jī)器節(jié)點中,就是數(shù)據(jù)分片技術(shù)的一種。當(dāng)查詢數(shù)據(jù)時,系統(tǒng)可以根據(jù)查詢條件迅速找到對應(yīng)的存儲節(jié)點,從而實現(xiàn)快速響應(yīng)。 還有其他很多數(shù)據(jù)分片的方案。比如,按照數(shù)據(jù)范圍,采用哈希映射、一致性哈希環(huán)等對數(shù)據(jù)劃分。
針對數(shù)據(jù)范圍的數(shù)據(jù)分片方案:按照某種規(guī)則劃分?jǐn)?shù)據(jù)范圍,然后將在這個范圍內(nèi)的數(shù)據(jù)歸屬到一個集合中。這就好比數(shù)學(xué)中通常講的整數(shù)區(qū)間,比如 1~1000 的整數(shù),[1,100] 的整數(shù)屬于一個子集、[101,1000] 的整數(shù)屬于另一個子集。
對于前面講的火車票的案例,按照數(shù)據(jù)范圍分片的話,可以將屬于某條線的所有火車票數(shù)據(jù)劃分到一個子集或分區(qū)進(jìn)行存儲,比如機(jī)器 A 存儲京廣線的火車票數(shù)據(jù),機(jī)器 B 存儲京滬線的火車票數(shù)據(jù)。數(shù)據(jù)范圍的方案是按照范圍或區(qū)間進(jìn)行存儲或查詢。
如圖所示,當(dāng)用戶查詢北京 - 上海的火車票相關(guān)信息時,首先判斷查詢條件屬于哪個范圍,由于北京 - 上海的火車線路屬于京滬線,因此系統(tǒng)按照規(guī)則將查詢請求轉(zhuǎn)到存取京滬線火車票數(shù)據(jù)的機(jī)器 B,然后由機(jī)器 B 進(jìn)行處理并給用戶返回響應(yīng)結(jié)果。
為了提高分布式系統(tǒng)的可用性與可靠性,除了通過數(shù)據(jù)分片減少單個節(jié)點的壓力外,數(shù)據(jù)復(fù)制也是一個非常重要的方法。數(shù)據(jù)復(fù)制是將數(shù)據(jù)進(jìn)行備份,以使得多個節(jié)點存儲該數(shù)據(jù)。
數(shù)據(jù)復(fù)制和數(shù)據(jù)分片技術(shù)的區(qū)別:
數(shù)據(jù) A 被拆分為兩部分存儲在兩個節(jié)點 Node1 和 Node2 上,屬于數(shù)據(jù)分片;數(shù)據(jù) B 同一份完整的數(shù)據(jù)在兩個節(jié)點中均有存儲,就屬于數(shù)據(jù)復(fù)制。
在實際的分布式存儲系統(tǒng)中,數(shù)據(jù)分片和數(shù)據(jù)復(fù)制通常是共存的:
數(shù)據(jù)通過分片方式存儲到不同的節(jié)點上,以減少單節(jié)點的性能瓶頸問題;而數(shù)據(jù)的存儲通常用主備方式保證可靠性,對每個節(jié)點上存儲的分片數(shù)據(jù),采用主備方式存儲,以保證數(shù)據(jù)的可靠性。主備節(jié)點上數(shù)據(jù)的一致,是通過數(shù)據(jù)復(fù)制技術(shù)實現(xiàn)的。
Kafka 集群消息存儲架構(gòu)圖,消息數(shù)據(jù)以 Partition(分區(qū))進(jìn)行存儲,一個 Topic(主題)可以由多個 Partition 進(jìn)行存儲,Partition 可以分布到多個 Broker 中;同時,Kafka 還提供了 Partition 副本機(jī)制(對分區(qū)存儲的信息進(jìn)行備份,比如 Broker 1 中的 Topic-1 Partion-0 是對 Broker 0 上的 Topic-1 Partition-0 進(jìn)行的備份),從而保證了消息存儲的可靠性。
貨架:存儲數(shù)據(jù)
貨架是用來存儲數(shù)據(jù)的,因為數(shù)據(jù)是由顧客產(chǎn)生和消費的,因此貨架存儲的數(shù)據(jù)類型與顧客產(chǎn)生和消費的數(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)者 / 消費者、數(shù)據(jù)索引和數(shù)據(jù)存儲。
顧客包括產(chǎn)生數(shù)據(jù)的顧客和消費數(shù)據(jù)的顧客兩類;導(dǎo)購是數(shù)據(jù)索引引擎,包括數(shù)據(jù)存儲時確定數(shù)據(jù)位置,以及獲取數(shù)據(jù)時確定數(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)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)庫查詢中遭遇特殊字符導(dǎo)致問題的解決方法
數(shù)據(jù)庫查詢中遭遇特殊字符導(dǎo)致問題的解決方法,我們提供的是asp的,但其它的數(shù)據(jù)庫與語言下的解決方法也大同小異。2007-12-12DBeaver操作數(shù)據(jù)表的拷貝的實現(xiàn)
這篇文章主要介紹了DBeaver操作數(shù)據(jù)表的拷貝的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11比較SQL Server與Oracle、DB2數(shù)據(jù)庫的一些知識
本文比較大型數(shù)據(jù)庫SQL Server與Oracle、DB2的一些不同應(yīng)用之處。對于以后開發(fā)選擇什么樣的數(shù)據(jù)庫。2010-03-03SQL服務(wù)器面臨的危險和補(bǔ)救.讀[十種方法]后感.
SQL服務(wù)器面臨的危險. 危險:沒有防火墻保護(hù),暴露在公網(wǎng)中. 后果:SQL蠕蟲感染和黑客進(jìn)行拒絕服務(wù)攻擊、緩存溢出、SQL盲注和其它攻擊. 補(bǔ)救:安裝一款防火墻,即使經(jīng)費有限,網(wǎng)上也有大把的免費產(chǎn)品.2008-05-05dapper使用Insert或update時部分字段不映射到數(shù)據(jù)庫
我們在使用dapper的insert或update方法時可能會遇見一些實體中存在的字段但是,數(shù)據(jù)庫中不存在的字段,這樣在使用insert時就是拋出異常提示字段不存在,這個時候該怎么解決呢,下面給大家分享示例實體代碼,感興趣的朋友一起看看吧2023-12-12victoriaMetrics代理性能優(yōu)化問題解析
這篇文章主要為大家介紹了victoriaMetrics代理性能優(yōu)化問題的解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04數(shù)據(jù)庫 左連接 右連接 全連接用法小結(jié)
在關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,表建立時各數(shù)據(jù)之間的關(guān)系不必確定,常把一個實體的所有信息存放在一個表中。2008-08-08