服務移動成本

「Service Fabric 叢集資源管理員」在嘗試判斷要對叢集進行哪些變更時會考量一個因素,就是這些變更的成本。 「成本」的概念是針對叢集可以改善多少來做取捨。 成本在移動服務進行平衡、重組和其他需求時納入考量因素。 目標是以最沒有干擾、最便宜的方式符合需求。

移動服務會花費最少的 CPU 時間和網路頻寬。 對於具狀態服務,需要複製這些服務的狀態、耗用額外記憶體和磁碟。 將 Azure Service Fabric 叢集資源管理員帶來的解決方案成本降至最低,有助於確保不會花費不必要的叢集資源。 然而,也不想忽略可大幅改善叢集中資源配置的解決方案。

「叢集資源管理員」有兩種計算及限制成本的方式,在它嘗試管理叢集時亦是如此。 第一種機制只會計算進行的每次移動。 如果產生兩個平衡值 (分數) 幾乎相同的解決方案,「叢集資源管理員」就會採用成本最低 (移動總數) 的那一個。

此策略效果不錯。 但是若使用預設或靜態負載時,不太可能在任何複雜的系統中所有的移動都相等。 有些可能會昂貴許多。

設定移動成本

您可以在服務建立時指定其預設移動成本:

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -DefaultMoveCost Medium

C#:

FabricClient fabricClient = new FabricClient();
StatefulServiceDescription serviceDescription = new StatefulServiceDescription();
//set up the rest of the ServiceDescription
serviceDescription.DefaultMoveCost = MoveCost.Medium;
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

您也可以在服務建立之後,指定其移動成本或動態更新 MoveCost:

PowerShell:

Update-ServiceFabricService -Stateful -ServiceName "fabric:/AppName/ServiceName" -DefaultMoveCost High

C#:

StatefulServiceUpdateDescription updateDescription = new StatefulServiceUpdateDescription();
updateDescription.DefaultMoveCost = MoveCost.High;
await fabricClient.ServiceManager.UpdateServiceAsync(new Uri("fabric:/AppName/ServiceName"), updateDescription);

以動態方式指定每個複本的移動成本

上述程式碼片段可以從服務本身外部一次指定整個服務的 MoveCost。 不過,當特定服務物件的移動成本隨著其生命週期改變時,移動成本最有用。 因為服務本身可能有在指定時間移動需要多少成本的最佳想法,所以有一個適用於服務的 API 可以報告執行階段期間的個別移動成本。

C#:

this.Partition.ReportMoveCost(MoveCost.Medium);

注意

您只能透過程式碼來設定次要複本的移動成本。

報告分割區的移動成本

上一節說明服務複本或執行個體如何自行報告 MoveCost。 我們已提供 Service Fabric API,以代表其他分割區報告 MoveCost 值。 有時候服務複本或執行個體本身無法決定最佳 MoveCost 值,且必須依賴其他服務邏輯。 代表其他分割區報告 MoveCost,以及代表其他分割區報告負載,可讓您完全管理外部的分割區。 這些 API 會從叢集資源管理員的觀點,消除側車模式的需求。

您可以使用相同 API 呼叫,報告其他分割區的 MoveCost 更新。 您必須針對想要以新 MoveCost 值更新的每個分割區,指定 PartitionMoveCostDescription 物件。 API 允許以多種方式更新 MoveCost:

  • 具狀態服務分割區可以更新其主要複本 MoveCost。
  • 無狀態和具狀態服務都可以更新其所有次要複本或執行個體的 MoveCost。
  • 無狀態和具狀態服務都可以更新節點上特定複本或執行個體的 MoveCost。

分割區的每次 MoveCost 更新都應包含至少一個將變更的有效值。 例如,您可以將 null 指派給主要複本項目,略過主要複本更新,在 MoveCost 更新期間使用其他項目,我們就會略過主要複本的 MoveCost 更新。 由於可以使用單一 API 呼叫更新多個分割區的 MoveCost,因此 API 會提供相應分割區的傳回碼清單。 如果我們成功接受並處理 MoveCost 更新要求,傳回碼會是 Success。 否則,API 會提供錯誤碼:

  • PartitionNotFound - 指定的分割區識別碼不存在。
  • ReconfigurationPending - 目前正在重新設定分割區。
  • InvalidForStatelessServices - 已嘗試變更屬於無狀態服務之分割區主要複本的 MoveCost。
  • ReplicaDoesNotExist - 次要複本或執行個體不存在於指定的節點上。
  • InvalidOperation - 更新屬於系統應用程式的分割區 MoveCost。

C#:

Guid partitionId = Guid.Parse("53df3d7f-5471-403b-b736-bde6ad584f42");
string nodeName0 = "NodeName0";

OperationResult<UpdatePartitionMoveCostResultList> updatePartitionMoveCostResults =
    await this.FabricClient.UpdatePartitionMoveCostAsync(
        new UpdatePartitionMoveCostQueryDescription
        {
            new List<PartitionMoveCostDescription>()
            {
                new PartitionMoveCostDescription(
                    partitionId,
                    MoveCost.VeryHigh,
                    MoveCost.Zero,
                    new List<ReplicaMoveCostDescription>()
                    {
                        new ReplicaMoveCostDescription(nodeName0, MoveCost.Medium)
                    })
            }
        },
        this.Timeout,
        cancellationToken);

在此範例中,您會更新分割區 53df3d7f-5471-403b-b736-bde6ad584f42 上次報告的移動成本。 主要複本移動成本會是 VeryHigh。 所有次要複本移動成本都會是 Zero,除了節點 NodeName0 的特定次要複本移動成本。 特定複本的移動成本會是 Medium。 如果您想要略過更新主要複本或所有次要複本的移動成本,可以將相應項目保留為 null

移動成本的影響

移動成本有五個層級:零、低、中、高和非常高。 適用的規則如下:

  • 除了零和非常高之外,移動成本彼此具有相對性。
  • 零移動成本表示移動是免費的,因此不應計入解決方案的分數。
  • 將移動成本設定為高或非常高並保證複本永遠不會移動。
  • 只有當叢集中的強制違規無法以任何其他方式修正時,才會移動具有非常高移動成本的複本 (即使需要移動許多其他複本才能修正違規也一樣)

Move cost as a factor in selecting replicas for movement

MoveCost 可協助您在達成對等的平衡時,尋找整體導致最少中斷且最容易達成的解決方案。 服務的成本概念可相對於許多事項。 計算您的移動成本時最常見的因素為:

  • 服務必須移動的狀態或資料量。
  • 用戶端中斷連線的成本。 移動主要複本的成本通常高於移動次要複本的成本。
  • 中斷執行中作業的成本。 某些資料存放區層級的作業,或是執行以回應用戶端呼叫的作業,它們的成本都很高。 在某個特定點之後,除非必要否則您不會想要停止它們。 因此,在作業持續期間,您可以提高此服務物件的移動成本以降低其移動的可能性。 當作業完成之後,您可以將成本設定回正常。

重要

請謹慎考慮是否要使用非常高移動成本,因為其會大幅限制叢集資源管理員在叢集中尋找全球最佳放置位置解決方案的能力。 只有當叢集中的強制違規無法以任何其他方式修正時,才會移動具有非常高移動成本的複本 (即使需要移動許多其他複本才能修正違規也一樣)

在您的叢集中啟用移動成本

為了將更細微的 MoveCosts 納入考量,必須在叢集中啟用 MoveCost。 如果沒有此設定,則會使用計算移動的預設模式來計算 MoveCost,並且忽略 MoveCost 報告。

ClusterManifest.xml:

        <Section Name="PlacementAndLoadBalancing">
            <Parameter Name="UseMoveCostReports" Value="true" />
        </Section>

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

"fabricSettings": [
  {
    "name": "PlacementAndLoadBalancing",
    "parameters": [
      {
          "name": "UseMoveCostReports",
          "value": "true"
      }
    ]
  }
]

下一步