Delen via


Kosten voor serviceverplaatsing

Een factor die de Resource Manager van het Service Fabric-cluster beschouwt bij het bepalen welke wijzigingen in een cluster moeten worden aangebracht, zijn de kosten van deze wijzigingen. Het begrip 'kosten' wordt afgeschreven van hoeveel het cluster kan worden verbeterd. Kosten worden meegerekend bij het verplaatsen van services voor het verdelen, defragmenteren en andere vereisten. Het doel is om te voldoen aan de vereisten op de minst verstorende of dure manier.

Het verplaatsen van services kost minimaal CPU-tijd en netwerkbandbreedte. Voor stateful services moet de status van deze services worden gekopieerd en extra geheugen en schijf worden verbruikt. Het minimaliseren van de kosten van oplossingen waarmee Resource Manager van het Azure Service Fabric-cluster wordt geleverd, zorgt ervoor 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.

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

Deze strategie werkt goed. Maar net als bij standaardbelastingen of statische belastingen is het onwaarschijnlijk dat alle verplaatsingen gelijk zijn aan elk complex systeem. Sommige zijn waarschijnlijk veel duurder.

Kosten verplaatsen instellen

U kunt de standaardkosten voor verplaatsingen voor 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 verplaatsingskosten per replica opgeven

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 gedurende de levensduur veranderen. Omdat de services zelf waarschijnlijk het beste idee hebben hoe kostbaar 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 alleen de verplaatsingskosten voor secundaire replica's instellen via code.

Kosten voor verplaatsing rapporteren 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. Als u MoveCost rapporteert namens andere partities, naast de rapportagebelasting namens andere partities, kunt u partities van buiten volledig beheren. Deze API's elimineren de behoeften voor het Sidecar-patroon, vanuit het perspectief van clusterbronbeheer.

U kunt MoveCost-updates voor een andere partitie rapporteren met dezelfde API-aanroep. U moet 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 partitie moet ten minste één geldige waarde bevatten die wordt gewijzigd. U kunt bijvoorbeeld de primaire replica-update overslaan met het toewijzen van null aan primaire replicavermelding, andere vermeldingen worden gebruikt tijdens de MoveCost-update en we slaan de MoveCost-update voor primaire replica over. Omdat 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 retourcode geslaagd. Anders biedt DE API foutcode:

  • PartitionNotFound - opgegeven partitie-id bestaat niet.
  • ReconfigurationPending - Partition wordt momenteel opnieuw geconfigureerd.
  • InvalidForStatelessServices: er is geprobeerd de MoveCost van een primaire replica te wijzigen voor een partitie die deel uitmaakt van een stateless 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. Kosten voor het verplaatsen van primaire replica's zijn ZeerHigh. Alle verplaatsingskosten voor secundaire replica's zijn nul, met uitzondering van verplaatsingskosten voor een specifieke secundaire replica die zich op het knooppunt NodeName0 bevindt. De verplaatsingskosten voor een specifieke replica zijn gemiddeld. Als u de verplaatsingskosten voor primaire replica of alle secundaire replica's wilt overslaan, kunt u de bijbehorende vermelding laten staan als null.

Impact van verplaatsingskosten

MoveCost heeft vijf niveaus: Nul, Laag, Gemiddeld, Hoog en ZeerHigh. De volgende regels zijn van toepassing:

  • MoveCosts zijn relatief ten opzichte van elkaar, met uitzondering van Zero en VeryHigh.
  • Nul verplaatsingskosten betekent dat het verkeer vrij is en niet mag tellen tegen de score van de oplossing.
  • Het instellen van uw 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 sprake is van een beperkingsschending in het cluster 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 de minste onderbreking in het algemeen veroorzaken en die het eenvoudigst zijn om te bereiken terwijl u nog steeds een equivalent saldo bereikt. Het begrip 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 voor het verbreken van de verbinding van clients. Het verplaatsen van een primaire replica is meestal duurder dan de kosten voor het verplaatsen van een secundaire replica.
  • De kosten voor het onderbreken van een vluchtbewerking. Sommige bewerkingen op het niveau van het gegevensarchief of de bewerkingen die worden uitgevoerd als reactie op een clientoproep, zijn kostbaar. Na een bepaald punt wilt u ze niet stoppen als u dat niet hoeft te doen. 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 het de mogelijkheid van Cluster Resource Manager aanzienlijk beperkt om een wereldwijd optimale plaatsingsoplossing in het cluster te vinden. Replica's met zeer hoge verplaatsingskosten worden alleen verplaatst als er sprake is van een beperkingsschending in het cluster 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 voor verplaatsen in uw cluster inschakelen

Om ervoor te zorgen dat de meer gedetailleerde MoveCosts in aanmerking worden genomen, 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 MoveCost-rapporten genegeerd.

ClusterManifest.xml:

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

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

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

Volgende stappen