OpenStack的存儲服務

    OpenStack的存儲服務被多個服務組件使用,很是的重要,而個人工做內容由Web轉向底層IAAS建設,基本上都是一臉懵,因此作點筆記mark一下。mysql

    存儲又被分紅臨時存儲和持久存儲兩類。臨時存儲是指數據被虛擬機實例使用,一旦虛擬機實例被關機、重啓或刪除,該虛擬實例中的全部數據信息所有丟失。OpenStack項目中,部署完Nova計算服務組件以後,用戶可使用nova boot 命令建立虛擬機實例,這時候虛擬機實例使用的就是臨時存儲,安全性沒有任何保障。web

    持久存儲包括對象存儲、塊存儲和文件系統存儲,無論虛擬機實例是否終止,它們的數據都是持續可用的,安全性比較高。sql

    a.塊存儲是和主機打交道的,就比如硬盤同樣直接掛到主機上,通常用於主機的直接存儲空間和數據庫應用(如: mysql)的存儲,分兩種
  • DAS:Direct-Attached Storage(直連式存儲)一臺服務器一個存儲,多機沒法直接共享,須要藉助操做系統的功能,如共享文件夾。
  • SAN:Storage Area Network(存儲區域網絡)高成本的存儲方式,涉及到光纖和各種高端設備,有很高的可靠性和性能,就是設備貴、運維成本高。

    b.文件系統存儲與較底層的塊存儲不一樣,上升到了應用層,通常指的就是 NAS,一套網絡儲存設備,經過TCP/IP進行訪問,協議爲NFSv3/v4因爲經過網絡,且採用上層協議,所以開銷大,延時確定比塊存儲高,通常用於多個雲服務器共享數據,如服務器日誌集中管理,辦公文件共享。數據庫

    c.對象存儲跟本身開發的應用程序打交道(如網盤),具有塊存儲的高速以及文件存儲的共享等特性,較爲智能,有本身的CPU、內存、網絡和磁盤,比塊存儲和文件存儲更上層,雲服務商通常提供用戶文件上傳下載讀取的Rest API,方便應用集成此類服務。swift

他們的層級是愈來愈高的。

一、塊存儲服務(Cinder)介紹

    塊存儲又稱爲卷存儲(Volume Storage),爲用戶提供基於數據塊的存儲設備訪問,用戶對數據塊存儲設備對訪問和交互是經過將數據塊存儲設備映射到正在運行到虛擬機實例上進行到,能夠對其進行讀寫、格式化等。後端

    塊存儲屬於持久存儲,當取消塊存儲設備與虛擬機實例之間當映射或將整個塊存儲從新映射給其餘虛擬機實例的時候,該塊存儲上的數據都不受影響。塊存儲由OpenStack項目中的Cinder塊存儲服務組件提供,根據已經包含的存儲驅動,其目前支持多種類型的後端存儲。api

    OpenStack項目中的Cinder塊存儲服務組件爲虛擬機實例提供了塊存儲設備,同時爲管理存儲設備提供了一整套方法,如卷快照、卷類型等。塊存儲類型是由驅動或者後端設備配置的驅動決定的,如NAS、NFS、SAN、ISCSI、Ceph。Cinder塊存儲服務組件的API和cinder-scheduler服務一般運行在控制節點上,cinder-volume服務能夠運行在控制節點、計算節點或者獨立的存儲節點上。緩存

    Cinder塊存儲服務組件由如下服務進程組成安全

(1)cinder-api:接收API請求,並將請求轉發到cinder-volume。服務器

(2)cinder-volume:與塊存儲直接進行交互通訊,處理一些任務(如由cinder-scheduler分配的),同時經過消息隊列與這些任務交互通訊。還會維護塊存儲的狀態,經過驅動與各類類型的存儲進行交互通訊。

(3)cinder-scheduler daemon:選擇最佳存儲節點建立卷。(nova-scheduler具備類似功能)

(4)cinder-backup daemon:提供任意類型卷的備份。

(5)messaging queue:負責在各進程間傳遞消息。

許多存儲驅動支持虛擬機實例直接訪問底層存儲,不用再通過層層轉化致使性能的消耗,提高了總體的I/O性能。同時,Cinder塊存儲服務組件也支持使用文件做爲塊設備,如NFS、GlusterFS。在NFS和GlusterFS文件系統中,能夠建立一個獨立文件做爲塊設備映射給虛擬機實例使用。相似於在QEMU中建立虛擬機實例,這些虛擬機實例是一個個文件,保存在/var/lib/nova/instances目錄中。

二、對象存儲(Swift)服務介紹

    OpenStack項目中的Swift對象存儲服務組件經過REST API提供對象數據存儲和檢索,它至少要和Keystone身份認證服務組件配合使用,部署Swift對象存儲組件以前得肯定Keystone 已經就緒。Swift組件支持多租戶,投入成本低,具備高擴展性和存儲大量非結構化數據的特性。

    Swift對象存儲服務組件包括下面幾個部分:

  • Proxy servers(swift-proxy-server):代理服務器負責Swift架構的其他組件間的相互通訊,接收對象存儲的API和HTTP請求,修改metadata、建立containers,對於每一個客戶端的請求,它將在環中查詢賬號、容器或者對象的位置而且相應地轉發請求。也可使用公共API向代理服務器發送請求。同時也在web圖形界面上提供文件或者containers列表,還使用MemCached提供緩存功能,提升性能。
  • Account servers(swift-account-server):帳戶服務器,管理對象存儲內的帳戶
  • Container servers(swift-container-server):容器服務器的首要工做是處理對象的列表,管理對象存儲內containers和文件夾之間的映射。容器服務器並不知道對象存在哪,只知道指定容器裏存的哪些對象。 這些對象信息以sqlite數據庫文件的形式存儲,和對象同樣在集羣上作相似的備份。容器服務器也作一些跟蹤統計,好比對象的總數,容器的使用狀況。
  • Object servers(swift-object-server):對象服務器管理真正的對象數據,是一個簡單的二進制大對象存儲服務器,能夠用來存儲、檢索和刪除本地設備上的對象。每一個對象使用對象名稱的哈希值和操做時間戳組成的路徑來進行存儲。最後一次寫操做必定會成功,同時最新一次的對象版本會被處理。刪除也被視爲文件的一個版本(一個以".ts"結尾的0字節文件,ts表示墓碑)。這保證了被刪除的文件能被正確地複製,而且不會由於遭遇故障場景緻使早些的版本神奇再現。
  • Various periodic processes:執行平常事務,其中的複製服務可以保證數據的連續性和有效性,還包括審覈服務、更新服務和刪除服務。
  • WSGI middleware:處理認證相關的問題,與keystone身份認證服務組件鏈接。
  • swift client:容許各類具備權限的用戶在該客戶端上提交命令,執行操做。
  • swift-init:初始化Ring 文件的腳本,須要守護進程名字做參數,並提供操做命令。
  • swift-recon:CLI工具,用於檢索集羣各類性能指標和狀態信息。
  • swift-ring-builder:建立和重平衡Ring的工具。

    Swift對象存儲依靠軟件邏輯設計使數據均勻分佈存儲,通常狀況下默認保存三份數據,三份數據保存位置對集羣總體性能對影響很大,能夠選擇在同一服務器對不一樣硬盤中,也能夠分佈在同一機架內的不一樣服務器中。在Swift對象存儲集羣中,當出現存儲數據當主機節點宕機時,整個集羣的負載壓力很大(某個副本出問題,瞬間會有幾倍的數據須要傳輸、重平衡),生產上要儘量多地使用網卡聚合和固態磁盤等技術來提升總體性能。

    Swift對象存儲特色:

  1. 全部數據存放和訪問都有一個URL地址,經過URL能夠直接訪問數據。
  2. 全部的數據保存三份(默認)副本,分佈在不一樣的Zone區,隨機存放在集羣中的任意位置。
  3. 全部的數據都有本身的元數據metadata(存儲文件所需的信息如:建立時間、時間更新、訪問規則等)。
  4. 開發人員能夠經過API與Swift對象存儲進行交互操做。
  5. 集羣添加存儲節點不產生性能損耗,是橫向擴展,而不是縱向疊加,也不須要停機添加存儲節點。
  6. 數據不須要一次性遷移到新存儲。
  7. 故障存儲節點或硬件設備不須要停機更換
  8. Swift對象存儲運行在標準的x86服務器上,如Dell、HP和Lenovo服務器。

    Proxy Server是Swift對象存儲的公共接口,接收並處理全部傳入的請求。接收到請求後根據對象數據到URL定位到相應的存儲節點上,若是某個請求存儲節點不可用,它將會查詢可傳送的服務器並轉發請求,同時它還負責協助處理請求反饋、請求失敗和標記時間戳等。Proxy Server採用共享無狀態架構,可以根據業務負載壓力擴展Proxy Server,最小等Proxy Server集羣包含兩個主機節點,當其中一個節點出現故障的時候,另外一個主機可以接管全部的業務請求。

    Ring是對象數據的名稱與其在磁盤上具體位置之間的映射。Account、Container、Object都有相應的Ring,它們之間的組合會產生許多Rings。當swift的其它組件(好比複製)要對Account、Container或Object操做時,須要與相應的Ring進行交互操做來肯定其在磁盤上的集體位置。Ring使用區域Zone、磁盤設備、虛節點Partition和數據副原本維護這些映射信息。Ring中每一個Partition在集羣中都(默認)有3個副本。每一個虛節點的位置由Ring來維護,並存儲在映射中。當代理服務器轉發的客戶端請求失敗時,Ring也負責決定由哪個設備來接手請求。Ring使用Zone對數據進行隔離,理想狀態下每一個副本都存儲在不一樣的Zone中。在swift安裝的時候,Ring的虛節點會均衡地劃分到全部的設備中。當虛節點須要移動時(例如新設備被加入到集羣),Ring會確保一次移動最少數量的虛節點數,而且一次只移動一個虛節點的一個副本。經過設置權重值能夠平衡Partition虛節點的分佈,控制數據流向,避免集羣在壓力負載大時各主機節點的壓力負載不均衡。

    Zone主要功能是Swift對象隔離風險,當某一Zone內的數據丟失或被破壞時,不影響其餘Zone內的數據副本,保持了數據總體上的完整性和可用性。Zone能夠是一塊磁盤、一臺服務器、甚至是一個數據中心,其標誌性做用是容許存儲節點出現停機時間而數據仍然保持實時可用。

    AccountContainer都有本身獨立的SQLite數據庫,SQLite數據庫採用分佈式部署在Swift對象存儲集羣的多個存儲節點上。每一個Account數據庫中包含屬於它的Container列表,一樣,每一個Container數據庫中也包含屬於它的對象數據列表。

    Object對象服務器是一個簡單的二進制大對象存儲服務器,能夠用來存儲、檢索和刪除本地設備上的對象。在文件系統上,對象以二進制文件的形式存儲,它的元數據存儲在文件系統的擴展屬性(xattrs)中。這要求用於對象服務器的文件系統須要支持文件有擴展屬性。每一個對象使用對象名稱的哈希值和操做的時間戳組成的路徑來存儲。最後一次寫操做總能夠成功,並確保最新一次的對象版本將會被處理。刪除也被視爲文件的一個版本(一個以".ts"結尾的0字節文件,ts表示墓碑)。這確保了被刪除的文件被正確地複製而且不會由於遭遇故障場景緻使早些的版本神奇再現。

    Partition表明需存儲數據的一個集合,包含多個Account數據庫、Container數據庫和相應的對象數據。關於Partition的概念很簡單,它就是存放在磁盤中的一個目錄,有本身的哈希表,關聯着屬於該Partition的Account數據庫、Container數據庫和相應的對象數據。數據副本的複製和對象數據的上傳下載都是基於Partition進行的。

    Replicator會持續檢查每一個Partition,保證存放在Swift對象存儲集羣中三份數據副本的一致性,其中新數據的同步優先級較高。Replicator經過檢查哈希表確認是否須要進行數據重同步。每一個Partition都有一張哈希表,包含一個含有哈希表的目錄。在集羣中某個存儲節點宕機後,包含一樣數據副本的存儲節點會進行檢查和發出通知,並將數據複製到其餘存儲節點上。

三、文件系統存儲

    文件系統存儲是一個遠端的、能夠被掛載的文件系統。它是共享的,經過掛載到虛擬機實例上,能夠供多個租戶使用。文件系統存儲能夠在同一時間被多個用戶同時掛載和訪問。能夠進行一系列操做,好比:建立指定容量大小的文件和文件系統協議、建立的文件能夠分佈在一個或多個服務器、指定訪問規則和安全協議、支持快照、經過快照恢復一個文件系統、查看使用率等。OpenStack項目中,文件系統存儲的程序代號是manila,支持多種後端存儲驅動,經過多種存儲協議進行共享。

相關文章
相關標籤/搜索