?簡介
OpenStack Object Storage(Swift) 是 OpenStack 開源云計(jì)算項(xiàng)目的子項(xiàng)目之一。Swift使用普通的服務(wù)器來構(gòu)建 冗余的 、 可擴(kuò)展的 分布式 對(duì)象存儲(chǔ) 集群,存儲(chǔ)容量可達(dá)PB級(jí)。Swift的是用Python開發(fā),前身是 Rackspace Cloud Files 項(xiàng)目,隨著Rackspace加入到OpenStack社區(qū),Racksapce也將Cloud Files的代碼貢獻(xiàn)給了社區(qū),并逐漸形成現(xiàn)在Swift。Swift最新的發(fā)型版本為essex?1.4.6。
功能
Swift提供的服務(wù)與AWS S3相同,可以用以下用途:
- 作為IaaS的存儲(chǔ)服務(wù)
- 與OpenStack Compute對(duì)接,為其存儲(chǔ)鏡像
- 文檔存儲(chǔ)
- 存儲(chǔ)需要長期保存的數(shù)據(jù),例如log
- 存儲(chǔ)網(wǎng)站的圖片,縮略圖等
Swift使用RESTful API對(duì)外提供服務(wù),目前 1.4.6版本所提供的功能:
- Account(存儲(chǔ)賬戶)的GET、HEAD
- Container(存儲(chǔ)容器,與S3的bucket相同)的GET、PUT、HEAD、DELETE
- Object(存儲(chǔ)對(duì)象)的GET、PUT、HEAD、DELETE、DELETE
- Account、Container、Object的元數(shù)據(jù)支持
- 大文件(無上限,單個(gè)無文件最大5G,大于5G的文件在客戶端切分上傳,并上傳manifest文件)、
- 訪問控制、權(quán)限控制
- 臨時(shí)對(duì)象存儲(chǔ)(過期對(duì)象自動(dòng)刪除)
- 存儲(chǔ)請(qǐng)求速率限制
- 臨時(shí)鏈接(讓任何用戶訪問對(duì)象,不需要使用Token)
- 表單提交(直接從HTML表單上傳文件到Swift存儲(chǔ),依賴與臨時(shí)鏈接)
- 靜態(tài)WEB站點(diǎn)(用Swift作為靜態(tài)站點(diǎn)的WEB服務(wù)器)
架構(gòu)
? ? ? ? 在介紹Swift的架構(gòu)之前,先介紹一下OpenStack的 設(shè)計(jì)原理 :
- 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é)必須是異步的,如果不能異步實(shí)現(xiàn),參考第二條設(shè)計(jì)原理)
- 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),如果不能實(shí)現(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信息的存儲(chǔ)
- Sqlite,輕量級(jí)數(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文件,但是它卻是整個(gè)Swift中最重要的組件。ring文件是由一致性哈希算法生成,它的主要作用是存儲(chǔ)名字到位置的映射。 ring文件分為三類,分別是:account.ring,container.ring,object.ring。 對(duì)于account的請(qǐng)求,就能通過account_name查詢account.ring得到{'/account_name' : account_db_position}的映射,從而知道account數(shù)據(jù)庫文件在集群的位置; 對(duì)于container的請(qǐng)求,通過account_name和container_name查詢container.ring文件,得到{'/account_name/container_name' : container_db_position}的映射; 對(duì)于object的請(qǐng)求,通過account_name,container_name,object_name查詢object.ring文件,得到{'/account_name/container_name/object_name' : object_position}的映射; Ring文件作為一個(gè)靜態(tài)文件存儲(chǔ)在每個(gè)節(jié)點(diǎn)的/etc/swift目錄下,被用于各節(jié)點(diǎn)之間的位置查詢,使得swift的內(nèi)部網(wǎng)絡(luò)是一個(gè)P2P網(wǎng)絡(luò),不依賴某幾個(gè)節(jié)點(diǎn)進(jìn)行位置查詢,避免了單點(diǎn)瓶頸。 生成ring文件的一致性哈希算法不但為數(shù)據(jù)的冗余性,分區(qū)容忍性提供了保證,也為整體架構(gòu)上實(shí)現(xiàn)性能、容量的橫向擴(kuò)展奠定了基礎(chǔ)。 Ring的詳細(xì)構(gòu)造過程將在下一節(jié)介紹。
- proxy-server proxy-server是proxy node中唯一運(yùn)行的服務(wù)進(jìn)程,也是swift集群的endpoint,向用戶提供RESTful API。 對(duì)于用戶的請(qǐng)求,proxy-server會(huì)根據(jù)配置文件的配置,將請(qǐng)求交給各個(gè)中間件進(jìn)行處理,其中最重要的就是Auth中間件(認(rèn)證),在處理完成后會(huì)根據(jù)請(qǐng)求路徑將請(qǐng)求轉(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不會(huì)對(duì)數(shù)據(jù)進(jìn)行緩存。
- auth-server 驗(yàn)證服務(wù)進(jìn)程,為用戶生成token和驗(yàn)證每個(gè)請(qǐng)求的token及token的權(quán)限。swift的驗(yàn)證服務(wù)是作為一個(gè)中間件被proxy-server使用,是可選的,可以自己開發(fā),也可以使用OpenStack Keystone。Keystone是官方開發(fā)的驗(yàn)證服務(wù),使用Keystone可以無縫的與其它OpenStack項(xiàng)目整合。
- account-server account-server是storage node中負(fù)責(zé)處理對(duì)account的GET、HEAD、PUT、DELETE、RELICATION請(qǐng)求的服務(wù)進(jìn)程,account-server使用sqlite的數(shù)據(jù)庫文件保存account的相關(guān)信息。
- container-server container-server是storage node中負(fù)責(zé)處理對(duì)container的GET、HEAD、PUT、DELETE、RELICATION請(qǐng)求的服務(wù)進(jìn)程,container-server使用sqlite的數(shù)據(jù)庫文件保存container的相關(guān)信息。
- object-server object-server是storage node中負(fù)責(zé)處理對(duì)object的GET、HEAD、PUT、PSOT、DELETE、RELICATION請(qǐng)求的服務(wù)進(jìn)程,object-server直接操作object,并利用XFS文件系統(tǒng)的xattr包存object的元數(shù)據(jù)。
- account-auditor、container-auditor、object-auditor 這三個(gè)進(jìn)程運(yùn)行在storage node中,分別檢測account的db文件,container的db文件,object是否損壞,如果損壞,將會(huì)向存儲(chǔ)有其它副本的storage node請(qǐng)求副本,替換損壞的。
- account-replicator、container-replicator、object-replicator 這三個(gè)進(jìn)程運(yùn)行在storage node中,分別負(fù)責(zé)account的db文件,container的db文件,object在集群中副本的同步。 例如,一個(gè)object在swift集群中通常被存儲(chǔ)在3個(gè)不同的storage node中,對(duì)于一個(gè)PUT /account/container/object的請(qǐng)求,proxy-server會(huì)根據(jù)?/account/container/object查詢r(jià)ing文件,得到該object應(yīng)該存儲(chǔ)的節(jié)點(diǎn)列表(長度為3),proxy-server會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到這三個(gè)節(jié)點(diǎn)。如果只有兩個(gè)節(jié)點(diǎn)寫入成功,就認(rèn)為這次PUT操作成功。寫入失敗的節(jié)點(diǎn)在一段時(shí)間后將會(huì)得到寫入成功的節(jié)點(diǎn)object-replicator進(jìn)程推送過來的數(shù)據(jù)。
- container-updater、account-updater 這兩個(gè)進(jìn)程運(yùn)行在storage node中,負(fù)責(zé)container數(shù)據(jù)庫和account數(shù)據(jù)庫的異步更新。使用異步更新的原因:在請(qǐng)求來量大時(shí),container-server和account-server不能實(shí)時(shí)處理對(duì)數(shù)據(jù)庫更新的請(qǐng)求,這些請(qǐng)求將被本地化到隊(duì)列中,由updater進(jìn)程進(jìn)行異步更新。
原理
Swift利用一致性哈希算法構(gòu)建了一個(gè)冗余的可擴(kuò)展的分布式對(duì)象存儲(chǔ)集群。下面將引用我的同事 http://www.cnblogs.com/yuxc/ 的文章對(duì)ring實(shí)現(xiàn)原理進(jìn)行講解。 鏈接: http://vdisk.weibo.com/s/1rqxy
特性
- 滿足冗余性、可擴(kuò)展性、分區(qū)容忍性
- 內(nèi)部網(wǎng)絡(luò)是P2P網(wǎng)絡(luò),無單點(diǎn)瓶頸
- 橫向擴(kuò)展能力強(qiáng),性能、容量的擴(kuò)展只需要簡單地增加節(jié)點(diǎn)、
- 服務(wù)進(jìn)程使用高并發(fā)編程庫,請(qǐng)求處理能力強(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)過對(duì)Swift原理、代碼的學(xué)習(xí)研究以及一系列地測試,我認(rèn)為Swift簡單、冗余、可擴(kuò)展的架構(gòu)保證了它能作為IaaS的一個(gè)基礎(chǔ)服務(wù)。至于服務(wù)的可用率能達(dá)到幾個(gè)9需要看運(yùn)營這個(gè)服務(wù)的公司的運(yùn)維能力。如果要達(dá)到像AWS S3這種規(guī)模的服務(wù),還需要對(duì)Swift的部份組件進(jìn)行優(yōu)化。 ?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
