cinder create volume的流程-scheduler調度


創建 Volume 時,cinder-scheduler 會基於容量、Volume Type 等條件選擇出最合適的存儲節點,然后讓其創建 Volume。

1、cinder-scheduler配置相關項

在/etc/cinder/cinder.conf文件中,cinder 通過 scheduler_driver, scheduler_default_filters 和scheduler_default_weighers ,這三個參數來配置 cinder-scheduler。

# Options defined in cinder.scheduler.driver
選項在cinder.scheduler.driver.py文件中定義

# The scheduler host manager class to use (string value)
#scheduler_host_manager=cinder.scheduler.host_manager.HostManager
# Maximum number of attempts to schedule an volume (integer
# value)
#scheduler_max_attempts=3

# Options defined in cinder.scheduler.host_manager
選項在cinder.scheduler.host_manager.py文件中定義
# Which filter class names to use for filtering hosts when not specified in the request. (list value)
在請求中沒有指定過濾類時,使用的過濾方法
#scheduler_default_filters=AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter

權重主機時,使用的權重類
# Which weigher class names to use for weighing hosts. (list
# value)
#scheduler_default_weighers=CapacityWeigher


# Options defined in cinder.scheduler.manager
選項在cinder.scheduler.manager.py文件中定義
默認的調度驅動程序
# Default scheduler driver to use (string value)
#scheduler_driver=cinder.scheduler.filter_scheduler.FilterScheduler

2、scheduler調度程序

FilterScheduler是 cinder-scheduler 默認的調度器。與 Nova 一樣,Cinder 也允許使用第三方 scheduler,配置 scheduler_driver 即可。

scheduler 調度過程如下:

1)通過過濾器(filter)選擇滿足條件的存儲節點(運行 cinder-volume的節點)

2)通過權重計算(weighting)選擇最優(權重值最大)的存儲節點

 

3、fiter過濾器

當 FilterScheduler執行調度操作時,會讓 filter 對存儲節點進行判斷,filter 返回 True 或者 False。fiter可以同時指定多個。cinder.conf 中 scheduler_default_filters 選項指定 filter scheduler 使用的 filter,默認值為:scheduler_default_filters = AvailabilityZoneFilter, CapacityFilter, CapabilitiesFilter

FilterScheduler 將按照上面的順序依次過濾:

1)AvailabilityZoneFilter

為提高容災性和提供隔離服務,可以將存儲節點和計算節點划分到不同的 Availability Zone 中。例如把一個機架上的機器划分在一個 Availability Zone 中。OpenStack 默認有一個命名為“Nova”的 Availability Zone,所有的節點初始都是放在“Nova”中。用戶可以根據需要創建自己的 Availability Zone。

創建 Volume 時,指定 Volume 所屬的 Availability Zone。cinder-scheduler 在做 filtering 時,會使用 AvailabilityZoneFilter 將不屬於指定 Availability Zone 的存儲節點過濾掉。

創建volume指定az參數的命令行

#cinder help create
Creates a volume.
Positional arguments:
  <size>                Volume size, in GBs.
Optional arguments:
  --snapshot-id <snapshot-id>
                        Creates volume from snapshot ID. Default=None.
  --source-volid <source-volid>
                        Creates volume from volume ID. Default=None.
  --image-id <image-id>
                        Creates volume from image ID. Default=None.
  --display-name <display-name>
                        Volume name. Default=None.
  --display-description <display-description>
                        Volume description. Default=None.
  --volume-type <volume-type>
                        Volume type. Default=None.
  --availability-zone <availability-zone>
                        Availability zone for volume. Default=None.
  --metadata [<key=value> [<key=value> ...]]
                        Metadata key and value pairs. Default=None.

2)CapacityFilter

創建 Volume 時,用戶會指定 Volume 的大小。CapacityFilter 的作用是將存儲空間不能滿足 Volume 創建需求的存儲節點過濾掉。

3)CapabilitiesFilter

不同的 Volume 提供者 有自己的特性(Capabilities),比如是否支持 thin provision 等。Cinder 允許用戶創建 Volume 時通過 Volume Type 指定需要的 Capabilities。

# cinder help create
Creates a volume.
Positional arguments:
  <size>                Volume size, in GBs.

Optional arguments:
  --snapshot-id <snapshot-id>
                        Creates volume from snapshot ID. Default=None.
  --source-volid <source-volid>
                        Creates volume from volume ID. Default=None.
  --image-id <image-id>
                        Creates volume from image ID. Default=None.
  --display-name <display-name>
                        Volume name. Default=None.
  --display-description <display-description>
                        Volume description. Default=None.
  --volume-type <volume-type>
                        Volume type. Default=None.
  --availability-zone <availability-zone>
                        Availability zone for volume. Default=None.
  --metadata [<key=value> [<key=value> ...]]
                        Metadata key and value pairs. Default=None.

Volume Type 可以根據需要定義若干 Capabilities,詳細描述 Volume 的屬性。Volume Type 的作用與 Nova 的 flavor 類似。

首先創建volume type,命令行如下:

# cinder help type-create
usage: cinder type-create <name>
Creates a volume type.
Positional arguments:
  <name>  Name for the volume type.

然后通過 Volume Type 的 Extra Specs 定義 Capabilities。Extra Specs 是用 Key-Value 的形式定義。 不同的 Volume Provider 支持的 Extra Specs 不同。Extra Specs最重要也是必須的 是volume_backend_name。cinder-volume 服務會在自己的配置文件 /etc/cinder/cinder.conf 中設置“volume_backend_name”這個參數,其作用是為存儲節點的 Volume Provider 命名。這樣,CapabilitiesFilter 就可以通過 Volume Type 的“volume_backend_name”參數篩選出指定的 Volume Provider。不同的存儲節點可以在各自的 cinder.conf 中配置相同的 volume_backend_name,這是允許的。因為雖然存儲節點不同,但它們可能使用的是一種 Volume Provider。

對應命令行如下:

# cinder help type-key
usage: cinder type-key <vtype> <action> [<key=value> [<key=value> ...]]
Sets or unsets extra_spec for a volume type.
Positional arguments:
  <vtype>      Name or ID of volume type.
  <action>     The action. Valid values are 'set' or 'unset.'
  <key=value>  The extra specs key and value pair to set or unset. For unset,
               specify only the key. Default=None.

4、Weighter 權重

如果在第一步 filter選出了多個存儲節點,那么在 weighting 環節會挑選出最合適的一個節點。Filter Scheduler 通過 scheduler_default_weighers 指定計算權重的 weigher,默認為 CapacityWeigher。

總結就是,先定義調度程序,調度程序,又需要做兩件事,先做過濾,最后做權重。

參考文章:https://mp.weixin.qq.com/s/0fQROpXiQ2d8_c_VeWPHeQ

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM