天天看點

Create Volume 操作(Part I) - 每天5分鐘玩轉 OpenStack(50)向 cinder-api 發送請求cinder-api 發送消息

前面已經學習了 Cinder 的架構和相關元件,從本節我們開始詳細分析 Cinder 的各種操作,首先讨論 Cinder 如何建立 volume。

Create 操作流程如下:

客戶(可以是 OpenStack 最終使用者,也可以是其他程式)向 API(cinder-api)發送請求:“幫我建立一個 volume”。

API 對請求做一些必要處理後,向 Messaging(RabbitMQ)發送了一條消息:“讓 Scheduler 建立一個 volume”。

Scheduler(cinder-scheduler)從 Messaging 擷取到 API 發給它的消息,然後執行排程算法,從若幹計存儲點中選出節點 A。

Scheduler 向 Messaging 發送了一條消息:“讓存儲節點 A 建立這個 volume”。

存儲節點 A 的 Volume(cinder-volume)從 Messaging 中擷取到 Scheduler 發給它的消息,然後通過 driver 在 volume provider 上建立 volume。

因為 Create Volume 操作比較複雜,我們将分三次讨論:

今天是第一部分,讨論 cinder-api 的處理過程;

第二部分讨論 cinder-scheduler;

第三部分讨論 cinder-volume 的操作。

客戶(可以是 OpenStack最終使用者,也可以是其他程式)向 cinder-api發送請求:“幫我建立一個 volume。

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 的處理過程。

本文轉自CloudMan6 51CTO部落格,原文連結:http://blog.51cto.com/cloudman/1791561