OpenStack Swift 存儲策略及應用案例
OpenStack Swift 對象存儲及其存儲策略簡介
Swift 2.0 于 2014 年 7 月 8 日發布,其中最重要的新特性是存儲策略(Storage Policy),該特性改變了以往存儲系統中存儲策略由設計與實施方決定的做法,讓用戶能夠以 Container 為粒度,為不同需求的數據指定不同的副本數量、不同參數的糾刪碼、不同性能的存儲介質、不同地理位置、不同的后端存儲設備。存儲策略充分體現了 Swift"軟件定義存儲"(Software Defined Storage)的特點。
為了實現存儲策略,Swift 在原先三個環(Ring)的架構基礎上進行了改進。Swift 為賬戶、容器和對象分別定義了的環,通過環將虛擬節點(分區)映射到一組物理存儲設備上。在 Swift 2.0 中,每個存儲策略對應一個 Object Ring。
Swift存儲策略的配置與使用
配置存儲策略
設置存儲策略分為兩步:編輯配置文件swift.conf文件,創建相應的ObjectRing。在配置文件中每個存儲策略以[storage-policy:N]開頭,其中N是策略的編號。對于該文件的解析遵循以下規則:
- 如果該文件中沒有聲明任何策略,Swift會自己創建一個;
- 策略編號應當位非負整數;
- 如果沒有聲明默認策略,Swift會把編號為0的策略設為默認策略;
- 策略編號必須唯一;
- 策略應當具有名字,策略命名區分大小且必須唯一;
- 策略名稱只能包含字母、數字和連字符,"Policy-0"只能用于編號為0的策略;
- 定義策略之后,應當有一個且僅有一個策略被指定為默認策略;
- "廢棄"(Deprecated)策略不能同時為默認策略。
下面是一個swift.conf文件的示例:
- [swift-hash]
- # random unique strings that can never change (DO NOT LOSE)
- swift_hash_path_prefix = changeme
- swift_hash_path_suffix = changeme
- [storage-policy:0]
- name = apple
- default = yes
- [storage-policy:1]
- name = orange
- deprecated = yes
完成swift.conf 文件的編輯,下一步是為每個存儲策略創建相應的Object Ring,方法和創建老版本 Object Ring類似,只是要在object 后面加上"-N",這里的 N 是存儲策略的編號。例如,為上述編號為 0和1的存儲策略創建Object Ring:
- swift-ring-builder object-0.builder create 10 3 1
- swift-ring-builder object-1.builder create 10 2 1
使用存儲策略
存儲策略的使用非常簡單,只需要在創建 container 是指定存儲策略即可,下面以 SAIO 部署為例加以說明:
- curl -v -X PUT -H 'X-Auth-Token: <your auth token>' -H \
- "X-Storage-Policy: orange" \
- <a href="http://127.0.0.1:8080/v1/AUTH_test/myCont1">http://127.0.0.1:8080/v1/AUTH_test/myCont1</a>
- curl -X PUT -v -T file1.txt -H 'X-Auth-Token: <your auth token>' \
- <a href="http://127.0.0.1:8080/v1/AUTH_test/myCont1/">http://127.0.0.1:8080/v1/AUTH_test/myCont1/</a>
然后執行:
- curl -X GET –v \
- <a href="http://127.0.0.1:8080/endpoints/AUTH_test/myCont1/file1.txt">http://127.0.0.1:8080/endpoints/AUTH_test/myCont1/file1.txt</a>
例如,會看到如下結果:
- ["http://127.0.0.1:6010/sdb1/32/AUTH_test/myCont1/file1.txt",
- "http://127.0.0.1:6040/sdb4/32/AUTH_test/myCont1/file1.txt"]
說明 Storage Policy 已經成功發揮作用。
#p#
存儲策略的應用模式
上述提到副本數量的改變,只是存儲策略的應用模式的一種,在實際應用中,可以有以下幾種模式:
1. 縮減或增加冗余
對于一些數據,它們不需要保證很高的數據持久性和可靠性,比較典型的是圖像的縮略圖,它們可以由原圖降采樣得到,在這種情況下,可以對原圖采用三副本方案,對縮略圖采用雙副本方案,降低存儲系統的開銷。
圖 1.為不同的 Container 指定不同的副本數量
2. 性能分層
例如,對于一些數據用 HDD 保存,另一些用 SSD 保存。也可以應用于其他存儲介質,甚至是不同的存儲設備。
圖 2.為不同的 Container 指定不同的存儲介質
3. 地理位置約束
在某些場景下,因為公司或者國家的政策的約束,某些數據必須存儲在指定的地理位置,例如混合云場景。有些場景下,用戶希望指定數據存放在距離訪問客戶端比較近的地方。
圖 3.為不同的 Container 指定不同的存儲位置
4. 應用糾刪碼(Erasure Codes)
對于性能要求不高的場合,應用糾刪碼。糾刪碼,又稱為刪除碼,將對象分割為 m 個分片(fragments),并通過編碼生成 k 個校驗分片, 最后將這 n=m+k 個分片放到 Swift 對象存儲系統的不同位置(通常是 swift 的不同 zone 中)。對于將 m 個分片編碼為 n 個分片的糾刪碼,記為EC(m, n)。糾刪碼的示意圖如下:
圖 4.糾刪碼示意圖
糾刪碼在提高存儲空間利用率的同時,保持或增加數據的持久性(durability)和可靠性。但是由于編碼、解碼和恢復數據往往需要較大的計算量,可能導致性能的降低,所以比較適用于對持久性和可靠性要求比較高,但是訪問量并不大的數據存儲。
圖 5 .應用糾刪碼保護數據
#p#
在某視頻網站中的應用案例
在某視頻網站中,采用 Swift 存儲視頻文件,并對其部分文件根據視頻類型的不同應用不同的存儲策略。
視頻數據分為三類:1)源片;2)超清視頻文件;3)其他不同清晰度的視頻文件。源片體積較大,對持久性要求高,但是對訪問速度要求較低,并發訪問數量和訪問頻率較低;清晰度較低的視頻由超清視頻轉碼得到,針對上述需求,設計存儲策略如下:
- 源片采用糾刪碼策略,編碼參數為EC(7, 4),即把一個視頻文件分割為 4 塊,并生成 3 塊校驗塊,存儲效率約為 57%;
- 超清視頻三副本策略,存儲效率約為 33%;
- 清晰度較低的視頻采用雙副本策略,存儲效率為 50%。
假設設備損壞的概率為 2%,以上三種存儲策略的數據持久性分別為:99.9995%,99.9992%和 99.96%。
表 1.存儲策略的應用
Swift 集群的總結點數量為 54 個節點,總容量約為 2.3PB,集群的部署架構如下圖所示,其中 Proxy Server 的數量可以根據需要增加或者減少。采用傳統三副本方案,能夠保存的視頻總長度約為(同一段視頻不同分辨率不進行重復統計)3.97×106 分鐘。
采用上述存儲策略后,保存的視頻總長度為 5.89×106 分鐘,存儲效率提高了 48%。
圖 6. 基于 Swift 的視頻存儲系統的部署架構
結束語
在大數據時代,隨著文件數量和數據體量的增加,文件系統和 NAS 的瓶頸越來越明顯,基于 RESTful Web API 的對象存儲逐漸受到人們的廣泛接受。作為最具代表性,應用最廣泛的開源對象存儲方案,OpenStack Swift 自誕生以來一直保持著技術上領先的地位,在 Swift 2.0 中推出的存儲策略功能,能夠讓管理員根據自己系統的特點制定不同的存儲策略;用戶或租戶根據自己數據的特點和業務需要,以 Container 為粒度選擇存儲策略,從而實現成本、數據可靠性、性能等維度上的綜合權衡和優化,體現了軟件定義存儲的特點。本文只是對存儲策略做了一個簡要的介紹,讓讀 者體會存儲策略的用途,進一步深入探索可以查看參考資料了解有關 OpenStack Swift 的更多相關信息。