掌握 cinder-scheduler 調度邏輯 - 每天5分鍾玩轉 OpenStack(48)


上一節我們詳細討論了 cinder-api 和 cinder-volume,今天討論另一個重要的 Cinder 組件 cinder-scheduler。

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

下面介紹 cinder-scheduler 是如何實現這個調度工作的。

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

Filter scheduler

Filter scheduler 是 cinder-scheduler 默認的調度器。

scheduler_driver=cinder.scheduler.filter_scheduler.FilterScheduler

與 Nova 一樣,Cinder 也允許使用第三方 scheduler,配置 scheduler_driver 即可。

scheduler 調度過程如下:

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

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

可見,cinder-scheduler 的運行機制與 nova-scheduler 完全一樣。

Filter

當 Filter scheduler 需要執行調度操作時,會讓 filter 對計算節點進行判斷,filter 返回 True 或者 False。

cinder.conf 中 scheduler_default_filters 選項指定 filter scheduler 使用的 filter,默認值如下:

scheduler_default_filters = AvailabilityZoneFilter, CapacityFilter, CapabilitiesFilter

Filter scheduler 將按照列表中的順序依次過濾:

AvailabilityZoneFilter

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

image154.png

創建 Volume 時,需要指定 Volume 所屬的 Availability Zone。

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

CapacityFilter

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

CapabilitiesFilter

不同的 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 環節會挑選出最合適的一個節點。

Weighter

Filter Scheduler 通過 scheduler_default_weighers 指定計算權重的 weigher,默認為 CapacityWeigher。

scheduler_default_weighers = CapacityWeigher

如命名所示,CapacityWeigher 基於存儲節點的空閑容量計算權重值,空閑容量最大的勝出。

下一節我們將開始通過各種場景學習 Cinder。



免責聲明!

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



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