Share via


Kosten voor serviceverplaatsing

Een factor waarmee het Service Fabric-cluster Resource Manager rekening houdt wanneer u probeert te bepalen welke wijzigingen in een cluster moeten worden aangebracht, zijn de kosten van deze wijzigingen. Het begrip 'kosten' wordt afgewisseld tegen de mate waarin het cluster kan worden verbeterd. Kosten worden meegerekend bij het verplaatsen van services voor balancering, defragmentatie en andere vereisten. Het doel is om op de minst verstorende of dure manier aan de vereisten te voldoen.

Het verplaatsen van services kost minimaal CPU-tijd en netwerkbandbreedte. Voor stateful services moet de status van deze services worden gekopieerd, waardoor extra geheugen en schijf worden verbruikt. Het minimaliseren van de kosten van oplossingen die het Azure Service Fabric-cluster Resource Manager maakt, helpt ervoor te zorgen dat de resources van het cluster niet onnodig worden besteed. U wilt echter ook geen oplossingen negeren die de toewijzing van resources in het cluster aanzienlijk zouden verbeteren.

De Cluster Resource Manager heeft twee manieren om de kosten te berekenen en deze te beperken terwijl het cluster wordt beheerd. Het eerste mechanisme is gewoon het tellen van elke beweging die het zou maken. Als er twee oplossingen worden gegenereerd met ongeveer hetzelfde saldo (score), geeft de cluster-Resource Manager de voorkeur aan de oplossing met de laagste kosten (totaal aantal verplaatsingen).

Deze strategie werkt goed. Maar net als bij standaard- of statische belastingen, is het in een complex systeem onwaarschijnlijk dat alle verplaatsingen gelijk zijn. Sommige zijn waarschijnlijk veel duurder.

Verplaatsingskosten instellen

U kunt de standaardkosten voor het verplaatsen van een service opgeven wanneer deze wordt gemaakt:

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);

U kunt MoveCost ook dynamisch opgeven of bijwerken voor een service nadat de service is gemaakt:

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);

Dynamisch opgeven van verplaatsingskosten per replica

De voorgaande codefragmenten zijn allemaal bedoeld voor het opgeven van MoveCost voor een hele service tegelijk van buiten de service zelf. Verplaatsingskosten zijn echter het handigst wanneer de verplaatsingskosten van een specifiek serviceobject veranderen gedurende de levensduur. Omdat de services zelf waarschijnlijk het beste idee hebben van hoe duur ze zijn om een bepaalde tijd te verplaatsen, is er een API voor services om hun eigen afzonderlijke verplaatsingskosten tijdens runtime te rapporteren.

C#:

this.Partition.ReportMoveCost(MoveCost.Medium);

Notitie

U kunt de verplaatsingskosten voor secundaire replica's alleen instellen via code.

Kosten voor het rapporteren van verplaatsingen voor een partitie

In de vorige sectie wordt beschreven hoe servicereplica's of exemplaren MoveCost zelf rapporteren. We hebben Service Fabric-API geleverd voor het rapporteren van MoveCost-waarden namens andere partities. Soms kan de servicereplica of het exemplaar de beste MoveCost-waarde niet zelf bepalen en moet deze afhankelijk zijn van andere serviceslogica. Met MoveCost rapporteren namens andere partities, naast het rapporteren van belasting namens andere partities, kunt u partities van buiten volledig beheren. Deze API's elimineren de noodzaak voor het sidecar-patroon, vanuit het perspectief van de cluster Resource Manager.

U kunt MoveCost-updates voor een andere partitie rapporteren met dezelfde API-aanroep. U moet het PartitionMoveCostDescription-object opgeven voor elke partitie die u wilt bijwerken met nieuwe waarden van MoveCost. Met de API kunt u MoveCost op meerdere manieren bijwerken:

  • Een stateful servicepartitie kan de primaire replica MoveCost bijwerken.
  • Zowel stateless als stateful services kunnen de MoveCost van alle secundaire replica's of exemplaren bijwerken.
  • Zowel stateless als stateful services kunnen de MoveCost van een specifieke replica of instantie op een knooppunt bijwerken.

Elke MoveCost-update voor de partitie moet ten minste één geldige waarde bevatten die wordt gewijzigd. U kunt bijvoorbeeld de primaire replica-update overslaan door null toe te wijzen aan de primaire replica-vermelding, andere vermeldingen worden gebruikt tijdens de MoveCost-update en we slaan de MoveCost-update voor de primaire replica over. Aangezien het bijwerken van MoveCost voor meerdere partities met één API-aanroep mogelijk is, biedt API een lijst met retourcodes voor de bijbehorende partitie. Als we een aanvraag voor de MoveCost-update accepteren en verwerken, is de retourcode Geslaagd. Anders biedt DE API de foutcode:

  • PartitionNotFound - Opgegeven partitie-id bestaat niet.
  • HerconfigurationPending - Partitie wordt momenteel opnieuw geconfigureerd.
  • InvalidForStatelessServices- Er is een poging gedaan om de MoveCost van een primaire replica te wijzigen voor een partitie die deel uitmaakt van een staatloze service.
  • ReplicaDoesNotExist - Secundaire replica of instantie bestaat niet op een opgegeven knooppunt.
  • InvalidOperation: MoveCost bijwerken voor een partitie die deel uitmaakt van de systeemtoepassing.

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);

In dit voorbeeld voert u een update uit van de laatst gerapporteerde verplaatsingskosten voor een partitie 53df3d7f-5471-403b-b736-bde6ad584f42. De kosten voor het verplaatsen van primaire replica's zijn ZeerHigh. De verplaatsingskosten van alle secundaire replica's zijn Nul, met uitzondering van de verplaatsingskosten voor een specifieke secundaire replica die zich op het knooppunt NodeName0 bevindt. De verplaatsingskosten voor een specifieke replica zijn Gemiddeld. Als u het bijwerken van de verplaatsingskosten voor de primaire replica of alle secundaire replica's wilt overslaan, kunt u de bijbehorende vermelding op null laten staan.

Gevolgen van verplaatsingskosten

MoveCost heeft vijf niveaus: Zero, Low, Medium, High en VeryHigh. De volgende regels zijn van toepassing:

  • MoveCosts zijn relatief ten opzichte van elkaar, met uitzondering van Zero en VeryHigh.
  • Nul verplaatsingskosten betekent dat verplaatsing vrij is en niet moet worden meegeteld bij de score van de oplossing.
  • Het instellen van de verplaatsingskosten op Hoog of ZeerHigh biedt geen garantie dat de replica nooit wordt verplaatst.
  • Replica's met zeer hoge verplaatsingskosten worden alleen verplaatst als er een beperkingsschending in het cluster is die niet op een andere manier kan worden opgelost (zelfs als er veel andere replica's moeten worden verplaatst om de schending op te lossen)

Kosten verplaatsen als factor bij het selecteren van replica's voor verplaatsing

MoveCost helpt u bij het vinden van de oplossingen die in het algemeen de minste onderbrekingen veroorzaken en het gemakkelijkst zijn om te bereiken terwijl u nog steeds een equivalent saldo bereikt. De notie van kosten van een service kan relatief zijn ten opzichte van veel dingen. De meest voorkomende factoren bij het berekenen van uw verplaatsingskosten zijn:

  • De hoeveelheid status of gegevens die de service moet verplaatsen.
  • De kosten van het verbreken van de verbinding van clients. Het verplaatsen van een primaire replica is meestal duurder dan de kosten van het verplaatsen van een secundaire replica.
  • De kosten voor het onderbreken van een vluchtbewerking. Sommige bewerkingen op het niveau van het gegevensarchief of bewerkingen die worden uitgevoerd als reactie op een clientaanroep, zijn kostbaar. Na een bepaald punt wil je ze niet stoppen als het niet nodig is. Dus terwijl de bewerking wordt uitgevoerd, verhoogt u de verplaatsingskosten van dit serviceobject om de kans te verkleinen dat het wordt verplaatst. Wanneer de bewerking is voltooid, stelt u de kosten weer in op normaal.

Belangrijk

Het gebruik van de kosten voor zeer hoge verplaatsingen moet zorgvuldig worden overwogen, omdat dit de mogelijkheid van Cluster Resource Manager om een wereldwijd optimale plaatsingsoplossing in het cluster te vinden aanzienlijk beperkt. Replica's met zeer hoge verplaatsingskosten worden alleen verplaatst als er een beperkingsschending in het cluster is die niet op een andere manier kan worden opgelost (zelfs als er veel andere replica's moeten worden verplaatst om de schending op te lossen)

Verplaatsingskosten inschakelen in uw cluster

Als u rekening wilt houden met de meer gedetailleerde MoveCosts, moet MoveCost zijn ingeschakeld in uw cluster. Zonder deze instelling wordt de standaardmodus voor het tellen van verplaatsingen gebruikt voor het berekenen van MoveCost en worden MoveCost-rapporten genegeerd.

ClusterManifest.xml:

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

via ClusterConfig.json voor zelfstandige implementaties of Template.json voor door Azure gehoste clusters:

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

Volgende stappen