OpenStack Object Storage(Swift)架構簡介
OpenStack Object Storage(Swift)是OpenStack開源云計算項目的子項目之一。Swift使用普通的服務器來構建冗余的、可擴展的分布式對象存儲集群,存儲容量可達PB級。Swift的是用Python開發,前身是Rackspace Cloud Files項目,隨著Rackspace加入到OpenStack社區,Racksapce也將Cloud Files的代碼貢獻給了社區,并逐漸形成現在Swift。Swift***的發型版本為essex 1.4.6。
功能
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存儲,依賴與臨時鏈接)
靜態WEB站點(用Swift作為靜態站點的WEB服務器)#p#
架構
圖為Swift的基本架構。
在介紹Swift的架構之前,先介紹一下OpenStack的設計原理:
1、Scalability and elasticity are our main goals
(可擴展性和伸縮性是我們的主要目標)
2、 Any feature that limits our main goals must be optional
(任何影響到可擴展性和伸縮性的功能都必須是可選的)
3、Everything should be asynchronous,If you can’t do something asynchronously, see #2
(所有的環節必須是異步的,如果不能異步實現,參考第二條設計原理)
4、All required components must be horizontally scalable
(所有的基礎組件必須能橫向擴展)
***lways use shared nothing architecture (SN) or sharding,If you can’t Share nothing/shard, see #2
(始終使用無共享的架構,如果不能實現,參見第二條)
6、Distribute everything,especially logic. Move logic to where state naturally exists.(所有的都是分布式的,尤其是邏輯。把邏輯放在狀態應該存在的地方)
7、Accept eventual consistency and use it where it is appropriate.
(接受最終一致性,并在適合的條件下使用)
8、Test everything(充足的測試)#p#
依賴組件
Memcached,分布式緩存系統,在swift中主要被用于token和account信息,container信息的存儲
Sqlite,輕量級數據庫引擎,在swift中主要被用于管理account和container數據庫
rsync,遠程同步工具,用于storage node之間的數據同步
XFS文件系統
WSGI,Python Web服務網關接口,通過paste.deploy工具包管理swift各服務進程、中間件的處理流程
Eventlet,Python搞并發網絡編程庫,swift所有的服務器進程均依賴于該庫#p#
主要組件
Ring文件
在基本架構圖中,我并沒有畫出ring文件,但是它卻是整個Swift中最重要的組件。ring文件是由一致性哈希算法生成,它的主要作用是存儲名字到位置的映射。
ring文件分為三類,分別是:account.ring,container.ring,object.ring。
對于account的請求,就能通過account_name查詢account.ring得到{‘/account_name’ : account_db_position}的映射,從而知道account數據庫文件在集群的位置;
對于container的請求,通過account_name和container_name查詢container.ring文件,得到{‘/account_name/container_name’ : container_db_position}的映射;
對于object的請求,通過account_name,container_name,object_name查詢object.ring文件,得到{‘/account_name/container_name/object_name’ : object_position}的映射;
Ring文件作為一個靜態文件存儲在每個節點的/etc/swift目錄下,被用于各節點之間的位置查詢,使得swift的內部網絡是一個P2P網絡,不依賴某幾個節點進行位置查詢,避免了單點瓶頸。
生成ring文件的一致性哈希算法不但為數據的冗余性,分區容忍性提供了保證,也為整體架構上實現性能、容量的橫向擴展奠定了基礎。
Ring的詳細構造過程將在下一節介紹。
proxy-server
proxy-server是proxy node中唯一運行的服務進程,也是swift集群的endpoint,向用戶提供RESTful API。
對于用戶的請求,proxy-server會根據配置文件的配置,將請求交給各個中間件進行處理,其中最重要的就是Auth中間件(認證),在處理完成后會根據請求路徑將請求轉發給相應的storage node中的account-server。container-server或object-server進程處理。
swift集群的流入數據和流出數據都需要經過proxy-server,proxy-server不會對數據進行緩存。
auth-server
驗證服務進程,為用戶生成token和驗證每個請求的token及token的權限。swift的驗證服務是作為一個中間件被proxy-server使用,是可選的,可以自己開發,也可以使用OpenStack Keystone。Keystone是官方開發的驗證服務,使用Keystone可以無縫的與其它OpenStack項目整合。
account-server
account-server是storage node中負責處理對account的GET、HEAD、PUT、DELETE、RELICATION請求的服務進程,account-server使用sqlite的數據庫文件保存account的相關信息。
container-server
container-server是storage node中負責處理對container的GET、HEAD、PUT、DELETE、RELICATION請求的服務進程,container-server使用sqlite的數據庫文件保存container的相關信息。
object-server
object-server是storage node中負責處理對object的GET、HEAD、PUT、PSOT、DELETE、RELICATION請求的服務進程,object-server直接操作object,并利用XFS文件系統的xattr包存object的元數據。
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原理、代碼的學習研究以及一系列地測試,我認為Swift簡單、冗余、可擴展的架構保證了它能作為IaaS的一個基礎服務。
原帖:http://blog.sws.sina.com.cn/?p=139