建立 Volume 時,cinder-scheduler 會基於容量、Volume Type 等條件選擇出最合適的存儲節點,而後讓其建立 Volume。ide
一、cinder-scheduler配置相關項spa
在/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
二、scheduler調度程序code
FilterScheduler是 cinder-scheduler 默認的調度器。與 Nova 同樣,Cinder 也容許使用第三方 scheduler,配置 scheduler_driver 便可。blog
scheduler 調度過程以下:ip
1)經過過濾器(filter)選擇知足條件的存儲節點(運行 cinder-volume的節點)ci
2)經過權重計算(weighting)選擇最優(權重值最大)的存儲節點string
三、fiter過濾器it
當 FilterScheduler執行調度操做時,會讓 filter 對存儲節點進行判斷,filter 返回 True 或者 False。fiter能夠同時指定多個。cinder.conf 中 scheduler_default_filters 選項指定 filter scheduler 使用的 filter,默認值爲:scheduler_default_filters = AvailabilityZoneFilter, CapacityFilter, CapabilitiesFilterio
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.
四、Weighter 權重
若是在第一步 filter選出了多個存儲節點,那麼在 weighting 環節會挑選出最合適的一個節點。Filter Scheduler 經過 scheduler_default_weighers 指定計算權重的 weigher,默認爲 CapacityWeigher。
總結就是,先定義調度程序,調度程序,又須要作兩件事,先作過濾,最後作權重。
參考文章:https://mp.weixin.qq.com/s/0fQROpXiQ2d8_c_VeWPHeQ