上一節咱們詳細討論了 cinder-api 和 cinder-volume,今天討論另外一個重要的 Cinder 組件 cinder-scheduler。api
建立 Volume 時,cinder-scheduler 會基於容量、Volume Type 等條件選擇出最合適的存儲節點,而後讓其建立 Volume。ide
下面介紹 cinder-scheduler 是如何實現這個調度工做的。學習
在 /etc/cinder/cinder.conf 中,cinder 經過 scheduler_driver, scheduler_default_filters 和 scheduler_default_weighers 這三個參數來配置 cinder-scheduler。spa
Filter scheduler 是 cinder-scheduler 默認的調度器。ci
scheduler_driver=cinder.scheduler.filter_scheduler.FilterScheduler文檔
與 Nova 同樣,Cinder 也容許使用第三方 scheduler,配置 scheduler_driver 便可。it
scheduler 調度過程以下:io
經過過濾器(filter)選擇知足條件的存儲節點(運行 cinder-volume)配置
經過權重計算(weighting)選擇最優(權重值最大)的存儲節點。im
可見,cinder-scheduler 的運行機制與 nova-scheduler 徹底同樣。
當 Filter scheduler 須要執行調度操做時,會讓 filter 對計算節點進行判斷,filter 返回 True 或者 False。
cinder.conf 中 scheduler_default_filters 選項指定 filter scheduler 使用的 filter,默認值以下:
scheduler_default_filters = AvailabilityZoneFilter, CapacityFilter, CapabilitiesFilter
Filter scheduler 將按照列表中的順序依次過濾:
爲提升容災性和提供隔離服務,能夠將存儲節點和計算節點劃分到不一樣的 Availability Zone 中。例如把一個機架上的機器劃分在一個 Availability Zone 中。OpenStack 默認有一個命名爲「Nova」 Availability Zone 的,全部的節點初始都是放在「Nova」中。用戶能夠根據須要建立本身的 Availability Zone。
建立 Volume 時,須要指定 Volume 所屬的 Availability Zone。
cinder-scheduler 在作 filtering 時,會使用 AvailabilityZoneFilter 將不屬於指定 Availability Zone 的存儲節點過濾掉。
建立 Volume 時,用戶會指定 Volume 的大小。CapacityFilter 的做用是將存儲空間不能知足 Volume 建立需求的存儲節點過濾掉。
不一樣的 Volume Provider 有本身的特性(Capabilities),好比是否支持 thin provision 等。Cinder 容許用戶建立 Volume 時經過 Volume Type 指定須要的 Capabilities。
Volume Type 能夠根據須要定義若干 Capabilities,詳細描述 Volume 的屬性。VolumeVolume Type 的做用與 Nova 的 flavor 相似。
Volume Type 在 Admin -> System -> Volume 菜單裏管理
經過 Volume Type 的 Extra Specs 定義 Capabilities
Extra Specs 是用 Key-Value 的形式定義。 不一樣的 Volume Provider 支持的 Extra Specs 不一樣,須要參考 Volume Provider 的文檔。
上圖所示的 Volume Type 只有一個 Extra Specs 「volume_backend_name」,這是最重要也是必須的 Extra Specs。
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。
若是在第一步 filtering 環節選出了多個存儲節點,那麼接下來的 weighting 環節會挑選出最合適的一個節點。
Filter Scheduler 經過 scheduler_default_weighers 指定計算權重的 weigher,默認爲 CapacityWeigher。
scheduler_default_weighers = CapacityWeigher
如命名所示,CapacityWeigher 基於存儲節點的空閒容量計算權重值,空閒容量最大的勝出。
下一節咱們將開始經過各類場景學習 Cinder。