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