Swift 不是文件系統(tǒng)或者實(shí)時(shí)的數(shù)據(jù)存儲(chǔ)系統(tǒng),而是對(duì)象存儲(chǔ),用于長(zhǎng)期存儲(chǔ)永久類型的靜態(tài)數(shù)據(jù)。這些數(shù)據(jù)可以檢索、調(diào)整和必要時(shí)進(jìn)行更新。Swift最適合虛擬機(jī)鏡像、圖片、郵件和存檔備份這類數(shù)據(jù)的存儲(chǔ)。
Swift沒(méi)有采用RAID,也沒(méi)有中心單元和主控點(diǎn),而是通過(guò)在軟件層面采用一致性HASH和數(shù)據(jù)冗余性,犧牲一定程度的數(shù)據(jù)一致性達(dá)到高可用性和可收縮性。支持多用戶模式、容器、和對(duì)象存儲(chǔ)。最佳應(yīng)用場(chǎng)景為非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)問(wèn)題。所謂的非結(jié)構(gòu)化數(shù)據(jù)是相對(duì)于結(jié)構(gòu)化數(shù)據(jù)而言的,節(jié)后數(shù)據(jù)即行數(shù)據(jù),存儲(chǔ)在數(shù)據(jù)庫(kù)中,可以用二維表結(jié)構(gòu)來(lái)邏輯實(shí)現(xiàn)的數(shù)據(jù),而非結(jié)構(gòu)化數(shù)據(jù)不方便用數(shù)據(jù)庫(kù)二維邏輯表來(lái)表現(xiàn),包括所有格式的辦公文檔、文本、圖片、標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的子集XML、HTML、各類報(bào)表、圖像和音頻/視頻。
swift的主要技術(shù)特點(diǎn):
1、極高的數(shù)據(jù)持久性
2、完全的對(duì)稱系統(tǒng)架構(gòu):對(duì)稱意味著Swift中的各節(jié)點(diǎn)可以完全對(duì)等,能極大的降低成本
3、無(wú)限的可擴(kuò)展性:一方面是數(shù)據(jù)可以無(wú)限的擴(kuò),另一方面Swift的性能可以線性提升(暫時(shí)沒(méi)有體會(huì)到,可以再后續(xù)的閱讀了解中體會(huì),主要看它的架構(gòu)設(shè)計(jì))
4、無(wú)單點(diǎn)故障:Swift的元數(shù)據(jù)存儲(chǔ)時(shí)完全均勻隨機(jī)分布的,并且與對(duì)象文件存儲(chǔ)一樣,元數(shù)據(jù)也會(huì)存儲(chǔ)多份。
swift與HDFS的技術(shù)差異
1、在Swift中,元數(shù)據(jù)呈分布式,跨集群復(fù)制,而在HDFS中,采用中央系統(tǒng)(Namenode)來(lái)維護(hù)元數(shù)據(jù),這對(duì)于HDFS來(lái)說(shuō),無(wú)疑使單點(diǎn)故障點(diǎn),因而擴(kuò)展到規(guī)模非常大的環(huán)境很困難
2、Swift設(shè)計(jì)時(shí)考慮到多租戶架構(gòu),而HDFS沒(méi)有考慮這個(gè)概念(下午學(xué)習(xí)什么是多租戶架構(gòu))
3、在Swift中,文件可以寫(xiě)入多次,在并發(fā)場(chǎng)景下,以最近一次的的操作為標(biāo)準(zhǔn)。而在HDFS中,文件寫(xiě)入一次,而且每次只能有一個(gè)文件寫(xiě)入
4、Swift能夠可靠地存儲(chǔ)數(shù)量非常多的大小不一的文件,而HDFS用于存儲(chǔ)數(shù)量中等的大文件,來(lái)支持?jǐn)?shù)據(jù)處理。
注:存儲(chǔ)系統(tǒng)元數(shù)據(jù)的缺點(diǎn):元數(shù)據(jù)是指記錄數(shù)據(jù)邏輯與物理位置的映像關(guān)系。對(duì)于元數(shù)據(jù)的管理一般分為兩種,一種是使用集中式元數(shù)據(jù)服務(wù)來(lái)維護(hù)元數(shù)據(jù),如HDFS,這種維護(hù)方式會(huì)導(dǎo)致單點(diǎn)故障和性能瓶頸,另外一種是使用分布式元數(shù)據(jù)服務(wù)來(lái)維護(hù)元數(shù)據(jù),如OpenStack的Swift,這種維護(hù)方式存在性能負(fù)載和元數(shù)據(jù)同步一致性問(wèn)題,如Swift就是通過(guò)系統(tǒng)一定程度的數(shù)據(jù)一致性來(lái)達(dá)到高可用性和可伸縮性的。
Swift的原理:
1、一致性Hash
一致性Hash算法提出了在動(dòng)態(tài)變化的Cache環(huán)境中,判定hash算法好的標(biāo)準(zhǔn):
1、平衡性:平衡性是指哈希的結(jié)果能夠盡可能的分布到所有的緩沖中去,這樣可以使得所有緩沖空間能夠都得到利用。為了更好的滿足平衡性,引入了虛擬節(jié)點(diǎn)概念,虛擬節(jié)點(diǎn)是實(shí)際節(jié)點(diǎn)在hash空間的復(fù)制品,一個(gè)實(shí)際節(jié)點(diǎn)對(duì)應(yīng)若干個(gè)虛擬節(jié)點(diǎn),這個(gè)對(duì)應(yīng)的個(gè)數(shù)也稱為復(fù)制個(gè)數(shù),虛擬節(jié)點(diǎn)在hash空間以hash值排列。
2、單調(diào)性:?jiǎn)握{(diào)性是指如果已經(jīng)有些內(nèi)容通過(guò)Hash分派到相應(yīng)的緩沖中,又有新的緩沖加入到系統(tǒng)中,哈希的結(jié)果應(yīng)能夠保證原有已分配的內(nèi)容可以被映射到原有或者新的緩沖中區(qū),而不會(huì)被映射到舊的或者其他緩沖區(qū)。
3、分散性:在分布式環(huán)境中,客戶端可能看不到所有的緩沖,而只能看到其中一部分。當(dāng)終端希望通過(guò)哈希過(guò)程將內(nèi)容映射到緩沖上時(shí),由于不同的客戶端所看到的緩沖范圍可能不同,從而導(dǎo)致得到的Hash結(jié)果不一致,導(dǎo)致結(jié)果相同的內(nèi)容被映射到不用的緩沖區(qū)中。這種情況應(yīng)該被避免,因?yàn)檫@將會(huì)導(dǎo)致相同的內(nèi)容將會(huì)被映射到不同緩沖區(qū)中,降低了系統(tǒng)的存儲(chǔ)效率。
4、負(fù)載:負(fù)載時(shí)對(duì)分散性要求的另一個(gè)維度。既然相同的內(nèi)容可能被映射到不同的緩沖中去,那么對(duì)于同一個(gè)緩沖而言,就有可能被不同的用戶映射不同的內(nèi)容。與分散性一樣,這種情況應(yīng)該被避免。
swift使用一致性Hash的主要目的是在改變集群的節(jié)點(diǎn)數(shù)時(shí),能盡可能少的減少key和node的映射關(guān)系,以滿足單調(diào)性。
由于在node較少的情況下,改變node會(huì)導(dǎo)致大量的數(shù)據(jù)遷移,因此使用虛擬節(jié)點(diǎn)。
Swift中存在兩種映射關(guān)系:對(duì)于一個(gè)文件,通過(guò)hash算法找到對(duì)應(yīng)的虛擬節(jié)點(diǎn),虛擬節(jié)點(diǎn)再通過(guò)映射關(guān)系找到對(duì)應(yīng)的設(shè)備,這樣就文在在設(shè)備上的存儲(chǔ)。(關(guān)于虛擬節(jié)點(diǎn)和節(jié)點(diǎn)的個(gè)數(shù)設(shè)置后續(xù)再學(xué)習(xí))
數(shù)據(jù)一致性模型
根據(jù)CAP理論,一致性、可用性、分區(qū)容忍性三個(gè)方面只能滿足兩方面,Swift放棄了一個(gè)一致性,而采用一致性模型,以達(dá)到高可用性和水平擴(kuò)展能力。
為了控制一致性,Swift采用了NWR策略(Quorum協(xié)議),NWR是一種在分布式存儲(chǔ)系統(tǒng)中控制一致性級(jí)別的策略,其中N代表一份數(shù)據(jù)的Replica數(shù),
W是更新一份數(shù)據(jù)對(duì)象確保成功更新成功的份數(shù),R代表讀取一個(gè)數(shù)據(jù)需要讀取的Replicad的份數(shù)。公式W+R>N保證某個(gè)數(shù)據(jù)不被兩個(gè)不同的事物同時(shí)讀和寫(xiě),公式W>N/2,保證兩個(gè)事物不能并發(fā)寫(xiě)同一份數(shù)據(jù)。在分布式系統(tǒng)中,通常把備份數(shù)目設(shè)置為3份,如果是1,則是非常危險(xiǎn)的,一旦這個(gè)Replica失敗了,則數(shù)據(jù)就損壞了,如果N為二,那么只要一個(gè)存儲(chǔ)節(jié)點(diǎn)發(fā)生錯(cuò)誤,就會(huì)有單點(diǎn)存在。如果副本數(shù)設(shè)置過(guò)高高,則系統(tǒng)的維護(hù)成本就會(huì)變高。
補(bǔ)充:對(duì)于NWR,強(qiáng)一致性:R+W>N,以保證對(duì)副本的讀寫(xiě)操作可以產(chǎn)生交集,從而保證可以讀到最新版本;如果W=N,R=1,則需要全部更新,適合大量讀少量寫(xiě)操作的場(chǎng)景下的強(qiáng)一致性。如果R=N,W=1,則只更新一個(gè)副本,通過(guò)讀取全部分布來(lái)得到最新版本,適合少量讀大量寫(xiě)的的強(qiáng)一致性。
環(huán)
環(huán)是Swift中的重要組件,用于記錄存儲(chǔ)對(duì)象和物理位置間的映射關(guān)系,在查詢Account、Container、Object信息時(shí)就需要查詢集群的Ring信息。
ring是為了將虛擬節(jié)點(diǎn)(partition)均衡的映射到一組物理存儲(chǔ)設(shè)備上,并提供一定的冗余度而設(shè)計(jì)的
Swift為賬戶、容器和對(duì)象分別定義了環(huán),其查找過(guò)程是相同的。Ring中每個(gè)分區(qū)的在集群中都默認(rèn)有3個(gè)副本,每個(gè)分區(qū)的位置都有ring來(lái)維護(hù),并存儲(chǔ)在映射中。
Ring使用zone來(lái)保證數(shù)據(jù)的物理隔離,每個(gè)分區(qū)的副本數(shù)確保放在不同的zone中。
總的來(lái)說(shuō),Ring引入一致性Hash的原因是為了減少由于增加節(jié)點(diǎn)導(dǎo)致數(shù)據(jù)項(xiàng)移動(dòng)的數(shù)量來(lái)提高單調(diào)性,引入partition的原因是為了減少由于節(jié)點(diǎn)數(shù)過(guò)少而導(dǎo)致移動(dòng)過(guò)多的數(shù)據(jù)項(xiàng),引入副本為了防止數(shù)據(jù)單點(diǎn),提高冗余性,引入zone的原因是為了保證分區(qū)容忍性,引入權(quán)重是為了保證分區(qū)的分配的平衡性。
swift架構(gòu)設(shè)計(jì)
Swift部署架構(gòu)
主要組件:
1、Proxy Server
Proxy Server是提供swift api的服務(wù)器進(jìn)程,swift通過(guò)Proxy Server 向外提供基于HTTP和RESET的服務(wù)接口,負(fù)責(zé)swift其余組件的相互通信。對(duì)于每個(gè)客戶端的請(qǐng)求,它將在環(huán)中查詢Account、Container或者Object的位置,并相應(yīng)的轉(zhuǎn)發(fā) 請(qǐng)求。由于采用無(wú)狀態(tài)的REST請(qǐng)求協(xié)議,可以進(jìn)行橫向擴(kuò)展來(lái)均衡負(fù)載。在訪問(wèn)swift之前,要先通過(guò)認(rèn)證服務(wù)獲取訪問(wèn)令牌,然后在發(fā)送的請(qǐng)求中加入頭部信息 X-Auth-Token。
2、Storage Server
Storage Server提供累了磁盤設(shè)備上的存儲(chǔ)服務(wù)。在Swift中有三類存儲(chǔ)服務(wù)器賬戶服務(wù)器(Account Server)、容器服務(wù)器(Container Server)、對(duì)象服務(wù)器(Object Server)。
2.1 Account Server
賬戶服務(wù)提供賬戶元數(shù)據(jù)和統(tǒng)計(jì)信息,并維護(hù)所含容器列表的服務(wù),每個(gè)賬戶的信息被存儲(chǔ)在一個(gè)SQLite數(shù)據(jù)庫(kù)中
2.2? Container Server
容器服務(wù)器提供容器元數(shù)據(jù)和統(tǒng)計(jì)信息,并維護(hù)所包含對(duì)象列表的服務(wù)。容器并不知道對(duì)象存在位置,只知道容器里存的那些對(duì)象。這些對(duì)象信息以SQLLite數(shù)據(jù)庫(kù)文件的形式存儲(chǔ),和對(duì)象一樣在集群上做類似的備份。
2.3 Object Server
對(duì)象服務(wù)器提供元數(shù)據(jù)和內(nèi)容服務(wù),用于存儲(chǔ)、檢索和刪除本地設(shè)備上的對(duì)象。在文件系統(tǒng)中,對(duì)象以二進(jìn)制的文件的形式存儲(chǔ),它的元數(shù)據(jù)存儲(chǔ)在文件系統(tǒng)的擴(kuò)展屬性中,建議采用默認(rèn)支持?jǐn)U展屬性餓XFS文件系統(tǒng)。每個(gè)對(duì)象使用對(duì)象名稱的哈希值和操作的時(shí)間戳組成的路勁來(lái)存儲(chǔ)。最后一次的寫(xiě)操作總可以成功,并確保最新一次的對(duì)象版本將會(huì)被處理。
3、Consistency Server
在磁盤上存儲(chǔ)數(shù)據(jù)并向外提供Rest-ful API 最主要的問(wèn)題是故障處理。Swift的Consistency Server的目的是查找并解決由數(shù)據(jù)損壞和硬件故障引起的錯(cuò)誤。主要由3個(gè)server組成,Auditor、Updater、和Replicator。Auditor運(yùn)行在每個(gè)Swift服務(wù)器的后臺(tái)持續(xù)的掃描磁盤來(lái)檢測(cè)對(duì)象、容器和賬號(hào)的完整性,如果發(fā)現(xiàn)數(shù)據(jù)損壞,Auditor將會(huì)將該文件移動(dòng)到隔離區(qū)域,然后由Replicator負(fù)責(zé)將一個(gè)完好的副本來(lái)替代該數(shù)據(jù)。在系統(tǒng)高負(fù)載或者發(fā)生故障的情況下,容器或賬號(hào)中的數(shù)據(jù)不會(huì)被立即更新。如果更新失敗,該次更新在本地文件系統(tǒng)中被加入隊(duì)列,然后Updater會(huì)繼續(xù)處理這些失敗了的更新操作。
3.1 審計(jì)服務(wù)(Auditor)
在本地服務(wù)器上反復(fù)的檢查對(duì)象、賬戶和容器的完整性,如果法相比特級(jí)的錯(cuò)誤,文件將會(huì)被隔離,然后由Replicator負(fù)責(zé)用一個(gè)完好的拷貝來(lái)替代該數(shù)據(jù),其他類型的錯(cuò)誤會(huì)被記錄到日志中
3.2 復(fù)制服務(wù)(Replicator)
該服務(wù)一方面用于檢測(cè)本地分區(qū)副本和遠(yuǎn)程副本是否一致,具體方式是用對(duì)比哈希文件盒高級(jí)文件水影來(lái)完成,當(dāng)發(fā)現(xiàn)不一致時(shí)采用push的方式更新遠(yuǎn)程副本:對(duì)于對(duì)象的復(fù)制,更新只是使用rsync同步文件到對(duì)等節(jié)點(diǎn)。賬號(hào)和容器的復(fù)制通過(guò)HTTP或Rsync來(lái)推送整個(gè)數(shù)據(jù)庫(kù)文件上丟失的記錄,另一方面用于確保被標(biāo)記刪除的對(duì)象從文件系統(tǒng)中移除:當(dāng)有一項(xiàng)被刪除,則一個(gè)墓碑文件被設(shè)置為該項(xiàng)的最新版本,復(fù)制器或檢測(cè)到該墓碑文件確保將他從整個(gè)系統(tǒng)中移除。
3.3? 更新服務(wù)(Updater)
當(dāng)對(duì)象由于高負(fù)載或者系統(tǒng)故障等原因而無(wú)法立即更新時(shí),任務(wù)將會(huì)被序列化到本地文件系統(tǒng)中進(jìn)行排隊(duì),以便回復(fù)后進(jìn)行異步更新。
4、Cache Server
緩存的內(nèi)容包括對(duì)象服務(wù)令牌,賬戶和容器的存在信息,但不會(huì)緩存對(duì)象本身的數(shù)據(jù)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
