創建 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
