前面已經學習了 Cinder 的架構和相關組件,從本節咱們開始詳細分析 Cinder 的各類操做,首先討論 Cinder 如何建立 volume。算法
Create 操做流程以下:數據庫
客戶(能夠是 OpenStack 最終用戶,也能夠是其餘程序)向 API(cinder-api)發送請求:「幫我建立一個 volume」。api
API 對請求作一些必要處理後,向 Messaging(RabbitMQ)發送了一條消息:「讓 Scheduler 建立一個 volume」。架構
Scheduler(cinder-scheduler)從 Messaging 獲取到 API 發給它的消息,而後執行調度算法,從若干計存儲點中選出節點 A。ide
Scheduler 向 Messaging 發送了一條消息:「讓存儲節點 A 建立這個 volume」。學習
存儲節點 A 的 Volume(cinder-volume)從 Messaging 中獲取到 Scheduler 發給它的消息,而後經過 driver 在 volume provider 上建立 volume。spa
由於 Create Volume 操做比較複雜,咱們將分三次討論:
今天是第一部分,討論 cinder-api 的處理過程;
第二部分討論 cinder-scheduler;
第三部分討論 cinder-volume 的操做。日誌
客戶(能夠是 OpenStack最終用戶,也能夠是其餘程序)向 cinder-api發送請求:「幫我建立一個 volume。ci
GUI 上操做的菜單爲 Project -> Compute -> Volumes -> Create Volume工作流
設置 volume 的名稱,volume type,大小,Availability Zone 等基本信息。
這裏咱們沒有設置 Volume Source,這樣會建立一個空白的 volume。
點擊「Create Volume」 按鈕,cinder-api 將接收到建立 volume 的請求。 查看 cinder-api 日誌 /opt/stack/logs/c-api.log。
日誌顯示 cinder-api 接收到一個 POST 類型的 REST API,通過對 HTTP body 的分析,該請求是:建立一個 1GB 的 volume。
緊接着,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。 Task 的執行狀態也會經歷 PENDING, RUNNING 和 SUCCESS 三個階段。
Task 的名稱基本上說明了任務的工做內容,前面幾個 Task 主要是作一些建立 volume 的準備工做,好比:
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 日誌的時間戳驗證。
cinder-api 向 RabbitMQ 發送了一條消息:「讓cinder-scheduler 建立一個 volume」 前面咱們提到消息是由 VolumeCastTask 發出的,由於 VolumeCastTask 沒有打印相關日誌,咱們只能經過源代碼查看 /opt/stack/cinder/cinder/volume/flows/api/create_volume.py ,方法爲 create_volume。
下一節咱們討論 Create Volume 的第二部分: cinder-scheduler 的處理過程。