Openstack Swift開源雲存儲技術解析

來源:互聯網
上載者:User
關鍵字 Swift 開源 OpenStack 雲存儲技術

Swift 最初是由 Rackspace 公司開發的高可用分散式物件存儲服務,並于 2010 年貢獻給 OpenStack HTTP://www.aliyun.com/zixun/aggregation/13856.html"> 開源社區作為其最初的核心子專案之一,為其 Nova 子專案提供虛機鏡像存儲服務。 Swift 構築在比較便宜的標準硬體存儲基礎設施之上,無需採用 RAID(磁片冗余陣列),通過在軟體層面引入一致性散列技術和資料冗余性,犧牲一定程度的資料一致性來達到高可用性和可伸縮性,支援多租戶模式、容器和物件讀寫操作, 適合解決互聯網的應用場景下非結構化資料存儲問題。

此專案是基於 Python 開發的,採用 Apache 2.0 授權合約,可用來開發商用系統。

基本原理

一致性散列(Consistent Hashing)

面對海量級別的物件,需要存放在成千上萬台伺服器和硬碟設備上,首先要解決定址問題,即如何將物件分佈到這些設備位址上。 Swift 是基於一致性散列技術,通過計算可將物件均勻分佈到虛擬空間的虛擬節點上,在增加或刪除節點時可大大減少需移動的資料量;虛擬空間大小通常採用 2 的 n 次冪,便於進行高效的移位操作;然後通過獨特的資料結構 Ring(環)再將虛擬節點映射到實際的物理存放裝置上,完成定址過程。

圖 1. 一致性散列

如圖 1 中所示,以逆時針方向遞增的散列空間有 4 個位元組長共 32 位,整數範圍是[0~232-1];將散列結果右移 m 位,可產生 232-m個虛擬節點,例如 m=29 時可產生 8 個虛擬節點。 在實際部署的時候需要經過仔細計算得到合適的虛擬節點數,以達到存儲空間和工作負載之間的平衡。

資料一致性模型(Consistency Model)

按照 Eric Brewer 的 CAP(Consistency,Availability,Partition Tolerance)理論,無法同時滿足 3 個方面,Swift 放棄嚴格一致性(滿足 ACID 事務級別), 而採用最終一致性模型(Eventual Consistency),來達到高可用性和無限水準擴展能力。 為了實現這一目標,Swift 採用 Quorum 仲裁協定(Quorum 有法定投票人數的含義):

(1)定義:N:資料的副本總數;W:寫操作被確認接受的副本數量;R:讀操作的副本數量

(2)強一致性:R+W>N,以保證對副本的讀寫操作會產生交集,從而保證可以讀取到最新版本;如果 W=N,R=1,則需要全部更新,適合大量讀少量寫操作場景下的強一致性;如果 R=N,W=1,則只更新一個副本, 通過讀取全部副本來得到最新版本,適合大量寫少量讀場景下的強一致性。

(3)弱一致性:R+W<=N,如果讀寫操作的複本集合不產生交集,就可能會讀到髒資料;適合對一致性要求比較低的場景。

Swift 針對的是讀寫都比較頻繁的場景,所以採用了比較折中的策略,即寫操作需要滿足至少一半以上成功 W >N/2,再保證讀操作與寫操作的複本集合至少產生一個交集,即 R+W>N。 Swift 預設配置是 N=3,W=2>N/2,R=1 或 2,即每個物件會存在 3 個副本,這些副本會儘量被存儲在不同區域的節點上;W=2 表示至少需要更新 2 個副本才算寫成功;當 R=1 時意味著某一個讀操作成功便立刻返回,此種情 況下可能會讀取到舊版本(弱一致性模型);當 R=2 時,需要通過在讀操作請求頭中增加 x-newest=true 參數來同時讀取 2 個副本的中繼資料資訊,然後比較時間戳記來確定哪個是最新版本(強一致性模型);如果資料出現了不一致, 後臺服務進程會在一定時間視窗內通過檢測和複製協定來完成資料同步,從而保證達到最終一致性。 如圖 2 所示:

圖 2. Quorum 協定示例

環的資料結構

環是為了將虛擬節點(分區)映射到一組物理存放裝置上,並提供一定的冗余度而設計的,其資料結構由以下資訊組成:

存放裝置清單、設備資訊包括唯一標識號(id)、區域號(zone)、權重(weight)、IP 位址(ip)、埠(port)、設備名稱(device)、中繼資料(meta)。 分區到設備映射關係(replica2part2dev_id 陣列) 計算分區號的位移(part_shift 整數,即圖 1 中的 m)

以查找一個物件的計算過程為例:

圖 3. 環的資料機構

使用物件的層次結構 account/container/object 作為鍵,使用 MD5 散列演算法得到一個散列值,對該散列值的前 4 個位元組進行右移操作得到分區索引號,移動位數由上面的 part_shift 設置指定 ;按照分區索引號在分區到設備映射表(replica2part2dev_id)裡查找該物件所在分區的對應的所有設備編號,這些設備會被儘量選擇部署在不同區域(Zone)內,區域只是個抽象概念,它可以是某台機器,某個機架, 甚至某個建築內的機群,以提供最高級別的冗余性,建議至少部署 5 個區域;權重參數是個相對值,可以來根據磁片的大小來調節,權重越大表示可分配的空間越多,可部署更多的分區。

Swift 為帳戶,容器和物件分別定義了的環,查找帳戶和容器的是同樣的過程。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.