互聯(lián)網(wǎng)的發(fā)展催生了云計(jì)算和大數(shù)據(jù)的發(fā)展, 云計(jì)算和大數(shù)據(jù)的本質(zhì)都是構(gòu)建低成本,高性能高可用的分布式存儲(chǔ)系統(tǒng),本文簡(jiǎn)單介紹分布式存儲(chǔ)的一些基礎(chǔ)知識(shí)。
分布式存儲(chǔ)通過(guò)網(wǎng)絡(luò)連接的大量的普通服務(wù)器, 將數(shù)據(jù)分片分散在集群中的不同節(jié)點(diǎn)(服務(wù)器或進(jìn)程)中,對(duì)外提供統(tǒng)一的服務(wù)。
分布式存儲(chǔ)一般需要具有幾個(gè)特性
可擴(kuò)展:分布式存儲(chǔ)一般可擴(kuò)展幾百甚至幾千臺(tái)服務(wù)器,并可容易的增加或減少節(jié)點(diǎn), 在節(jié)點(diǎn)調(diào)整過(guò)程中, 分布式存儲(chǔ)服務(wù)可自動(dòng)實(shí)現(xiàn)數(shù)據(jù)的遷移及負(fù)載均衡等操作。
低成本:組成分布式存儲(chǔ)服務(wù)的服務(wù)器可為普通服務(wù)器, 由于普通服務(wù)器故障率通常較高,因此要求存儲(chǔ)服務(wù)具有較好的容錯(cuò)性。
高性能:分布式存儲(chǔ)理論上隨著節(jié)點(diǎn)數(shù)量的增加,對(duì)外提供的服務(wù)的性能應(yīng)該成線性增長(zhǎng)的趨勢(shì)。這是分布式存儲(chǔ)同非分布式存儲(chǔ)的一大區(qū)別之一, 一般非分布式存儲(chǔ)在數(shù)據(jù)量達(dá)到一定規(guī)模之后, 都會(huì)存在單點(diǎn)的讀寫(xiě)問(wèn)題,分布式存儲(chǔ)一般通過(guò)數(shù)據(jù)分片解決單點(diǎn)問(wèn)題。
易用:分布式是存儲(chǔ)對(duì)外提供統(tǒng)一的接口, 用戶不需要關(guān)心數(shù)據(jù)的分片查找,副本維護(hù)等工作。
分布式存儲(chǔ)根據(jù)存儲(chǔ)類型可分為
分布式文件系統(tǒng):一般存儲(chǔ)非結(jié)構(gòu)的blob對(duì)象(文件,圖像等),比如淘寶的TFS, AWS的EBS, google的GFS等
分布式鍵值系統(tǒng):存儲(chǔ)關(guān)系簡(jiǎn)單的半結(jié)構(gòu)數(shù)據(jù), 只提供基于鍵值的CRUD操作, 不能做關(guān)聯(lián)查詢, 比如Redis, Tair, MongoDB等
分布式表格系統(tǒng):用于存儲(chǔ)半結(jié)構(gòu)化數(shù)據(jù), 與鍵值系統(tǒng)相比, 除了提供CRUD操作外, 還支持基于某個(gè)主鍵的范圍掃描, 比如Google 的Big Table, AWS的Dynamo DB等
分布式關(guān)系數(shù)據(jù)庫(kù):存儲(chǔ)關(guān)系數(shù)據(jù), 比如Taobao的Ocean DB。
存儲(chǔ)系統(tǒng)的性能瓶頸在于隨機(jī)的讀寫(xiě)操作。下表列出了各種硬件的存儲(chǔ)性能比:
類別消耗時(shí)間訪問(wèn)L1 Cache0.5 ns訪問(wèn)L2 Cache7 nsMutex加鎖/解鎖100 ns內(nèi)存訪問(wèn)100 ns千兆網(wǎng)絡(luò)發(fā)送1MB數(shù)據(jù)10 ms內(nèi)存順序讀取1MB數(shù)據(jù)0.25 ms機(jī)房?jī)?nèi)網(wǎng)絡(luò)來(lái)回0.5 ms異地機(jī)房間網(wǎng)絡(luò)來(lái)回30~100 ms
SATA磁盤(pán)尋道10 ms
從SATA磁盤(pán)順序讀取1MB數(shù)據(jù)20 ms
固態(tài)SSD盤(pán)訪問(wèn)延遲0.1~0.2 ms
SATA的順序讀取帶寬可以達(dá)到100MB以上, 由于磁盤(pán)的尋道時(shí)間大約為10ms, 順序讀取1MB數(shù)據(jù)的時(shí)間為:磁盤(pán)尋道時(shí)間 + 數(shù)據(jù)讀取時(shí)間, 即10ms + 1MB/100MB/s*1000=20ms。
分布式存儲(chǔ)系統(tǒng)一般需要解決幾個(gè)問(wèn)題
數(shù)據(jù)分布
在分布式存儲(chǔ)系統(tǒng)中,如何將數(shù)據(jù)分片到不同的節(jié)點(diǎn)是首先要考慮的問(wèn)題,一般分布式系統(tǒng)常使用的方法是Hash分布。
hash分布
哈希分布就是根據(jù)數(shù)據(jù)的某一個(gè)特征計(jì)算hash值, 并將hash值和集群中的節(jié)點(diǎn)做映射。從而將不同hash值的數(shù)據(jù)分布到不同的節(jié)點(diǎn)上。
hash分布的一個(gè)問(wèn)題是一旦數(shù)據(jù)已經(jīng)分布到不同的節(jié)點(diǎn)中, 做擴(kuò)容比較困難, 比如現(xiàn)在數(shù)據(jù)通過(guò)hash值分布到三臺(tái)機(jī)器上, 如果要將機(jī)器擴(kuò)展到五臺(tái), 需要重新將所有的數(shù)據(jù)重新算一下hash值, 然后重新分布。因此一般擴(kuò)展節(jié)點(diǎn)的數(shù)量是原數(shù)量的一倍,這樣只需要移動(dòng)一半數(shù)據(jù)。
一致性hash
一致性hash算法從某種程度上解決了擴(kuò)展過(guò)程中移動(dòng)數(shù)據(jù)太多的問(wèn)題, 一致行hash算法給每個(gè)節(jié)點(diǎn)賦予一個(gè)hash值, 這些節(jié)點(diǎn)按順序構(gòu)成一個(gè)環(huán),數(shù)據(jù)根據(jù)hash值落在環(huán)中的某個(gè)節(jié)點(diǎn)上。當(dāng)需要擴(kuò)容時(shí),將新加入節(jié)點(diǎn)放入環(huán)中,數(shù)據(jù)遷移只需要遷移新節(jié)點(diǎn)相鄰的節(jié)點(diǎn)上的數(shù)據(jù)即可。一致性hash容易造成數(shù)據(jù)偏斜, 而且在數(shù)據(jù)復(fù)制過(guò)程中, 對(duì)相鄰節(jié)點(diǎn)的壓力比較大。
一般系統(tǒng)會(huì)引入虛擬節(jié)點(diǎn)或虛擬槽的解決方式:即解耦數(shù)據(jù)與節(jié)點(diǎn)間的關(guān)系,引入虛擬節(jié)點(diǎn), 將數(shù)據(jù)映射到大量的虛擬節(jié)點(diǎn)上, 然后虛擬節(jié)點(diǎn)在在映射到實(shí)體節(jié)點(diǎn)上,這樣在擴(kuò)容過(guò)程中,可以以虛擬節(jié)點(diǎn)為單位移動(dòng)數(shù)據(jù), 可從不同的實(shí)體節(jié)點(diǎn)上移動(dòng)虛擬節(jié)點(diǎn)到新節(jié)點(diǎn)。很多存系統(tǒng)都采用了這種方案,如redis, Cassandra。
異常
分布式系統(tǒng)中,一臺(tái)服務(wù)器或者一個(gè)服務(wù)器上的不同進(jìn)程被成為一個(gè)節(jié)點(diǎn), 節(jié)點(diǎn)間通過(guò)網(wǎng)絡(luò)互聯(lián), 不論是節(jié)點(diǎn)還是網(wǎng)絡(luò)都是不可靠的。分布式系統(tǒng)需要處理由于節(jié)點(diǎn)或網(wǎng)絡(luò)引起的各種異常。
節(jié)點(diǎn)異常包括節(jié)點(diǎn)宕機(jī)或磁盤(pán)不可用(可恢復(fù)和不可恢復(fù)),分布式系統(tǒng)需要可以自動(dòng)監(jiān)控的節(jié)點(diǎn)的異常, 并做相應(yīng)處理:對(duì)不可恢復(fù)異常, 如果該節(jié)點(diǎn)值主副本節(jié)點(diǎn), 則需要重新進(jìn)行選主, 如果該節(jié)點(diǎn)是從副本節(jié)點(diǎn), 則需要其他節(jié)點(diǎn)從主副本(或其他從副本)復(fù)制一份分片數(shù)據(jù), 保證副本數(shù)量不變。對(duì)可恢復(fù)異常, 需要恢復(fù)節(jié)點(diǎn)并重構(gòu)內(nèi)存。
網(wǎng)絡(luò)異常:通過(guò)網(wǎng)絡(luò)進(jìn)行交互, 結(jié)果可分為成功, 失敗,和未知。未知的情況可能有成功也可能是失敗, 因此需要有重試機(jī)制, 而且多次調(diào)用的結(jié)果應(yīng)該冪等。
復(fù)制
由于異常的存在,為了達(dá)到高可用的目的, 一般數(shù)據(jù)會(huì)有多個(gè)副本, 多個(gè)副本鍵間的關(guān)系有:
主從副本:主從副本只有主提供寫(xiě), 從可以提供讀服務(wù)(或僅是備份的作用),主從的缺點(diǎn)主的單點(diǎn)寫(xiě)瓶頸, 但是由于數(shù)據(jù)被分片了, 如果數(shù)據(jù)的摸一個(gè)分片遇到寫(xiě)瓶頸, 可以通過(guò)增加集群節(jié)點(diǎn)的方式解決,這要求分布式存儲(chǔ)的擴(kuò)容比較容易,一般像redis, mongodb這種系統(tǒng)擴(kuò)容都不會(huì)成為問(wèn)題, 但是像ES, 分片數(shù)量不能修改, 擴(kuò)容就需要重新倒入數(shù)據(jù)。
主主副本:同一個(gè)副本的不同節(jié)點(diǎn)都可以是進(jìn)行寫(xiě)操作, Cassandara即是用這種方式實(shí)現(xiàn)
一致性
因?yàn)橥环輸?shù)據(jù)包含多個(gè)副本,副本間的一致性是分布性存儲(chǔ)系統(tǒng)需要考慮的問(wèn)題。
一致性分為強(qiáng)一致性,弱一致性和最終一致性。最終一致又可分為:
讀寫(xiě)一致性:A寫(xiě)后, A后的讀都可獲得最新結(jié)果。
會(huì)話一致性:同一個(gè)會(huì)話內(nèi)寫(xiě)后讀都可獲得最新結(jié)果。
單調(diào)讀:A讀取一次結(jié)果后, 后續(xù)讀取不會(huì)獲得之前版本的值。
單調(diào)寫(xiě):A的多次寫(xiě)在多個(gè)副本間按照順序執(zhí)行。
一般分布式存儲(chǔ)系統(tǒng)都既可以支持強(qiáng)一致性又可支持最總一致性。
分布式存儲(chǔ)系統(tǒng)大體遵循相同的功能模式, 但具體實(shí)現(xiàn)又根據(jù)自身特點(diǎn)各有不同。在日常系統(tǒng)維護(hù)過(guò)程中,了解相應(yīng)的分布式系統(tǒng)存儲(chǔ)的實(shí)現(xiàn)機(jī)制可以快速幫助定位問(wèn)題并找到正確的解決方案。
責(zé)任編輯人:CC
電子發(fā)燒友App

















評(píng)論