OpenStack Object Storage(Swift)是OpenStack開源雲計算項目的子項目之一。Swift使用普通的服務器來構建冗餘的、可擴展的分佈式對象存儲集羣,存儲容量可達PB級。Swift的是用Python開發。
Swift提供的服務與AWS S3基本相同:
做爲IaaS的存儲服務
與OpenStack Compute對接,爲其存儲鏡像
文檔存儲
存儲須要長期保存的數據,例如log
存儲網站的圖片,縮略圖等
Swift使用RESTful API對外提供服務,目前 1.4.6版本所提供的功能:
Account(存儲帳戶)的GET、HEAD
Container(存儲容器,與S3的bucket相同)的GET、PUT、HEAD、DELETE
Object(存儲對象)的GET、PUT、HEAD、DELETE、DELETE
Account、Container、Object的元數據支持
大文件(無上限,單個無文件最大5G,大於5G的文件在客戶端切分上傳,並上傳manifest文件)、
訪問控制、權限控制
臨時對象存儲(過時對象自動刪除)
存儲請求速率限制
臨時連接(讓任何用戶訪問對象,不須要使用Token)
表單提交(直接從HTML表單上傳文件到Swift存儲,依賴與臨時連接)
swift的構架通常以下:可擴展性和伸縮性是咱們的主要目標 node
swift服務依賴於如下技術
memcache 存儲token、account、container信息等。
sqlite 用於管理account和container數據庫
rsync 在storage node之間同步數據
xfs
WSGI python web服務網管接口管理swift進程
eventlet python 併發網絡庫
proxy server
proxy server是proxy node中運行的惟一的進程服務,他是swift集羣的endpoint。proxy server負責鏈接swift的其餘構件,對每次請求,proxy server都會查詢ring中的account、container或者object,而後轉發請求。API接口也是經過proxy server開放給外部的。proxy server也會處理大量的失敗請求,例如當一個object PUT時,這時他會查詢ring中其餘能夠提供服務的server,並轉發請求。proxy server並不緩衝數據在object server和user之間,對於用戶的請求proxy server會根據配置文件將請求交給中間件處理,在處理完成後會將請求路徑轉發給相應的storage node中的account、container或者object進行處理
ring
ring表明了存儲在硬盤上的實體和實際物理位置的映射,account、container、object都有本身的ring,當其餘組件須要對account、container或者object操做時,就須要用ring去肯定各自在集羣上的位置。
ring使用zone、devices、partitions、replicas來維護這些映射信息,每一個ring中的partition在集羣中都默認有3個副本(replicas),每一個partition的位置由ring來維護,存貯在映射中,當請求失敗時ring負責決定哪個device接手請求。ring中的數據由zone保證各自隔離,每一個partition的replica都被放在不一樣的zone上,一個zone能夠是一個drive,一個server,一個cabinet,一個switch或者一個datacenter。
swift在安裝ring的device時,會均衡的劃分每一個partition,當partition須要移動時,ring確保一次移動最少數量的partition,而且一次只移動一個partition的一個replica,weight能夠用來均衡drive在partition在集羣中的分佈。
container server
container server主要處理object的listing,container server並不知道object存貯在哪裏,只知道指定的container裏面存儲了哪些object,這些列表一sqlite數據庫文件的形式存儲,object同樣在集羣上作備份,container server也跟蹤作一些統計。
container-server是storage node中負責處理對container的GET、HEAD、PUT、DELETE、RELICATION請求的服務進程。
account server
account server負責處理container的listing動做,做用和container server同樣,account-server是storage node中負責處理對account的GET、HEAD、PUT、DELETE、RELICATION請求的服務進程。
object server
object server是一個簡單的blob存儲,他能夠用來操做(檢索和刪除)本地devices上的objects,object以二進制文件的形式和元數據(metadata)存貯在文件系統上,元數據存放在文件系統的擴展屬性中(xattrs)中,ext3的xattrs默認是關閉的。每一個object的名字hash以後加上操做的時間戳組成object的存貯路徑名,last write必定是成功的,並確保最新的object已經能夠對外提供服務,刪除操做也做爲文件的一個版本,確保被刪除的文件副本被正確的刪除。
object-server是storage node中負責處理對object的GET、HEAD、PUT、PSOT、DELETE、RELICATION請求的服務進程,object-server直接操做object,並利用XFS文件系統的xattr包存object的元數據。
replication
replication用來保證系統故障時的數據一致性,replication進程比較本地數據和遠程的拷貝,確保他們都包含最新的版本,object replication用hash錶快速的比較每一個partition的子段,container replication和account replication使用hash和high water marks進行文件版本比較,replication更新時,replication是以push爲基礎,對於object replication來講,更新時傳輸一些rsync同步文件到各個節點,並非所有文件,account server和container server使用http或者rsync補全整個數據庫文件上丟失的記錄,replication一樣確保被刪除的數據確實從系統中刪除了,當一項(object、container、account)被刪除掉,則這項的最新的版本標誌被設置成tombstone,replication可以看到ts,並確保設置爲ts的項從系統中刪除。
auditors
auditors 會在本地服務器上反覆的檢查,以保證object、container、account的完整性,一旦發現不完整的數據,該文件會被當即隔離,而後replication會從其餘副本那裏把問題文件替換。
account-auditor、container-auditor、object-auditor 這三個進程運行在storage node中,分別檢測account的db文件,container的db文件,object是否損壞,若是損壞,將會向存儲有其它副本的storage node請求副本,替換損壞的。
account-replicator、container-replicator、object-replicator 這三個進程運行在storage node中,分別負責account的db文件,container的db文件,object在集羣中副本的同步。
例如,一個object在swift集羣中一般被存儲在3個不一樣的storage node中,對於一個PUT /account/container/object的請求,proxy-server會根據 /account/container/object查詢ring文件,獲得該object應該存儲的節點列表(長度爲3),proxy-server會將請求轉發到這三個節點。若是隻有兩個節點寫入成功,就認爲此次PUT操做成功。寫入失敗的節點在一段時間後將會獲得寫入成功的節點object-replicator進程推送過來的數據。
container-updater、account-updater 這兩個進程運行在storage node中,負責container數據庫和account數據庫的異步更新。使用異步更新的緣由:在請求來量大時,container-server和account-server不能實時處理對數據庫更新的請求,這些請求將被本地化到隊列中,由updater進程進行異步更新。
在Swift中會涉及到Proxy Server,Account Server,Container server,Object Server四種服務器。在Account Server,Container server,Object Server 3個服務器中都會有複製器(Replication),更新器(Updater),審計器(Auditor),分別負責相應服務存儲數據的複製,更新,及其數據的審覈。
在Account server中存儲了包括的該系統會涉及到的容器列表,在Container server中,包含的是該系統存儲的全部的對象信息列表,這兩種服務器的數據組織都以Sqlite數據庫文件的形式存儲,而Object Server是一個很是簡單的塊存儲服務器,對象以二進制形式存儲。