簡介
OpenStack Object Storage(Swift)是OpenStack開源云計算項目的子項目之一。Swift使用普通的服務(wù)器來構(gòu)建冗余的、可擴(kuò)展的分布式對象存儲集群,存儲容量可達(dá)PB級。Swift的是用Python開發(fā),前身是Rackspace Cloud Files項目,隨著Rackspace加入到OpenStack社區(qū),Racksapce也將Cloud Files的代碼貢獻(xiàn)給了社區(qū),并逐漸形成現(xiàn)在Swift。Swift最新的發(fā)型版本為essex 1.4.6。
功能
Swift提供的服務(wù)與AWS S3相同,可以用以下用途:
- 作為IaaS的存儲服務(wù)
- 與OpenStack Compute對接,為其存儲鏡像
- 文檔存儲
- 存儲需要長期保存的數(shù)據(jù),例如log
- 存儲網(wǎng)站的圖片,縮略圖等
Swift使用RESTful API對外提供服務(wù),目前 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文件)、
- 訪問控制、權(quán)限控制
- 臨時對象存儲(過期對象自動刪除)
- 存儲請求速率限制
- 臨時鏈接(讓任何用戶訪問對象,不需要使用Token)
- 表單提交(直接從HTML表單上傳文件到Swift存儲,依賴與臨時鏈接)
- 靜態(tài)WEB站點(用Swift作為靜態(tài)站點的WEB服務(wù)器)
架構(gòu)
在介紹Swift的架構(gòu)之前,先介紹一下OpenStack的設(shè)計原理:
- Scalability and elasticity are our main goals
(可擴(kuò)展性和伸縮性是我們的主要目標(biāo)) - Any feature that limits our main goals must be optional
(任何影響到可擴(kuò)展性和伸縮性的功能都必須是可選的) - Everything should be asynchronous,If you can’t do something asynchronously, see #2
(所有的環(huán)節(jié)必須是異步的,如果不能異步實現(xiàn),參考第二條設(shè)計原理) - All required components must be horizontally scalable
(所有的基礎(chǔ)組件必須能橫向擴(kuò)展) - Always use shared nothing architecture (SN) or sharding,If you can’t Share nothing/shard, see #2
(始終使用無共享的架構(gòu),如果不能實現(xiàn),參見第二條) - Distribute everything,especially logic. Move logic to where state naturally exists.(所有的都是分布式的,尤其是邏輯。把邏輯放在狀態(tài)應(yīng)該存在的地方)
- Accept eventual consistency and use it where it is appropriate.
(接受最終一致性,并在適合的條件下使用) - Test everything
(充足的測試)
依賴組件
- Memcached,分布式緩存系統(tǒng),在swift中主要被用于token和account信息,container信息的存儲
- Sqlite,輕量級數(shù)據(jù)庫引擎,在swift中主要被用于管理account和container數(shù)據(jù)庫
- rsync,遠(yuǎn)程同步工具,用于storage node之間的數(shù)據(jù)同步
- XFS文件系統(tǒng)
- WSGI,Python Web服務(wù)網(wǎng)關(guān)接口,通過paste.deploy工具包管理swift各服務(wù)進(jìn)程、中間件的處理流程
- Eventlet,Python搞并發(fā)網(wǎng)絡(luò)編程庫,swift所有的服務(wù)器進(jìn)程均依賴于該庫
主要組件
- Ring文件
在基本架構(gòu)圖中,我并沒有畫出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的內(nèi)部網(wǎng)絡(luò)是一個P2P網(wǎng)絡(luò),不依賴某幾個節(jié)點進(jìn)行位置查詢,避免了單點瓶頸。
生成ring文件的一致性哈希算法不但為數(shù)據(jù)的冗余性,分區(qū)容忍性提供了保證,也為整體架構(gòu)上實現(xiàn)性能、容量的橫向擴(kuò)展奠定了基礎(chǔ)。
Ring的詳細(xì)構(gòu)造過程將在下一節(jié)介紹。 - proxy-server
proxy-server是proxy node中唯一運行的服務(wù)進(jìn)程,也是swift集群的endpoint,向用戶提供RESTful API。
對于用戶的請求,proxy-server會根據(jù)配置文件的配置,將請求交給各個中間件進(jìn)行處理,其中最重要的就是Auth中間件(認(rèn)證),在處理完成后會根據(jù)請求路徑將請求轉(zhuǎn)發(fā)給相應(yīng)的storage node中的account-server。container-server或object-server進(jìn)程處理。
swift集群的流入數(shù)據(jù)和流出數(shù)據(jù)都需要經(jīng)過proxy-server,proxy-server不會對數(shù)據(jù)進(jìn)行緩存。 - auth-server
驗證服務(wù)進(jìn)程,為用戶生成token和驗證每個請求的token及token的權(quán)限。swift的驗證服務(wù)是作為一個中間件被proxy-server使用,是可選的,可以自己開發(fā),也可以使用OpenStack Keystone。Keystone是官方開發(fā)的驗證服務(wù),使用Keystone可以無縫的與其它OpenStack項目整合。 - account-server
account-server是storage node中負(fù)責(zé)處理對account的GET、HEAD、PUT、DELETE、RELICATION請求的服務(wù)進(jìn)程,account-server使用sqlite的數(shù)據(jù)庫文件保存account的相關(guān)信息。 - container-server
container-server是storage node中負(fù)責(zé)處理對container的GET、HEAD、PUT、DELETE、RELICATION請求的服務(wù)進(jìn)程,container-server使用sqlite的數(shù)據(jù)庫文件保存container的相關(guān)信息。 - object-server
object-server是storage node中負(fù)責(zé)處理對object的GET、HEAD、PUT、PSOT、DELETE、RELICATION請求的服務(wù)進(jìn)程,object-server直接操作object,并利用XFS文件系統(tǒng)的xattr包存object的元數(shù)據(jù)。 - account-auditor、container-auditor、object-auditor
這三個進(jìn)程運行在storage node中,分別檢測account的db文件,container的db文件,object是否損壞,如果損壞,將會向存儲有其它副本的storage node請求副本,替換損壞的。 - account-replicator、container-replicator、object-replicator
這三個進(jìn)程運行在storage node中,分別負(fù)責(zé)account的db文件,container的db文件,object在集群中副本的同步。
例如,一個object在swift集群中通常被存儲在3個不同的storage node中,對于一個PUT /account/container/object的請求,proxy-server會根據(jù) /account/container/object查詢ring文件,得到該object應(yīng)該存儲的節(jié)點列表(長度為3),proxy-server會將請求轉(zhuǎn)發(fā)到這三個節(jié)點。如果只有兩個節(jié)點寫入成功,就認(rèn)為這次PUT操作成功。寫入失敗的節(jié)點在一段時間后將會得到寫入成功的節(jié)點object-replicator進(jìn)程推送過來的數(shù)據(jù)。 - container-updater、account-updater
這兩個進(jìn)程運行在storage node中,負(fù)責(zé)container數(shù)據(jù)庫和account數(shù)據(jù)庫的異步更新。使用異步更新的原因:在請求來量大時,container-server和account-server不能實時處理對數(shù)據(jù)庫更新的請求,這些請求將被本地化到隊列中,由updater進(jìn)程進(jìn)行異步更新。
原理
Swift利用一致性哈希算法構(gòu)建了一個冗余的可擴(kuò)展的分布式對象存儲集群。下面將引用我的同事http://www.cnblogs.com/yuxc/的文章對ring實現(xiàn)原理進(jìn)行講解。
鏈接:http://vdisk.weibo.com/s/1rqxy
特性
- 滿足冗余性、可擴(kuò)展性、分區(qū)容忍性
- 內(nèi)部網(wǎng)絡(luò)是P2P網(wǎng)絡(luò),無單點瓶頸
- 橫向擴(kuò)展能力強(qiáng),性能、容量的擴(kuò)展只需要簡單地增加節(jié)點、
- 服務(wù)進(jìn)程使用高并發(fā)編程庫,請求處理能力強(qiáng),參見
http://gashero.iteye.com/blog/442177
http://oddments.org/scalestack-vs-node-vs-twisted-vs-eventlet - 一致性模型可選( http://alexyang.sinaapp.com/?p=95 )
總結(jié)
經(jīng)過對Swift原理、代碼的學(xué)習(xí)研究以及一系列地測試,我認(rèn)為Swift簡單、冗余、可擴(kuò)展的架構(gòu)保證了它能作為IaaS的一個基礎(chǔ)服務(wù)。至于服務(wù)的可用率能達(dá)到幾個9需要看運營這個服務(wù)的公司的運維能力。如果要達(dá)到像AWS S3這種規(guī)模的服務(wù),還需要對Swift的部份組件進(jìn)行優(yōu)化。