5 openstack -- cinder

openstack -- cinder

1、understand block storage

  一、How the operation system get its storage

    # 裸硬盤存儲

      也叫作 block storage算法

      每一個裸硬盤一般也稱做 Volume(卷)數據庫

    # 文件系統存儲

      經過某種協議(SAS,SCSI,SAN,iSCSI 等)掛接裸硬盤,而後分區、格式化、建立文件系統api

      NAS 和 NFS 服務器,以及各類分佈式文件系統提供的都是這種存儲服務器

    # 經過 NFS、CIFS 等 協議,mount 遠程的文件系統

2、understand block storage service

  一、Block Storage Service 提供對 volume 從建立到刪除整個生命週期的管理分佈式

  二、從 instance 的角度看,掛載的每個 Volume 都是一塊硬盤ide

  三、OpenStack 提供 Block Storage Service 的是 Cinder日誌

3、cider framework

  

4、cinder module function

  -- cinder API

    提供 REST API 使用戶可以查詢和管理 volume、volume snapshot 以及 volume typeblog

  -- cinder volume

    管理 volume 的服務,與 volume provider 協調工做,管理 volume 的生命週期生命週期

    運行 cinder-volume 服務的節點被稱做爲存儲節點隊列

  -- cinder scheduler

    scheduler 經過調度算法選擇最合適的存儲節點建立 volume

  -- volume provider

    數據的存儲設備,爲 volume 提供物理存儲空間

    cinder-volume 支持多種 volume provider,每種 volume provider 經過本身的 driver 與 cinder-volume 協調工做

  -- message queue

    Cinder 各個子服務經過消息隊列實現進程間通訊和相互協做

    有了消息隊列,子服務之間實現瞭解耦,這種鬆散的結構也是分佈式系統的重要特徵

  -- Database

    Cinder 有一些數據須要存放到數據庫中,通常使用 MySQL

5、cinder deploy

6、summarize create volume

    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。

    

7、step explain in detail --- CREATE

  1)、cinder IPA 的處理過程

    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

  2)、cinder-scheduler 的處理過程

   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

   3)、cinder 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 結束

相關文章
相關標籤/搜索