Create Volume 操作(Part I) - 每天5分鐘玩轉 OpenStack(50)

Create Volume 操作(Part I) - 每天5分鐘玩轉 OpenStack(50)

wKioL1iu6eSRRzKqAAEMIJWBpbk066.jpg

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


Create 操作流程如下:

wKiom1iu6gCDtwheAACFZJOwNtI504.jpg

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

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

  3. Scheduler(cinder-scheduler)從 Messaging 獲取到 API 發給它的消息,然後執行調度算法,從若干計存儲點中選出節點 A。

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

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

因爲 Create Volume 操作比較複雜,我們將分三次討論:
今天是第一部分,討論 cinder-api 的處理過程;
第二部分討論 cinder-scheduler;
第三部分討論 cinder-volume 的操作。

向 cinder-api 發送請求

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

GUI 上操作的菜單爲 Project -> Compute -> Volumes -> Create Volume

設置 volume 的名稱,volume type,大小,Availability Zone 等基本信息。

wKiom1iu6hfTmw9FAABCycW0LqM166.jpg

這裏我們沒有設置 Volume Source,這樣會創建一個空白的 volume。

點擊“Create Volume” 按鈕,cinder-api 將接收到創建 volume 的請求。 查看 cinder-api 日誌 /opt/stack/logs/c-api.log。

wKioL1iu6jPQRuvDAABSmNYTDGU460.jpg

日誌顯示 cinder-api 接收到一個 POST 類型的 REST API,經過對 HTTP body 的分析,該請求是:創建一個 1GB 的 volume。

緊接着,cinder-api 啓動了一個 Flow(工作流)volume_create_api。 Flow 的執行狀態依次爲 PENDING, RUNNING 和 SUCCESS。volume_create_api 當前的狀態由 PENDING 變爲 RUNNING。

wKioL1iu6k7ibalhAAAfQdO4AdM613.jpg

volume_create_api 工作流包含若干 Task,每個 Task 完成特定的任務。 這些任務依次爲 ExtractVolumeRequestTask, QuotaReserveTask, EntryCreateTask, QuotaCommitTask, VolumeCastTask。 Task 的執行狀態也會經歷 PENDING, RUNNING 和 SUCCESS 三個階段。

Task 的名稱基本上說明了任務的工作內容,前面幾個 Task 主要是做一些創建 volume 的準備工作,比如:

ExtractVolumeRequestTask 獲取 request 信息

wKioL1iu6mexugEXAACPrpxXjqs496.jpg

QuotaReserveTask 預留配額

wKiom1iu6n6zL9xSAAB5QWbqILA124.jpg

EntryCreateTask 在數據庫中創建 volume 條目

wKiom1iu7D7SGv8IAACZ_XoMXaM845.jpg

QuotaCommitTask 確認配額

wKioL1iu6sLBvy7QAACQKsiZSLg336.jpg

最後 VolumeCastTask 是向 cinder-sheduler 發送消息,開始調度工作

wKioL1iu7FKBqDsOAABHWSuDG2U682.jpg

至此,Flow volume_create_api 已經完成,狀態由 RUNNING 變爲 SUCCESS,volume 創建成功。日誌如下:

需要特別注意的是,“volume 創建成功”只是指 cinder-api 已經成功處理了 volume create 請求,將消息發給了 cinder-scheduler,但並不意味 volume 在存儲節點上已經成功創建,這一點是容易引起誤解的。我們可以通過 cinder-volume 創建 volume 日誌的時間戳驗證。

cinder-api 發送消息

cinder-api 向 RabbitMQ 發送了一條消息:“讓cinder-scheduler 創建一個 volume” 前面我們提到消息是由 VolumeCastTask 發出的,因爲 VolumeCastTask 沒有打印相關日誌,我們只能通過源代碼查看 /opt/stack/cinder/cinder/volume/flows/api/create_volume.py ,方法爲 create_volume。

wKioL1iu7GiTT3a2AAApDtjh-J4683.jpg


下一節我們討論 Create Volume 的第二部分: cinder-scheduler 的處理過程。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章