?簡介
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服務器)
架構
? ? ? ? 在介紹Swift的架構之前,先介紹一下OpenStack的 設計原理 :
- Scalability and elasticity are our main goals (可擴展性和伸縮性是我們的主要目標)
- Any feature that limits our main goals must be optional (任何影響到可擴展性和伸縮性的功能都必須是可選的)
- Everything should be asynchronous,If you can't do something asynchronously, see #2 (所有的環節必須是異步的,如果不能異步實現,參考第二條設計原理)
- All required components must be horizontally scalable (所有的基礎組件必須能橫向擴展)
- Always use shared nothing architecture? (SN) ?or? sharding ,If you can't Share nothing/shard, see #2 (始終使用無共享的架構,如果不能實現,參見第二條)
- Distribute everything,especially logic. Move logic to where state naturally exists.(所有的都是分布式的,尤其是邏輯。把邏輯放在狀態應該存在的地方)
- Accept eventual consistency and use it where it is appropriate. (接受最終一致性,并在適合的條件下使用)
- Test everything (充足的測試)
依賴組件
- Memcached,分布式緩存系統,在swift中主要被用于token和account信息,container信息的存儲
- Sqlite,輕量級數據庫引擎,在swift中主要被用于管理account和container數據庫
- rsync,遠程同步工具,用于storage node之間的數據同步
- XFS文件系統
- WSGI,Python Web服務網關接口,通過paste.deploy工具包管理swift各服務進程、中間件的處理流程
- Eventlet,Python搞并發網絡編程庫,swift所有的服務器進程均依賴于該庫
主要組件
- 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利用一致性哈希算法構建了一個冗余的可擴展的分布式對象存儲集群。下面將引用我的同事 http://www.cnblogs.com/yuxc/ 的文章對ring實現原理進行講解。 鏈接: http://vdisk.weibo.com/s/1rqxy
特性
- 滿足冗余性、可擴展性、分區容忍性
- 內部網絡是P2P網絡,無單點瓶頸
- 橫向擴展能力強,性能、容量的擴展只需要簡單地增加節點、
- 服務進程使用高并發編程庫,請求處理能力強,參見 http://gashero.iteye.com/blog/442177 http://oddments.org/scalestack-vs-node-vs-twisted-vs-eventlet
- 一致性模型可選( ?http://alexyang.sinaapp.com/?p=95 ?)
總結
經過對Swift原理、代碼的學習研究以及一系列地測試,我認為Swift簡單、冗余、可擴展的架構保證了它能作為IaaS的一個基礎服務。至于服務的可用率能達到幾個9需要看運營這個服務的公司的運維能力。如果要達到像AWS S3這種規模的服務,還需要對Swift的部份組件進行優化。 ?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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