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