共用方式為


子叢集計量的平衡

什麼是子叢集

具有不同放置條件約束的服務有共同的計量,且服務同時報告其負載時,就會發生子叢集。 如果服務報告的負載有很大差異,節點上的總負載將會有較大的標準差,且看起來像似叢集不平衡,即使它可能有最佳平衡。

子叢集如何影響負載平衡

如果不同節點上服務報告的負載有很大的差異,則可能會看起來有很大的不平衡 (但實際上沒有)。 此外,如果子叢集所造成的虛假不平衡大於實際上的不平衡,則可能讓 Resource Manager 平衡演算法混淆,並在叢集中產生次佳的平衡。

例如,假設我們有四個服務,而且它們都報告計量 Metric1 的負載:

  • 服務 A - 具有放置條件約束 "NodeType==Frontend",報告的負載為 10
  • 服務 B - 具有放置條件約束 "NodeType==Frontend",報告的負載為 10
  • 服務 C - 具有放置條件約束 "NodeType==Backend",報告的負載為 100
  • 服務 D - 具有放置條件約束 "NodeType==Backend",報告的負載為 100
  • 而我們有四個節點。 其中兩個將 NodeType 設定為 "Frontend",而其他兩個則為 "Backend"

而我們有下列放置:

Subclustered placement example

叢集看起來可能不平衡,在節點 3 和 4 上有很大的負載,但在此情況下,此放置會產生最佳可能的平衡。

Resource Manager 可以辨識子叢集的情況,而且在幾乎所有情況下,它都可以針對指定的情況產生最佳平衡。

在某些特殊情況下,Resource Manager 無法以最佳方式平衡子叢集計量時,仍會偵測到子叢集,並且會產生健全狀態報告,以建議您修正該問題。

子叢集類型及其處理方式

子叢集情況可以分類為三個不同的類別。 特定子叢集情況的類別會決定 Resource Manager 如何處理它。

第一個類別 - 具有不相鄰節點群組的一般子叢集

此類別具有最簡單的子叢集形式,其中的節點可分成不同的群組,而且每個服務只能放在其中一個群組的節點上。 每個節點會屬於一個群組且僅限一個群組。 上述情況屬於此類別,這是多數子叢集的情況。

針對此類別中的情況,Resource Manager 可以產生最佳平衡,且不需要進一步介入。

第二個類別 - 具有階層式節點群組的子叢集

當對某個服務允許的節點群組是對另一個服務允許的節點群組的子集時,就會發生此情況。 此情況最常見的範例是,某些服務已定義放置條件約束,而另一個服務沒有放置條件約束,因此可以放在任何節點上。

範例:

  • 服務 A:沒有放置條件約束
  • 服務 B:放置條件約束 "NodeType==Frontend"
  • 服務 C:放置條件約束 "NodeType==Backend"

此設定會在不同服務的節點群組之間建立子集-超集關聯性。

Subset superset subclusters

在此情況下,有可能會產生次佳的平衡。

Resource Manager 將會辨識此情況,並產生健全狀態報告,建議您將服務 A 分割成兩個服務,即服務 A1,可放置在 Frontend 節點上,以及服務 A2,可放置在 Backend 節點上。 這會帶我們回到可獲得最佳平衡的第一個類別情況。

第三個類別 - 節點集之間具有部分重疊的子叢集

當可放置某些服務的節點集合之間有部分重疊時,就會發生此情況。

例如,如果我們有一個稱為 NodeColor 的節點屬性,而且有三個節點:

  • 節點 1:NodeColor=Red
  • 節點 2:NodeColor=Blue
  • 節點 3:NodeColor=Green

而我們有兩個服務:

  • 服務 A:具有放置條件約束 "Color==Red || Color==Blue"
  • 服務 B:具有放置條件約束 "Color==Blue || Color==Green"

因此,服務 A 可放置在節點 1 和 2,而服務 B 則可以放置在節點 2 和 3。

在此情況下,有可能會產生次佳的平衡。

Resource Manager 將會辨識此情況並產生健全狀態報告,建議您分割某些服務。

針對此情況,Resource Manager 無法提供如何分割服務的建議,因為多個分割可以完成,而且沒有可評估哪一個方法是分割服務的最佳方式。

設定子叢集

您可以修改下列設定參數,以修改有關子叢集的 Resource Manager 行為:

  • SubclusteringEnabled - 參數會決定在進行負載平衡時,Resource Manager 是否會將子叢集納入考量。 如果關閉此參數,Resource Manager 將會忽略子叢集,並嘗試在全域層級上達到最佳平衡。 此參數的預設值為 false。
  • SubclusteringReportingPolicy - 決定 Resource Manager 將如何發出階層式和部分重疊子叢集的健全狀態報告。 值為零表示子叢集的健全狀態報告已關閉,"1" 表示將會產生次佳子叢集情況的警告健全狀態報告,且值為 "2" 將會產生「正常」健全狀態報告。 此參數的預設值為 "1"。

ClusterManifest.xml:

        <Section Name="PlacementAndLoadBalancing">
            <Parameter Name="SubclusteringEnabled" Value="true" />
            <Parameter Name="SubclusteringReportingPolicy" Value="1" />
        </Section>

獨立部署透過 ClusterConfig.json,Azure 託管叢集透過 Template.json:

"fabricSettings": [
  {
    "name": "PlacementAndLoadBalancing",
    "parameters": [
      {
          "name": "SubclusteringEnabled",
          "value": "true"
      },
      {
          "name": "SubclusteringReportingPolicy",
          "value": "1"
      },
    ]
  }
]

下一步