Swift 不是文件系統或者實時的數據存儲系統,而是對象存儲,用於長期存儲永久類型的靜態數據。這些數據能夠檢索、調整和必要時進行更新。Swift最適合虛擬機鏡像、圖片、郵件和存檔備份這類數據的存儲。node
Swift沒有采用RAID,也沒有中心單元和主控點,而是經過在軟件層面採用一致性HASH和數據冗餘性,犧牲必定程度的數據一致性達到高可用性和可收縮性。支持多用戶模式、容器、和對象存儲。最佳應用場景爲非結構化數據存儲問題。所謂的非結構化數據是相對於結構化數據而言的,節後數據即行數據,存儲在數據庫中,能夠用二維表結構來邏輯實現的數據,而非結構化數據不方便用數據庫二維邏輯表來表現,包括全部格式的辦公文檔、文本、圖片、標準通用標記語言下的子集XML、HTML、各種報表、圖像和音頻/視頻。算法
swift的主要技術特色:數據庫
一、極高的數據持久性swift
二、徹底的對稱系統架構:對稱意味着Swift中的各節點能夠徹底對等,能極大的下降成本api
三、無限的可擴展性:一方面是數據能夠無限的擴,另外一方面Swift的性能能夠線性提高(暫時沒有體會到,能夠再後續的閱讀了解中體會,主要看它的架構設計)緩存
四、無單點故障:Swift的元數據存儲時徹底均勻隨機分佈的,而且與對象文件存儲同樣,元數據也會存儲多份。服務器
swift與HDFS的技術差別架構
一、在Swift中,元數據呈分佈式,跨集羣複製,而在HDFS中,採用中央系統(Namenode)來維護元數據,這對於HDFS來講,無疑使單點故障點,於是擴展到規模很是大的環境很困難併發
二、Swift設計時考慮到多租戶架構,而HDFS沒有考慮這個概念(下午學習什麼是多租戶架構)異步
三、在Swift中,文件能夠寫入屢次,在併發場景下,以最近一次的的操做爲標準。而在HDFS中,文件寫入一次,並且每次只能有一個文件寫入
四、Swift可以可靠地存儲數量很是多的大小不一的文件,而HDFS用於存儲數量中等的大文件,來支持數據處理。
注:存儲系統元數據的缺點:元數據是指記錄數據邏輯與物理位置的映像關係。對於元數據的管理通常分爲兩種,一種是使用集中式元數據服務來維護元數據,如HDFS,這種維護方式會致使單點故障和性能瓶頸,另一種是使用分佈式元數據服務來維護元數據,如OpenStack的Swift,這種維護方式存在性能負載和元數據同步一致性問題,如Swift就是經過系統必定程度的數據一致性來達到高可用性和可伸縮性的。
Swift的原理:
一、一致性Hash
一致性Hash算法提出了在動態變化的Cache環境中,斷定hash算法好的標準:
一、平衡性:平衡性是指哈希的結果可以儘量的分佈到全部的緩衝中去,這樣可使得全部緩衝空間可以都獲得利用。爲了更好的知足平衡性,引入了虛擬節點概念,虛擬節點是實際節點在hash空間的複製品,一個實際節點對應若干個虛擬節點,這個對應的個數也稱爲複製個數,虛擬節點在hash空間以hash值排列。
二、單調性:單調性是指若是已經有些內容經過Hash分派到相應的緩衝中,又有新的緩衝加入到系統中,哈希的結果應可以保證原有已分配的內容能夠被映射到原有或者新的緩衝中區,而不會被映射到舊的或者其餘緩衝區。
三、分散性:在分佈式環境中,客戶端可能看不到全部的緩衝,而只能看到其中一部分。當終端但願經過哈希過程將內容映射到緩衝上時,因爲不一樣的客戶端所看到的緩衝範圍可能不一樣,從而致使獲得的Hash結果不一致,致使結果相同的內容被映射到不用的緩衝區中。這種狀況應該被避免,由於這將會致使相同的內容將會被映射到不一樣緩衝區中,下降了系統的存儲效率。
四、負載:負載時對分散性要求的另外一個維度。既然相同的內容可能被映射到不一樣的緩衝中去,那麼對於同一個緩衝而言,就有可能被不一樣的用戶映射不一樣的內容。與分散性同樣,這種狀況應該被避免。
swift使用一致性Hash的主要目的是在改變集羣的節點數時,能儘量少的減小key和node的映射關係,以知足單調性。
因爲在node較少的狀況下,改變node會致使大量的數據遷移,所以使用虛擬節點。
Swift中存在兩種映射關係:對於一個文件,經過hash算法找到對應的虛擬節點,虛擬節點再經過映射關係找到對應的設備,這樣就文在在設備上的存儲。(關於虛擬節點和節點的個數設置後續再學習)
數據一致性模型
根據CAP理論,一致性、可用性、分區容忍性三個方面只能知足兩方面,Swift放棄了一個一致性,而採用一致性模型,以達到高可用性和水平擴展能力。
爲了控制一致性,Swift採用了NWR策略(Quorum協議),NWR是一種在分佈式存儲系統中控制一致性級別的策略,其中N表明一份數據的Replica數,
W是更新一份數據對象確保成功更新成功的份數,R表明讀取一個數據須要讀取的Replicad的份數。公式W+R>N保證某個數據不被兩個不一樣的事物同時讀和寫,公式W>N/2,保證兩個事物不能併發寫同一份數據。在分佈式系統中,一般把備份數目設置爲3份,若是是1,則是很是危險的,一旦這個Replica失敗了,則數據就損壞了,若是N爲二,那麼只要一個存儲節點發生錯誤,就會有單點存在。若是副本數設置太高高,則系統的維護成本就會變高。
補充:對於NWR,強一致性:R+W>N,以保證對副本的讀寫操做能夠產生交集,從而保證能夠讀到最新版本;若是W=N,R=1,則須要所有更新,適合大量讀少許寫操做的場景下的強一致性。若是R=N,W=1,則只更新一個副本,經過讀取所有分佈來獲得最新版本,適合少許讀大量寫的的強一致性。
環
環是Swift中的重要組件,用於記錄存儲對象和物理位置間的映射關係,在查詢Account、Container、Object信息時就須要查詢集羣的Ring信息。
ring是爲了將虛擬節點(partition)均衡的映射到一組物理存儲設備上,並提供必定的冗餘度而設計的
Swift爲帳戶、容器和對象分別定義了環,其查找過程是相同的。Ring中每一個分區的在集羣中都默認有3個副本,每一個分區的位置都有ring來維護,並存儲在映射中。
Ring使用zone來保證數據的物理隔離,每一個分區的副本數確保放在不一樣的zone中。
總的來講,Ring引入一致性Hash的緣由是爲了減小因爲增長節點致使數據項移動的數量來提升單調性,引入partition的緣由是爲了減小因爲節點數過少而致使移動過多的數據項,引入副本爲了防止數據單點,提升冗餘性,引入zone的緣由是爲了保證分區容忍性,引入權重是爲了保證分區的分配的平衡性。
swift架構設計
Swift部署架構
主要組件:
一、Proxy Server
Proxy Server是提供swift api的服務器進程,swift經過Proxy Server 向外提供基於HTTP和RESET的服務接口,負責swift其他組件的相互通訊。對於每一個客戶端的請求,它將在環中查詢Account、Container或者Object的位置,並相應的轉發 請求。因爲採用無狀態的REST請求協議,能夠進行橫向擴展來均衡負載。在訪問swift以前,要先經過認證服務獲取訪問令牌,而後在發送的請求中加入頭部信息 X-Auth-Token。
二、Storage Server
Storage Server提供累了磁盤設備上的存儲服務。在Swift中有三類存儲服務器帳戶服務器(Account Server)、容器服務器(Container Server)、對象服務器(Object Server)。
2.1 Account Server
帳戶服務提供帳戶元數據和統計信息,並維護所含容器列表的服務,每一個帳戶的信息被存儲在一個SQLite數據庫中
2.2 Container Server
容器服務器提供容器元數據和統計信息,並維護所包含對象列表的服務。容器並不知道對象存在位置,只知道容器裏存的那些對象。這些對象信息以SQLLite數據庫文件的形式存儲,和對象同樣在集羣上作相似的備份。
2.3 Object Server
對象服務器提供元數據和內容服務,用於存儲、檢索和刪除本地設備上的對象。在文件系統中,對象以二進制的文件的形式存儲,它的元數據存儲在文件系統的擴展屬性中,建議採用默認支持擴展屬性餓XFS文件系統。每一個對象使用對象名稱的哈希值和操做的時間戳組成的路勁來存儲。最後一次的寫操做總能夠成功,並確保最新一次的對象版本將會被處理。
三、Consistency Server
在磁盤上存儲數據並向外提供Rest-ful API 最主要的問題是故障處理。Swift的Consistency Server的目的是查找並解決由數據損壞和硬件故障引發的錯誤。主要由3個server組成,Auditor、Updater、和Replicator。Auditor運行在每一個Swift服務器的後臺持續的掃描磁盤來檢測對象、容器和帳號的完整性,若是發現數據損壞,Auditor將會將該文件移動到隔離區域,而後由Replicator負責將一個無缺的副原本替代該數據。在系統高負載或者發生故障的狀況下,容器或帳號中的數據不會被當即更新。若是更新失敗,該次更新在本地文件系統中被加入隊列,而後Updater會繼續處理這些失敗了的更新操做。
3.1 審計服務(Auditor)
在本地服務器上反覆的檢查對象、帳戶和容器的完整性,若是法相比特級的錯誤,文件將會被隔離,而後由Replicator負責用一個無缺的拷貝來替代該數據,其餘類型的錯誤會被記錄到日誌中
3.2 複製服務(Replicator)
該服務一方面用於檢測本地分區副本和遠程副本是否一致,具體方式是用對比哈希文件盒高級文件水影來完成,當發現不一致時採用push的方式更新遠程副本:對於對象的複製,更新只是使用rsync同步文件到對等節點。帳號和容器的複製經過HTTP或Rsync來推送整個數據庫文件上丟失的記錄,另外一方面用於確保被標記刪除的對象從文件系統中移除:當有一項被刪除,則一個墓碑文件被設置爲該項的最新版本,複製器或檢測到該墓碑文件確保將他從整個系統中移除。
3.3 更新服務(Updater)
當對象因爲高負載或者系統故障等緣由而沒法當即更新時,任務將會被序列化到本地文件系統中進行排隊,以便回覆後進行異步更新。
四、Cache Server
緩存的內容包括對象服務令牌,帳戶和容器的存在信息,但不會緩存對象自己的數據。