nova-scheduler是Nova中實現任務分派的模塊,決定如何派遣compute和volume的請求。Scheduler映射nova-api調用到合適的OpenStack Component,根據指定的算法從可用資源中獲取Compute服務器。以下因素決定調度器的具體算法:負載、內存、可用zone的物理距離、CPU體系結構等。目前nova-schedule的可用調度算法如下。
·Chance:在可用zone中隨機選擇計算主機。
·AZ:與Chance相似,在執行的AZ中隨機選擇計算主機。
·Simple:選擇負載最輕的主機來運行實例,可從負載均衡器中獲取負載信息。
·濾波器調度器:濾波器調度器利用濾波和權重兩個概念來決定應該在何處創建新的實例。該調度算法只支持對計算節點的調度,具體調度原理如圖2-8所示。
Nova的濾波策略是非常靈活的,目前支持多種濾波調度策略。用戶也可實現自己的濾波算法。當前版本內置的濾波器如下。
·AllHostsFilter:實質上沒有任何操作,返回的是所有可用主機。
·AvailabilityZoneFilter:通過AZ過濾主機,返回與請求實例具有相同AZ的主機。
·ComputeFilter:返回由滿足附加規格的Compute Service提供的能力、與實例類型相關的能力。返回一個列表指明主機上可創建的實例類型。
·CoreFilter:基於CPU核利用率的濾波器,提供具有足夠的CPU核數量的主機。
·IsolatedHostsFilter:基於image_isolated和host_isolated flags的濾波器。
·Json Filter:選擇主機時考慮是否是基於JSON語法。
·RamFilter:指標是主機的RAM,只返回具有夠用的RAM的主機。
·SimpleCIDRAffinityFilter:放置一個新實例到與其具有相同IP block的主機上。
·DifferentHostFilter:放置一個實例到與某個指定的實例系列不同的主機上。
·SameHostFilter:放置一個實例到與某個指定的實例系列相同的主機上。
圖2-8 濾波器調度器的調度原理
用戶自己創建自己的濾波器,只需集成BaseHostFilter類,並實現該類的一個方法:Host_passes。滿足用戶設置的條件是,該方法返回為true。該方法有兩個參數:host_state、filter_properities。
濾波器調度器在工作過程中會使用所謂的Weight和Cost。Cost是作為請求結果來表達所選擇主機的一個度量。通過將請求中的特性與主機特性進行比較得出不同指標的Cost值,最後放置實例到一個低Cost的主機上。計算Cost的函數從高速緩存中獲取(如果高速緩存中沒有,則從nova.conf中獲取),Weight值也是在nova.conf中獲取的。使用weight計算函數對主機進行稱重,並計算weighted_sum。默認使用的是compute_fill_first_cost_fn函數,返回的是空閒RAM的Weight值。而用戶具體想要使用哪種參數的Weight和Cost決定調度結果是用戶自己實現的。最後將該函數寫入nova.conf文件中的least_cost_functions選項。默認的權重計算函數和權重值設置如下:
--least_cost_functions=nova.scheduler.least_cost.compute_fill_first_cost_fn--compute_fill_first_cost_fn_weight=-1.0