標籤:比較 data- 伸縮性 一致性hash 檔案 mode 尋找 子項目 指南
最近在找工作時被問到swift底層的一些原理,為了以後能有印象,所以決定做一下筆記
以下由(http://www.openstack.cn/?p=776)轉載
——Openstack Swift 開源雲端儲存技術解析
OpenStack Swift 開源項目提供了彈性可伸縮、高可用的分布式Object Storage Service服務,適合儲存大規模非結構化資料。本文將深入介紹 Swift 的基本設計原理、對稱式的系統架構和 RESTful API。
背景與概覽
Swift 最初是由 Rackspace 公司開發的高可用分布式Object Storage Service服務,並於 2010 年貢獻給 OpenStack 開源社區作為其最初的核心子項目之一,為其 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 為賬戶,容器和對象分別定義了的環,尋找賬戶和容器的是同樣的過程。
資料模型
Swift 採用層次資料模型,共設三層邏輯結構:Account/Container/Object(即賬戶/容器/對象),每層節點數均沒有限制,可以任意擴充。這裡的賬戶和個人賬戶不是一個概念,可理解為租戶,用來做頂層的隔離機制,可以被多個個人賬戶所共同使用;容器代表封裝一組對象,類似檔案夾或目錄;葉子節點代表對象,由中繼資料和內容兩部分組成, 4 所示:
圖 4. Swift 資料模型
系統架構
Swift 採用完全對稱、面向資源的分布式系統架構設計,所有組件都可擴充,避免因單點失效而擴散並影響整個系統運轉;通訊方式採用非阻塞式 I/O 模式,提高了系統吞吐和響應能力。
圖 5. Swift 系統架構
Swift 組件包括:
- 代理服務(Proxy Server):對外提供物件服務 API,會根據環的資訊來尋找服務地址並轉寄使用者請求至相應的賬戶、容器或者物件服務;由於採用無狀態的 REST 請求協議,可以進行橫向擴充來均衡負載。
- 認證服務(Authentication Server):驗證訪問使用者的身份資訊,並獲得一個對象存取權杖(Token),在一定的時間內會一直有效;驗證存取權杖的有效性並緩衝下來直至到期時間。
- 快取服務(Cache Server):緩衝的內容包括物件服務令牌,賬戶和容器的存在資訊,但不會緩衝對象本身的資料;快取服務可採用 Memcached 叢集,Swift 會使用一致性散列演算法來分配緩衝地址。
- 賬戶服務(Account Server):提供賬戶中繼資料和統計資訊,並維護所含容器列表的服務,每個賬戶的資訊被儲存在一個 SQLite 資料庫中。
- Container Service(Container Server):提供容器中繼資料和統計資訊,並維護所含對象列表的服務,每個容器的資訊也儲存在一個 SQLite 資料庫中。
- 物件服務(Object Server):提供對象中繼資料和內容服務,每個對象的內容會以檔案的形式儲存在檔案系統中,中繼資料會作為檔案屬性來儲存,建議採用支援擴充屬性的 XFS 檔案系統。
- 複製服務(Replicator):會檢測本地分區副本和遠程副本是否一致,具體是通過對比散列檔案和進階浮水印來完成,發現不一致時會採用推式(Push)更新遠程副本,例如對象複製服務會使用遠程檔案拷貝工具 rsync 來同步;另外一個任務是確保被標記刪除的對象從檔案系統中移除。
- 更新服務(Updater):當對象由於高負載的原因而無法立即更新時,任務將會被序列化到在本地檔案系統中進行排隊,以便服務恢複後進行非同步更新;例如成功建立對象後Container Service器沒有及時更新對象列表,這個時候容器的更新操作就會進入排隊中,更新服務會在系統復原正常後掃描隊列並進行相應的更新處理。
- 審計服務(Auditor):檢查對象,容器和賬戶的完整性,如果發現位元級的錯誤,檔案將被隔離,並複製其他的副本以覆蓋本地損壞的副本;其他類型的錯誤會被記錄到日誌中。
- 賬戶清理服務(Account Reaper):移除被標記為刪除的賬戶,刪除其所包含的所有容器和對象。
API
Swift 通過 Proxy Server 向外提供基於 HTTP 的 REST 服務介面,對賬戶、容器和對象進行 CRUD 等操作。在訪問 Swift 服務之前,需要先通過認證服務擷取存取權杖,然後在發送的請求中加入頭部資訊 X-Auth-Token。下面是請求返回賬戶中的容器列表的樣本:
GET /v1/<account> HTTP/1.1Host: storage.swift.comX-Auth-Token: eaaafd18-0fed-4b3a-81b4-663c99ec1cbb回應標頭部資訊中包含狀態代碼 200,容器列表包含在響應體中:HTTP/1.1 200 OkDate: Thu, 07 Jan 2013 18:57:07 GMTServer: ApacheContent-Type: text/plain; charset=UTF-8Content-Length: 32imagesmoviesdocumentsbackups
Swift 支援的所有操作可以總結為表 1:
表 1. Swift RESTful API 總結
資源類型 |
URL |
GET |
PUT |
POST |
DELETE |
HEAD |
賬戶 |
/account/ |
擷取容器列表 |
- |
- |
- |
擷取賬戶中繼資料 |
容器 |
/account/container |
擷取對象列表 |
建立容器 |
更新容器中繼資料 |
刪除容器 |
擷取容器中繼資料 |
對象 |
/account/container/object |
擷取對象內容和中繼資料 |
建立、更新或拷貝對象 |
更新對象中繼資料 |
刪除對象 |
擷取對象中繼資料 |
詳細的 API 規範可以參考開發人員指南。應用開發可採用 Swift 項目本身已經包含的 Python 的綁定實現;如果使用其它程式設計語言,可以參考 Rackspace 相容 Swift 的 Cloud Files API,支援 Java,.Net,Ruby,PHP 等語言綁定。
結束語
OpenStack Swift 作為穩定和高可用的開來源物件儲存被很多企業作為商業化部署,如新浪的 App Engine 已經上線並提供了基於 Swift 的Object Storage Service服務,韓國電信的 Ucloud Storage 服務。有理由相信,因為其完全的開放性、廣泛的使用者群和社區貢獻者,Swift 可能會成為雲端儲存的開放標準,從而打破 Amazon S3 在市場上的壟斷地位,推動雲端運算在朝著更加開放和可互操作的方向前進。
參考資料學習
- 參考 OpenStack 官方網站:可獲得 Swift 官方發布的最新動向資訊。
- Swift 官方專案管理網站:提供了所有的代碼,Bug 跟蹤,Blueprint,翻譯和 Q&A,有任何疑難問題都可以在上面進行提問。
- OpenStack Object Storage Service管理員指南:文檔介紹如何安裝和部署 Swift。
- OpenStack Object Storage Service開發人員指南:文檔可以提供詳細的 API 規範和範例。
- 創業公司 SwiftStack 提供的 Swift 架構介紹系統而全面。
- 查看 Guy Harrison 的部落格文章“關於 NoSQL 資料庫的一致性模型”,瞭解 CAP 理論和 NWR 策略。
- 查看 Julien Danjou 的部落格文章“Swift 一致性分析”,瞭解 Swift 背後的一致性原理。
- 新浪在 Slideshare 上分享的“Swift 架構與實踐”,瞭解 Swift 架構。
- Rackspace 公司提供的 Cloud Files API 規範文檔。
- 參考 Github 上提供的基於Swift的 CDMI 標準實現,瞭解如何基於 Swift 開發支援其它標準的介面。
openstack swift的資料一致性原理以及一致性hash原理說明(轉載)