也叫作 block storage算法
每一個裸硬盤一般也稱做 Volume(卷)數據庫
經過某種協議(SAS,SCSI,SAN,iSCSI 等)掛接裸硬盤,而後分區、格式化、建立文件系統api
NAS 和 NFS 服務器,以及各類分佈式文件系統提供的都是這種存儲服務器
一、Block Storage Service 提供對 volume 從建立到刪除整個生命週期的管理分佈式
二、從 instance 的角度看,掛載的每個 Volume 都是一塊硬盤ide
三、OpenStack 提供 Block Storage Service 的是 Cinder日誌
提供 REST API 使用戶可以查詢和管理 volume、volume snapshot 以及 volume typeblog
管理 volume 的服務,與 volume provider 協調工做,管理 volume 的生命週期生命週期
運行 cinder-volume 服務的節點被稱做爲存儲節點隊列
scheduler 經過調度算法選擇最合適的存儲節點建立 volume
數據的存儲設備,爲 volume 提供物理存儲空間
cinder-volume 支持多種 volume provider,每種 volume provider 經過本身的 driver 與 cinder-volume 協調工做
Cinder 各個子服務經過消息隊列實現進程間通訊和相互協做
有了消息隊列,子服務之間實現瞭解耦,這種鬆散的結構也是分佈式系統的重要特徵
Cinder 有一些數據須要存放到數據庫中,通常使用 MySQL
1)、客戶(能夠是 OpenStack 最終用戶,也能夠是其餘程序)向 API(cinder-api)發送請求:「幫我建立一個 volume」
2)、API 對請求作一些必要處理後,向 Messaging(RabbitMQ)發送了一條消息:「讓 Scheduler 建立一個 volume」。
3)、cheduler(cinder-scheduler)從 Messaging 獲取到 API 發給它的消息,而後執行調度算法,從若干計存儲點中選出節點 A
4)、Scheduler 向 Messaging 發送了一條消息:「讓存儲節點 A 建立這個 volume」。
5)、存儲節點 A 的 Volume(cinder-volume)從 Messaging 中獲取到 Scheduler 發給它的消息,而後經過 driver 在 volume provider 上建立 volume。
Part 1
# GUI 上操做的菜單爲 Project -> Compute -> Volumes -> Create Volume
設置 volume 的名稱,volume type,capacity,Availability Zone 等基本信息。
# 點擊「Create Volume」 按鈕,cinder-api 將接收到建立 volume 的請求。
查看 cinder-api 日誌 /opt/stack/logs/c-api.log
# 日誌顯示 cinder-api 接收到一個 POST 類型的 REST API
分析 HTTP body ,明確該請求
Part 2
# 緊接着,cinder-api 啓動了一個 Flow(工做流)volume_create_api
Flow 的執行狀態依次爲 PENDING, RUNNING 和 SUCCESS
volume_create_api 當前的狀態由 PENDING 變爲 RUNNING
# volume_create_api 工做流包含若干 Task,每一個 Task 完成特定的任務。
這些任務依次爲 ExtractVolumeRequestTask, QuotaReserveTask, EntryCreateTask, QuotaCommitTask, VolumeCastTask
# ExtractVolumeRequestTask 獲取 request 信息
QuotaReserveTask 預留配額
EntryCreateTask 在數據庫中建立 volume 條目
QuotaCommitTask 確認配額
VolumeCastTask 是向 cinder-sheduler 發送消息,開始調度工做
# Flow volume_create_api 已經完成,狀態由 RUNNING 變爲 SUCCESS,volume 建立成功
# 注意
「volume 建立成功」只是指 cinder-api 已經成功處理了 volume create 請求,將消息發給了 cinder-scheduler,
但並不意味 volume 在存儲節點上已經成功建立,這一點是容易引發誤解的。
咱們能夠經過 cinder-volume 建立 volume 日誌的時間戳驗證
Part 3
# cinder-api 向 RabbitMQ 發送了一條消息:「讓cinder-scheduler 建立一個 volume」
# 這是由 VolumeCastTask 發出的,可是它沒有打印相關的日誌
# 因此咱們只能經過源代碼查看 /opt/stack/cinder/cinder/volume/flows/api/create_volume.py ,方法爲create_volume
Part 1
# cinder scheduler 執行調度算法,經過 filter 和 weight 挑選最優的存儲節點日誌爲/opt/stack/logs/c-sch.log
# cinder scheduler 經過 flow volume_create_scheduler 執行調度工做
# 該 Flow 依次執行 ExtractSchedulerSpecTask 和 ScheduleCreateVolumeTask
# 主要的 filter 和 weighting 工做由 ScheduleCreateVolumeTask 完成。
# 通過 AvailabilityZoneFilter, CapacityFilter, CapabilitiesFilter 和 CapacityWeigher 的層層篩選
最終選擇了存儲節點 (假設:devstack-controller@lvmdriver-1#lvmdriver-1)
# Flow volume_create_scheduler 完成調度,狀態變爲 SUCCESS
Part 2
# cinder-scheduler 發送消息給 cinder-volume
# 讓其建立 volume 源碼 /opt/stack/cinder/cinder/scheduler/filter_scheduler.py,方法爲 schedule_create_volume
Part 1
# cinder volume 經過 driver 建立 volume,日誌爲 /opt/stack/c-vol.log
# cinder-volume 也啓動了一個 Flow 來完成 volume 建立工做,Flow 的名稱爲 volume_create_manager
# volume_create_manager 首先執行 ExtractVolumeRefTask, OnFailureRescheduleTask, ExtractVolumeSpecTask, NotifyVolumeActionTask 爲 volume 建立作準備
Part 2
# 接下來 CreateVolumeFromSpecTask 執行 volume 建立任務
# 由於 volume provider 爲 LVM, CreateVolumeFromSpecTask 經過 lvcreate 命令在 VG stack-volumes-lvmdriver-1 中建立了一個 1G(假設) 的 LV,cinder-volume 將這個 LV 做爲volume
新建立的 LV 命名爲「volume-1e7f6bd7-ce11-4a73-b95e-aabd65a5b188」(假設),其格式爲「volume-<volume ID>」
Part 3
# 最後,CreateVolumeOnFinishTask 完成掃尾工做
# 至此,volume 成功建立,Flow volume_create_manager 結束