OpenStack的存儲服務被多個服務組件使用,非常的重要,而我的工作內容由Web轉向底層IAAS建設,基本上都是一臉懵,所以做點筆記mark一下。
存儲又被分成臨時存儲和持久存儲兩類。臨時存儲是指數據被虛擬機實例使用,一旦虛擬機實例被關機、重啟或刪除,該虛擬實例中的所有數據信息全部丟失。OpenStack項目中,部署完Nova計算服務組件之后,用戶可以使用nova boot 命令創建虛擬機實例,這時候虛擬機實例使用的就是臨時存儲,安全性沒有任何保障。
持久存儲包括對象存儲、塊存儲和文件系統存儲,不管虛擬機實例是否終止,它們的數據都是持續可用的,安全性比較高。
- DAS:Direct-Attached Storage(直連式存儲)一台服務器一個存儲,多機無法直接共享,需要借助操作系統的功能,如共享文件夾。
- SAN:Storage Area Network(存儲區域網絡)高成本的存儲方式,涉及到光纖和各類高端設備,有很高的可靠性和性能,就是設備貴、運維成本高。
b.文件系統存儲與較底層的塊存儲不同,上升到了應用層,一般指的就是 NAS,一套網絡儲存設備,通過TCP/IP進行訪問,協議為NFSv3/v4由於通過網絡,且采用上層協議,因此開銷大,延時肯定比塊存儲高,一般用於多個雲服務器共享數據,如服務器日志集中管理,辦公文件共享。
c.對象存儲跟自己開發的應用程序打交道(如網盤),具備塊存儲的高速以及文件存儲的共享等特性,較為智能,有自己的CPU、內存、網絡和磁盤,比塊存儲和文件存儲更上層,雲服務商一般提供用戶文件上傳下載讀取的Rest API,方便應用集成此類服務。
他們的層級是越來越高的。1、塊存儲服務(Cinder)介紹
塊存儲又稱為卷存儲(Volume Storage),為用戶提供基於數據塊的存儲設備訪問,用戶對數據塊存儲設備對訪問和交互是通過將數據塊存儲設備映射到正在運行到虛擬機實例上進行到,可以對其進行讀寫、格式化等。
塊存儲屬於持久存儲,當取消塊存儲設備與虛擬機實例之間當映射或將整個塊存儲重新映射給其他虛擬機實例的時候,該塊存儲上的數據都不受影響。塊存儲由OpenStack項目中的Cinder塊存儲服務組件提供,根據已經包含的存儲驅動,其目前支持多種類型的后端存儲。
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目錄中。
2、對象存儲(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對象存儲特點:
- 所有數據存放和訪問都有一個URL地址,通過URL可以直接訪問數據。
- 所有的數據保存三份(默認)副本,分布在不同的Zone區,隨機存放在集群中的任意位置。
- 所有的數據都有自己的元數據metadata(存儲文件所需的信息如:創建時間、時間更新、訪問規則等)。
- 開發人員可以通過API與Swift對象存儲進行交互操作。
- 集群添加存儲節點不產生性能損耗,是橫向擴展,而不是縱向疊加,也不需要停機添加存儲節點。
- 數據不需要一次性遷移到新存儲。
- 故障存儲節點或硬件設備不需要停機更換
- 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可以是一塊磁盤、一台服務器、甚至是一個數據中心,其標志性作用是允許存儲節點出現停機時間而數據仍然保持實時可用。
Account和Container都有自己獨立的SQLite數據庫,SQLite數據庫采用分布式部署在Swift對象存儲集群的多個存儲節點上。每個Account數據庫中包含屬於它的Container列表,同樣,每個Container數據庫中也包含屬於它的對象數據列表。
Object對象服務器是一個簡單的二進制大對象存儲服務器,可以用來存儲、檢索和刪除本地設備上的對象。在文件系統上,對象以二進制文件的形式存儲,它的元數據存儲在文件系統的擴展屬性(xattrs)中。這要求用於對象服務器的文件系統需要支持文件有擴展屬性。每個對象使用對象名稱的哈希值和操作的時間戳組成的路徑來存儲。最后一次寫操作總可以成功,並確保最新一次的對象版本將會被處理。刪除也被視為文件的一個版本(一個以".ts"結尾的0字節文件,ts表示墓碑)。這確保了被刪除的文件被正確地復制並且不會因為遭遇故障場景導致早些的版本神奇再現。
Partition代表需存儲數據的一個集合,包含多個Account數據庫、Container數據庫和相應的對象數據。關於Partition的概念很簡單,它就是存放在磁盤中的一個目錄,有自己的哈希表,關聯着屬於該Partition的Account數據庫、Container數據庫和相應的對象數據。數據副本的復制和對象數據的上傳下載都是基於Partition進行的。
Replicator會持續檢查每個Partition,保證存放在Swift對象存儲集群中三份數據副本的一致性,其中新數據的同步優先級較高。Replicator通過檢查哈希表確認是否需要進行數據重同步。每個Partition都有一張哈希表,包含一個含有哈希表的目錄。在集群中某個存儲節點宕機后,包含同樣數據副本的存儲節點會進行檢查和發出通知,並將數據復制到其他存儲節點上。
3、文件系統存儲
文件系統存儲是一個遠端的、可以被掛載的文件系統。它是共享的,通過掛載到虛擬機實例上,可以供多個租戶使用。文件系統存儲可以在同一時間被多個用戶同時掛載和訪問。可以進行一系列操作,比如:創建指定容量大小的文件和文件系統協議、創建的文件可以分布在一個或多個服務器、指定訪問規則和安全協議、支持快照、通過快照恢復一個文件系統、查看使用率等。OpenStack項目中,文件系統存儲的程序代號是manila,支持多種后端存儲驅動,通過多種存儲協議進行共享。