您好,登錄后才能下訂單哦!
Swift 最初是由 Rackspace 公司開發的高可用分布式對象存儲服務,并于 2010 年貢獻給 OpenStack 開源社區作為其最初的核心子項目之一,為其 Nova 子項目提供虛機鏡像存儲服務。Swift 構筑在比較便宜的標準硬件存儲基礎設施之上,無需采用 RAID(磁盤冗余陣列),通過在軟件層面引入一致性散列技術和數據冗余性,犧牲一定程度的數據一致性來達到高可用性和可伸縮性,支持多租戶模式、容器和對象讀寫操作,適合解決互聯網的應用場景下非結構化數據存儲問題。
此項目是基于 Python 開發的,采用 Apache 2.0 許可協議,可用來開發商用系統。
面對海量級別的對象,需要存放在成千上萬臺服務器和硬盤設備上,首先要解決尋址問題,即如何將對象分布到這些設備地址上。Swift 是基于一致性散列技術,通過計算可將對象均勻分布到虛擬空間的虛擬節點上,在增加或刪除節點時可大大減少需移動的數據量;虛擬空間大小通常采用 2 的 n 次冪,便于進行高效的移位操作;然后通過獨特的數據結構 Ring(環)再將虛擬節點映射到實際的物理存儲設備上,完成尋址過程。
如圖 1 中所示,以逆時針方向遞增的散列空間有 4 個字節長共 32 位,整數范圍是[0~232-1];將散列結果右移 m 位,可產生 232-m個虛擬節點,例如 m=29 時可產生 8 個虛擬節點。在實際部署的時候需要經過仔細計算得到合適的虛擬節點數,以達到存儲空間和工作負載之間的平衡。
按照 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 所示:
環是為了將虛擬節點(分區)映射到一組物理存儲設備上,并提供一定的冗余度而設計的,其數據結構由以下信息組成:
存儲設備列表、設備信息包括唯一標識號(id)、區域號(zone)、權重(weight)、IP 地址(ip)、端口(port)、設備名稱(device)、元數據(meta)。
分區到設備映射關系(replica2part2dev_id 數組)
計算分區號的位移(part_shift 整數,即圖 1 中的 m)
以查找一個對象的計算過程為例:
使用對象的層次結構 account/container/object 作為鍵,使用 MD5 散列算法得到一個散列值,對該散列值的前 4 個字節進行右移操作得到分區索引號,移動位數由上面的 part_shift 設置指定;按照分區索引號在分區到設備映射表(replica2part2dev_id)里查找該對象所在分區的對應的所有設備編號,這些設備會被盡量選擇部署在不同區域(Zone)內,區域只是個抽象概念,它可以是某臺機器,某個機架,甚至某個建筑內的機群,以提供最高級別的冗余性,建議至少部署 5 個區域;權重參數是個相對值,可以來根據磁盤的大小來調節,權重越大表示可分配的空間越多,可部署更多的分區。
Swift 為賬戶,容器和對象分別定義了的環,查找賬戶和容器的是同樣的過程。
Swift 采用層次數據模型,共設三層邏輯結構:Account/Container/Object(即賬戶/容器/對象),每層節點數均沒有限制,可以任意擴展。這里的賬戶和個人賬戶不是一個概念,可理解為租戶,用來做頂層的隔離機制,可以被多個個人賬戶所共同使用;容器代表封裝一組對象,類似文件夾或目錄;葉子節點代表對象,由元數據和內容兩部分組成,如圖 4 所示:
系統架構
Swift 采用完全對稱、面向資源的分布式系統架構設計,所有組件都可擴展,避免因單點失效而擴散并影響整個系統運轉;通信方式采用非阻塞式 I/O 模式,提高了系統吞吐和響應能力。
Swift 組件包括:
代理服務(Proxy Server):對外提供對象服務 API,會根據環的信息來查×××地址并轉發用戶請求至相應的賬戶、容器或者對象服務;由于采用無狀態的 REST 請求協議,可以進行橫向擴展來均衡負載。
認證服務(Authentication Server):驗證訪問用戶的身份信息,并獲得一個對象訪問令牌(Token),在一定的時間內會一直有效;驗證訪問令牌的有效性并緩存下來直至過期時間。
緩存服務(Cache Server):緩存的內容包括對象服務令牌,賬戶和容器的存在信息,但不會緩存對象本身的數據;緩存服務可采用 Memcached 集群,Swift 會使用一致性散列算法來分配緩存地址。
賬戶服務(Account Server):提供賬戶元數據和統計信息,并維護所含容器列表的服務,每個賬戶的信息被存儲在一個 SQLite 數據庫中。
容器服務(Container Server):提供容器元數據和統計信息,并維護所含對象列表的服務,每個容器的信息也存儲在一個 SQLite 數據庫中。
對象服務(Object Server):提供對象元數據和內容服務,每個對象的內容會以文件的形式存儲在文件系統中,元數據會作為文件屬性來存儲,建議采用支持擴展屬性的 XFS 文件系統。
復制服務(Replicator):會檢測本地分區副本和遠程副本是否一致,具體是通過對比散列文件和高級水印來完成,發現不一致時會采用推式(Push)更新遠程副本,例如對象復制服務會使用遠程文件拷貝工具 rsync 來同步;另外一個任務是確保被標記刪除的對象從文件系統中移除。
更新服務(Updater):當對象由于高負載的原因而無法立即更新時,任務將會被序列化到在本地文件系統中進行排隊,以便服務恢復后進行異步更新;例如成功創建對象后容器服務器沒有及時更新對象列表,這個時候容器的更新操作就會進入排隊中,更新服務會在系統恢復正常后掃描隊列并進行相應的更新處理。
審計服務(Auditor):檢查對象,容器和賬戶的完整性,如果發現比特級的錯誤,文件將被隔離,并復制其他的副本以覆蓋本地損壞的副本;其他類型的錯誤會被記錄到日志中。
賬戶清理服務(Account Reaper):移除被標記為刪除的賬戶,刪除其所包含的所有容器和對象。
API
Swift 通過 Proxy Server 向外提供基于 HTTP 的 REST 服務接口,對賬戶、容器和對象進行 CRUD 等操作。在訪問 Swift 服務之前,需要先通過認證服務獲取訪問令牌,然后在發送的請求中加入頭部信息 X-Auth-Token。下面是請求返回賬戶中的容器列表的示例:
GET /v1/<account> HTTP/1.1 Host: storage.swift.com X-Auth-Token: eaaafd18-0fed-4b3a-81b4-663c99ec1cbb 響應頭部信息中包含狀態碼 200,容器列表包含在響應體中: HTTP/1.1 200 Ok Date: Thu, 07 Jan 2013 18:57:07 GMT Server: Apache Content-Type: text/plain; charset=UTF-8 Content-Length: 32 p_w_picpaths movies documents backups
Swift 支持的所有操作可以總結為表 1:
資源類型 | URL | GET | PUT | POST | DELETE | HEAD |
---|---|---|---|---|---|---|
賬戶 | /account/ | 獲取容器列表 | - | - | - | 獲取賬戶元數據 |
容器 | /account/container | 獲取對象列表 | 創建容器 | 更新容器元數據 | 刪除容器 | 獲取容器元數據 |
對象 | /account/container/object | 獲取對象內容和元數據 | 創建、更新或拷貝對象 | 更新對象元數據 | 刪除對象 | 獲取對象元數據 |
詳細的 API 規范可以參考開發者指南。應用開發可采用 Swift 項目本身已經包含的 Python 的綁定實現;如果使用其它編程語言,可以參考 Rackspace 兼容 Swift 的 Cloud Files API,支持 Java,.Net,Ruby,PHP 等語言綁定。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。