cinder— 存儲服務
1、cinder 介紹:
理解 Block Storage
操做系統得到存儲空間的方式通常有兩種:
-
經過某種協議(SAS,SCSI,SAN,iSCSI 等)掛接裸硬盤,而後分區、格式化、建立文件系統;或者直接使用裸硬盤存儲數據(數據庫)
-
經過 NFS、CIFS 等 協議,mount 遠程的文件系統
第一種裸硬盤的方式叫作 Block Storage(塊存儲),每一個裸硬盤一般也稱做 Volume(卷) 第二種叫作文件系統存儲。NAS 和 NFS 服務器,以及各類分佈式文件系統提供的都是這種存儲。
理解 Block Storage Service
Block Storage Servicet 提供對 volume 從建立到刪除整個生命週期的管理。從 instance 的角度看,掛載的每個 Volume 都是一塊硬盤。OpenStack 提供 Block Storage Service 的是 Cinder,其具體功能是:
-
提供 REST API 使用戶可以查詢和管理 volume、volume snapshot 以及 volume type
-
提供 scheduler 調度 volume 建立請求,合理優化存儲資源的分配
-
經過 driver 架構支持多種 back-end(後端)存儲方式,包括 LVM,NFS,Ceph 和其餘諸如 EMC、IBM 等商業存儲產品和方案
Cinder 架構
下圖是 cinder 的邏輯架構圖
Cinder 包含以下幾個組件:
cinder-api
接收 API 請求, 調用 cinder-volume 。是整個 Cinder 組件的門戶,全部 cinder 的請求都首先由 cinder-api 處理。cinder-api 向外界暴露若干 HTTP REST API 接口。在 keystone 中咱們能夠查詢 cinder-api 的 endponits。
客戶端能夠將請求發送到 endponits 指定的地址,向 cinder-api 請求操做。 固然,做爲最終用戶的咱們不會直接發送 Rest API 請求。OpenStack CLI,Dashboard 和其餘須要跟 Cinder 交換的組件會使用這些 API。前端
cinder-api 對接收到的 HTTP API 請求會作以下處理:
一、檢查客戶端傳人的參數是否合法有效
二、調用 cinder 其餘子服務的處理客戶端請求
三、將 cinder 其餘子服務返回的結果序列號並返回給客戶端
cinder-api 接受哪些請求呢?簡單的說,只要是 Volume 生命週期相關的操做,cinder-api 均可以響應。大部分操做均可以在 Dashboard 上看到。mysql
cinder-volume
管理 volume 的服務,與 volume provider 協調工做,管理 volume 的生命週期。運行 cinder-volume 服務的節點被稱做爲存儲節點。
cinder-volume 在存儲節點上運行,OpenStack 對 Volume 的操做,最後都是交給 cinder-volume 來完成的。cinder-volume 自身並無論理真正的存儲設備,存儲設備是由
volume provider 管理的。cinder-volume 與 volume provider 一塊兒實現 volume 生命週期的管理。
經過 Driver 架構支持多種 Volume Providerredis
接着的問題是:如今市面上有這麼多塊存儲產品和方案(volume provider),cinder-volume 如何與它們配合呢?算法
經過的 Driver 架構。 cinder-volume 爲這些 volume provider 定義了統一的接口,volume provider 只須要實現這些接口,就能夠 Driver 的形式即插即用到 OpenStack 系統中。sql
按期向 OpenStack 報告計算節點的狀態數據庫
cinder-volume 會按期向 Cinder 報告存儲節點的空閒容量來作篩選啓動volumevim
實現 volume 生命週期管理
後端
Cinder 對 volume 的生命週期的管理最終都是經過 cinder-volume 完成的,包括 volume 的 create、extend、attach、snapshot、delete 等。
api
cinder-scheduler
scheduler 經過調度算法選擇最合適的存儲節點建立 volume。 建立 Volume 時,cinder-scheduler 會基於容量、Volume Type 等條件選擇出最合適的存儲節點,而後讓其建立 Volume
volume provider
數據的存儲設備,爲 volume 提供物理存儲空間。 cinder-volume 支持多種 volume provider,每種 volume provider 經過本身的 driver 與cinder-volume 協調工做。
Message Queue
Cinder 各個子服務經過消息隊列實現進程間通訊和相互協做。由於有了消息隊列,子服務之間實現瞭解耦,這種鬆散的結構也是分佈式系統的重要特徵。
Database Cinder
有一些數據須要存放到數據庫中,通常使用 MySQL。數據庫是安裝在控制節點上的,好比在咱們的實驗環境中,能夠訪問名稱爲「cinder」的數據庫。
物理部署方案
Cinder 的服務會部署在兩類節點上,控制節點和存儲節點。咱們來看看控制節點 controller 上都運行了哪些 cinder-* 子服務。
cinder-api 和 cinder-scheduler 部署在控制節點上,這個很合理。
至於 cinder-volume 也在控制節點上可能有些同窗就會迷糊了:cinder-volume 不是應該部署在存儲節點上嗎?
要回答這個問題,首先要搞清楚一個事實: OpenStack 是分佈式系統,其每一個子服務均可以部署在任何地方,只要網絡可以連通。不管是哪一個節點,只要上面運行了 cinder-volume,它就是一個存儲節點,固然,該節點上也能夠運行其餘 OpenStack服務。
cinder-volume 是一頂存儲節點帽子,cinder-api 是一頂控制節點帽子。在咱們的環境中,devstack-controller 同時戴上了這兩頂帽子,因此它既是控制節點,又是存儲節點。固然,咱們也能夠用一個專門的節點來運行 cinder-volume。
這再一次展現了 OpenStack 分佈式架構部署上的靈活性: 能夠將全部服務都放在一臺物理機上,用做一個 All-in-One 的測試環境;而在生產環境中能夠將服務部署在多臺物理機上,得到更好的性能和高可用。
RabbitMQ 和 MySQL 一般放在控制節點上。另外,也能夠用 cinder service list 查看 cinder-* 子服務都分佈在哪些節點上
還有一個問題:volume provider 放在那裏?
通常來說,volume provider 是獨立的。cinder-volume 使用 driver 與 volume provider 通訊並協調工做。因此只須要將 driver 與 cinder-volume 放到一塊兒就能夠了。在 cinder-volume 的源代碼目錄下有不少 driver,支持不一樣的 volume provider。
後面咱們會以 LVM 和 NFS 這兩種 volume provider 爲例討論 cinder-volume 的使用,其餘 volume provider 能夠查看 OpenStack 的 configuration 文檔。
2、 Cinder 的設計思想: