平衡 Service Fabric 叢集
「Service Fabric 叢集資源管理員」支援動態負載變更、因應節點或服務的新增或移除。 它也會自動修正條件約束違規,以及主動重新平衡叢集。 但是這些動作執行的頻率,以及觸發它們的項目是什麼?
叢集資源管理員所執行的工作有三個不同的類別:
- 放置 - 這個階段涉及安置任何遺漏的具狀態複本或無狀態執行個體。 放置包含新服務,也包含處理已失敗的具狀態複本或無狀態執行個體。 刪除和捨棄複本或執行個體都是在這裡處理。
- 條件約束檢查 – 這個階段會檢查並更正系統內不同放置條件約束 (規則) 的違規情形。 規則範例包括像是確保節點不超出容量,以及符合服務的放置條件約束。
- 平衡 - 這個階段會根據為不同計量設定的所需平衡層級,查看是否有必要使用重新平衡。 如果有必要,就會嘗試在叢集中尋找更平衡的安排方式。
設定叢集資源管理員計時器
與平衡相關的第一組控制項是一組計時器。 這些計時器控管叢集資源管理員檢查叢集並且採取矯正措施的頻率。
「叢集資源管理員」可執行的每個不同類型修正,都是由控管其頻率的不同計時器所控制。 當每個計時器啟動時,便會排程工作。 根據預設,Resource Manager 會:
- 每 1/10 秒掃描一次其狀態並套用更新 (例如記錄某個節點已關閉)
- 設定每秒放置檢查旗標
- 設定每秒條件約束檢查旗標
- 每 5 秒設定一次平衡旗標
控管這些計時器的設定範例如下:
ClusterManifest.xml:
<Section Name="PlacementAndLoadBalancing">
<Parameter Name="PLBRefreshGap" Value="0.1" />
<Parameter Name="MinPlacementInterval" Value="1.0" />
<Parameter Name="MinConstraintCheckInterval" Value="1.0" />
<Parameter Name="MinLoadBalancingInterval" Value="5.0" />
</Section>
獨立部署透過 ClusterConfig.json,Azure 託管叢集透過 Template.json:
"fabricSettings": [
{
"name": "PlacementAndLoadBalancing",
"parameters": [
{
"name": "PLBRefreshGap",
"value": "0.10"
},
{
"name": "MinPlacementInterval",
"value": "1.0"
},
{
"name": "MinConstraintCheckInterval",
"value": "1.0"
},
{
"name": "MinLoadBalancingInterval",
"value": "5.0"
}
]
}
]
目前「叢集資源管理員」只會依序一次執行這些動作其中之一。 這就是為什麼我們將這些計時器稱為「最小間隔」,計時器關閉時所採取的動作稱為「設定旗標」。 例如,「叢集資源管理員」在平衡叢集之前,會先處理要建立服務的擱置中要求。 如您所見,「叢集資源管理員」會依據指定的預設時間間隔,掃描它需要經常執行的一切項目。 通常這表示在每個步驟所做的一組變更通常很小。 經常進行少量變更可讓「叢集資源管理員」快速因應叢集中發生的情況。 由於許多相同類型的事件易於同時發生,因此預設計時器提供一些批次處理。
例如,當節點失敗時,他們可以一次對整個容錯網域執行這個動作。 所有失敗會在 PLBRefreshGap 之後的下一個狀態更新期間擷取。 更正會在下列位置、條件約束檢查以及平衡執行期間決定。 「叢集資源管理員」預設不會將叢集中數小時的變更全數掃描過,再嘗試一次處理所有變更。 這麼做會導致變換量激增。
「叢集資源管理員」也需要一些其他資訊,才能判斷叢集是否處於不平衡的狀態。 因此,我們有其他兩個的設定︰「平衡臨界值」和「活動臨界值」。
平衡臨界值
平衡臨界值是觸發重新平衡的主要控制項。 計量的平衡臨界值是一個比率。 如果負載最多之節點的計量負載除以負載最少之節點的負載量超過該計量的平衡臨界值,此叢集就會被視為不平衡。 因此,下一次「叢集資源管理員」進行檢查時,就會觸發平衡作業。 MinLoadBalancingInterval 計時器會定義當需要重新平衡時,「叢集資源管理員」的檢查頻率。 檢查並不意謂著有發生任何事情。
平衡臨界值會根據每個度量定義為叢集定義的一部分。 如需有關計量的詳細資訊,請參閱計量一文。
ClusterManifest.xml
<Section Name="MetricBalancingThresholds">
<Parameter Name="MetricName1" Value="2"/>
<Parameter Name="MetricName2" Value="3.5"/>
</Section>
獨立部署透過 ClusterConfig.json,Azure 託管叢集透過 Template.json:
"fabricSettings": [
{
"name": "MetricBalancingThresholds",
"parameters": [
{
"name": "MetricName1",
"value": "2"
},
{
"name": "MetricName2",
"value": "3.5"
}
]
}
]
在此範例中,每個服務皆取用一單位的某個計量。 在上半部的範例中,節點的負載上限為 5,而下限為 2。 假設此計量的平衡臨界值為 3。 由於叢集中的比率是 5/2 = 2.5,小於指定的平衡臨界值 3,因此叢集處於平衡狀態。 當「叢集資源管理員」進行檢查時,不會觸發任何平衡作業。
在下半部的範例中,節點的負載上限為 10,而下限為 2,所以比率為 5。 5 大於該計量的指定平衡臨界值 3。 因此,下一次引發平衡計時器時,便會排定執行重新平衡。 在類似這樣的情況中,有些負載通常會分散到 Node 3。 由於「Service Fabric 叢集資源管理員」並不使用窮盡方法,因此有些負載也可能分散到 Node 2。
注意
「平衡」會處理兩個不同的策略來管理叢集中的負載。 叢集資源管理員使用的預設策略是在叢集的節點之間分散負載。 其他的策略是重組。 重組是在相同平衡執行期間執行。 平衡和重組策略可以用於相同叢集中不同的計量。 服務可以同時有平衡和重組計量。 對於重組計量,在叢集中的負載比率低於平衡臨界值時,會觸發重新平衡。
使數據低於平衡臨界值並不是一個明確的目標。 平衡臨界值只是觸發程序。 當平衡執行時,叢集資源管理員會判斷可以進行哪些增強功能,如果有的話。 因為平衡搜尋開始並不代表任何項目移動。 有時候叢集過於受到修正的限制而不平衡。 或者,改進需要的移動太昂貴)。
活動臨界值
有時候,雖然節點處於相對的不平衡狀態,但叢集中的負載「總量」 卻很低。 缺乏負載可能是暫時性的下跌情況,或是因為叢集是新的且才剛啟動而已。 不論是上述哪一種情況,您可能都不想花時間平衡叢集,因為能獲得的好處很少。 如果叢集進行平衡作業,您將需要花費網路和計算資源將東西四處移動,但卻不會產生任何大型的「絕對」差異。 為了避免不必要的移動,出現了另一種控制方式,稱為「活動臨界值」。 「活動臨界值」可讓您為活動指定某種絕對下限。 如果沒有任何節點超出此臨界值,則即使達到「平衡臨界值」,也不會觸發平衡作業。
假設我們為這個計量保留平衡臨界值 3。 同時假設我們有活動臨界值 1536。 在第一個案例中,根據「平衡臨界值」,叢集是處於不平衡狀態,但沒有任何節點達到「活動臨界值」,因此不會發生任何事情。 在下半部的範例中,Node 1 超出「活動臨界值」。 由於同時超出該計量的「平衡臨界值」和「活動臨界值」,因此會排定平衡作業。 讓我們看看下圖的範例:
如同平衡臨界值,活動臨界值會透過叢集定義根據每個度量進行定義︰
ClusterManifest.xml
<Section Name="MetricActivityThresholds">
<Parameter Name="Memory" Value="1536"/>
</Section>
獨立部署透過 ClusterConfig.json,Azure 託管叢集透過 Template.json:
"fabricSettings": [
{
"name": "MetricActivityThresholds",
"parameters": [
{
"name": "Memory",
"value": "1536"
}
]
}
]
平衡臨界值和活動臨界值都與特定計量繫結 - 只有同時超出同一計量的「平衡臨界值」和「活動臨界值」時,才會觸發平衡作業。
注意
若未指定,計量的平衡臨界值就是 1,而活動臨界值是 0。 這表示叢集 Resource Manager 會嘗試使該計量對指定負載保持完美的平衡。 若是使用自訂計量,建議您明確地定義自己的計量平衡與活動臨界值。
一起平衡服務
叢集是否不平衡牽涉到整個叢集的決策。 不過,我們會將個別的服務複本和執行個體四處移動來修正此問題。 這很合理,對吧? 如果記憶體堆疊在某一個節點上,可能是由多個複本或執行個體所造成。 若要修正不平衡的狀態,可能需要移動所有使用不平衡計量的具狀態複本或無狀態執行個體。
有時候本身並非不平衡的服務會被移動 (請記住稍早關於邏輯和全域加權的討論)。 為什麼當服務的計量平衡時服務會移動? 看看以下範例:
- 假設有四個服務:Service 1、Service 2、Service 3 及 Service 4。
- Service 1 報告計量:計量 1 和計量 2。
- Service 2 報告計量:計量 2 和計量 3。
- Service 3 報告計量:計量 3 和計量 4。
- Service 4 報告計量:計量 99。
我們並非實際上擁有 4 個獨立的服務,而是有 3 個相關的服務,以及一個獨立的服務。
因為這個鏈結,所以計量 1-4 若發生不平衡,可能會導致屬於服務 1-3 的複本或執行個體四處移動。 我們也知道計量 1、2 或 3 若發生不平衡,並不會導致 Service 4 中發生移動。 這麼做並沒有必要,因為將屬於 Service 4 的複本或執行個體四處移動完全不會影響計量 1-3 的平衡。
叢集資源管理員會自動找出相關的服務。 新增、移除或變更服務的計量,可能會影響它們的關聯性。 例如,在兩次執行平衡作業之間,可能已經更新 Service 2 來移除計量 2。 這會中斷 Service 1 和 Service 2 之間的鏈結。 現在,您擁有的是三個相關服務群組,而非兩個︰
每個節點類型的叢集平衡
如先前各節所述,觸發重新平衡的主要控制項是活動臨界值、平衡臨界值和計時器。 「Service Fabric 叢集資源管理員」可讓您更細微地控制觸發重新平衡,並指定每個節點類型的參數,允許只在不平衡的節點類型上移動。 平衡每個節點類型的主要優點是允許對需要更嚴格平衡規則的節點類型進行效能改善,而不會降低其他節點類型的效能。 此功能包含兩個主要部分:
- 偵測不平衡是對每個節點類型進行。 先前會對每個節點類型計算不平衡的全域計算。 如果所有節點類型都已平衡,CRM 將不會觸發平衡階段。 否則,在至少有一個節點類型不平衡的情況下,便會需要平衡階段。
- 平衡只會在不平衡的節點類型上移動復本,其他節點類型不受平衡階段的影響。
每個節點類型的平衡如何影響叢集
在平衡每個節點類型的叢集期間,「Service Fabric 叢集資源管理員」會計算每個節點類型的不平衡狀態。 在至少有一個節點類型不平衡的情況下,將會觸發平衡階段。 在這些節點類型暫時暫停平衡時 (例如,自先前的平衡階段以來尚未超過最小平衡間隔),平衡階段不會在不平衡的節點類型上移動複本。 偵測不平衡狀態時,會使用已可用於傳統叢集平衡的常用機制,但改善了設定細微度和彈性。 下列清單中提供依節點類型進行平衡以偵測不平衡的機制:
- 每個節點類型的計量平衡臨界值都是與傳統平衡中使用的全域定義平衡臨界值類似的值。 每個節點類型都會計算最小和最大計量負載的比率。 如果節點類型的該比率高於該節點類型定義的平衡臨界值,則會將節點類型標示為不平衡。 如需每個節點類型計量活動臨界值設定的詳細資訊,請參閱每個節點類型的平衡臨界值一節。
- 每個節點類型的計量活動臨界值是與傳統平衡中使用的全域定義活動臨界值類似的值。 每個節點類型都會計算最大計量負載。 如果節點類型的最大負載高於該節點類型的定義活動臨界值,則會將節點類型標示為不平衡。 如需每個節點類型計量活動臨界值設定的詳細資訊,請參閱 activity-thresholds-per-node-type 一節。
- 每個節點類型的最小平衡間隔有類似於全域定義之最小平衡間隔的角色。 「叢集資源管理員」會為每個節點類型保留上次平衡的時間戳記。 在定義的最小平衡間隔內,無法在節點類型上執行兩個連續的平衡階段。 如需每個節點類型最小平衡間隔設定的詳細資訊,請參閱每個節點類型的最小平衡間隔一節。
說明每個節點類型的平衡
若要啟用每個節點類型的平衡,必須在叢集資訊清單中啟用參數 SeparateBalancingStrategyPerNodeType。 此外,也必須啟用子叢集功能。 叢集資訊清單 PlacementAndLoadBalancing 區段的範例,用於啟用功能:
<Section Name="PlacementAndLoadBalancing">
<Parameter Name="SeparateBalancingStrategyPerNodeType" Value="true" />
<Parameter Name="SubclusteringEnabled" Value="true" />
<Parameter Name="SubclusteringReportingPolicy" Value="1" />
</Section>
ClusterConfig.json (獨立部署適用) 或 Template.json (Azure 託管叢集適用):
"fabricSettings": [
{
"name": "PlacementAndLoadBalancing",
"parameters": [
{
"name": "SeparateBalancingStrategyPerNodeType",
"value": "true"
},
{
"name": "SubclusteringEnabled",
"value": "true"
},
{
"name": "SubclusteringReportingPolicy",
"value": "1"
},
]
}
]
如上一節所述,每個節點類型都可以指定臨界值和間隔。 如需更新特定參數的詳細資訊,請參閱下列各節:
每個節點類型的平衡臨界值
計量平衡臨界值可以依每個節點類型定義,以增加平衡設定的細微度。 平衡臨界值有浮點類型,因為這些臨界值代表特定節點類型內最大和最小負載值的比率臨界值。 平衡臨界值定義於每個節點類型的 PlacementAndLoadBalancingOverrides 區段中:
<NodeTypes>
<NodeType Name="NodeType1">
<PlacementAndLoadBalancingOverrides>
<MetricBalancingThresholdsPerNodeType>
<BalancingThreshold Name="Metric1" Value="2.5">
<BalancingThreshold Name="Metric2" Value="4">
<BalancingThreshold Name="Metric3" Value="3.25">
</MetricBalancingThresholdsPerNodeType>
</PlacementAndLoadBalancingOverrides>
</NodeType>
</NodeTypes>
如果沒有為節點類型定義計量的平衡臨界值,臨界值會繼承在 PlacementAndLoadBalancing 區段中全域定義的計量平衡臨界值。 否則,如果沒有為節點類型定義計量的平衡臨界值,也沒有在 PlacementAndLoadBalancing 區段中進行全域定義的話,臨界值會使用一作為預設值。
每個節點類型的活動臨界值
計量活動臨界值可以依每個節點類型定義,以增加平衡設定的細微度。 活動臨界值有整數類型,因為這些臨界值代表特定節點類型內最大負載值的臨界值。 活動臨界值定義於每個節點類型的 PlacementAndLoadBalancingOverrides 區段中:
<NodeTypes>
<NodeType Name="NodeType1">
<PlacementAndLoadBalancingOverrides>
<MetricActivityThresholdsPerNodeType>
<ActivityThreshold Name="Metric1" Value="500">
<ActivityThreshold Name="Metric2" Value="40">
<ActivityThreshold Name="Metric3" Value="1000">
</MetricActivityThresholdsPerNodeType>
</PlacementAndLoadBalancingOverrides>
</NodeType>
</NodeTypes>
如果沒有為節點類型定義計量的活動臨界值,臨界值會繼承在 PlacementAndLoadBalancing 區段中全域定義的計量活動臨界值。 否則,如果沒有為節點類型定義計量的活動臨界值,也沒有在 PlacementAndLoadBalancing 區段中進行全域定義的話,臨界值會使用零作為預設值。
每個節點類型的最小平衡間隔
最小平衡間隔可以依每個節點類型定義,以增加平衡設定的細微度。 最小平衡間隔有整數類型,因為其代表在相同節點類型上進行連續兩回合的平衡作業前,必須通過的最小時間量。 最小平衡間隔定義於每個節點類型的 PlacementAndLoadBalancingOverrides 區段中:
<NodeTypes>
<NodeType Name="NodeType1">
<PlacementAndLoadBalancingOverrides>
<MinLoadBalancingIntervalPerNodeType>100</MinLoadBalancingIntervalPerNodeType>
</PlacementAndLoadBalancingOverrides>
</NodeType>
</NodeTypes>
如果沒有為節點類型定義最小平衡間隔,間隔會繼承在 PlacementAndLoadBalancing 區段中全域定義的最小平衡間隔值。 否則,如果沒有為節點類型定義最小間隔,也沒有在 PlacementAndLoadBalancing 區段中進行全域定義的話,最小間隔會使用零作為預設值,表示連續平衡回合之間不需要暫停。
範例
範例 1
假設叢集包含兩個節點類型:節點類型 A 和節點類型 B。所有服務都會回報相同的計量,且會分割在這些節點類型之間,因此負載統計資料會有所不同。 在此範例中,節點類型 A 的最大負載為 300 且最小負載為 100,而節點類型 B 的最大負載為 700,且最小負載為 500:
客戶偵測到兩個節點類型的工作負載有不同的平衡需求,並決定為每個節點類型設定不同的平衡和活動臨界值。 節點類型 A 的平衡臨界值為 2.5,而活動臨界值為 50。 而節點類型 B,客戶將平衡臨界值設定為 1.2,並將活動臨界值設定為 400。
在此範例中,偵測叢集不平衡時,這兩個節點類型都違反活動臨界值。 節點類型 A 的最大負載為 300,高於定義的活動臨界值 50。 節點類型 B 的最大負載為 700,高於定義的活動臨界值 400。 節點類型 A 違反平衡臨界值準則,因為目前最大和最小負載的比率為 3,而平衡臨界值為 2.5。 相反地,節點類型 B 並未違反平衡臨界值準則,因為此節點類型最大和最小負載的目前比率為 1.2,但平衡臨界值為 1.4。 只有節點類型 A 中的複本需要平衡,而且在平衡階段期間唯一有資格移動的複本集,是放置在節點類型 A 中的複本。
範例 2
假設叢集包含三個節點類型、節點類型 A、B 和 C。所有服務都會回報相同的計量,且會分割在這些節點類型之間,因此負載統計資料會有所不同。 在此範例中,節點類型 A 的最大負載為 600 且最小負載為 100,節點類型 B 的最大負載為 900 且最小負載為 100,而節點類型 C 的最大負載為 600 且最小負載為 300:
客戶偵測到這些節點類型的工作負載有不同的平衡需求,並決定為每個節點類型設定不同的平衡和活動臨界值。 節點類型 A 的平衡臨界值為 5,而活動臨界值為 700。 而節點類型 B,客戶將平衡臨界值設定為 10,並將活動臨界值設定為 200。 而節點類型 C,客戶將平衡臨界值設定為 2,並將活動臨界值設定為 300。
節點類型 A 的最大負載為 600,低於定義的活動臨界值 700,因此節點類型 A 將不會進行平衡。 節點類型 B 的最大負載為 900,高於定義的活動臨界值 200。 節點類型 B 違反活動臨界值準則。 節點類型 C 的最大負載為 600,高於定義的活動臨界值 300。 節點類型 C 違反活動臨界值準則。 節點類型 B 並未違反平衡臨界值準則,因為此節點類型最大和最小負載的目前比率為 9,但平衡臨界值為 10。 節點類型 C 違反平衡臨界值準則,因為目前最大和最小負載的比率為 2,而平衡臨界值為 2。 只有節點類型 C 中的複本需要平衡,而且在平衡階段期間唯一有資格移動的複本集,是放置在節點類型 C 中的複本。