Costo di spostamento dei servizi

Un fattore preso in considerazione da Cluster Resource Manager di Service Fabric nel tentativo di determinare le modifiche da apportare a un cluster è il costo di tali modifiche. Il concetto di "costo" viene compensato sulla base di quanto il cluster può essere migliorato. Il factoring del costo avviene durante lo spostamento di servizi di bilanciamento del carico, la deframmentazione e altri requisiti. L'obiettivo è soddisfare i requisiti nel modo meno problematico o costoso.

Lo spostamento dei servizi comporta costi, come minimo in termini di tempo della CPU e ampiezza di banda della rete. Per i servizi con stato, è necessario copiare lo stato di tali servizi, consumando disco e memoria aggiuntivi. La riduzione del costo delle soluzioni offerta da Cluster Resource Manager di Azure Service Fabric contribuisce a garantire che le risorse del cluster non vengono usate inutilmente. Ma non bisogna neppure ignorare le soluzioni in grado di migliorare significativamente l'allocazione delle risorse del cluster.

Cluster Resource Manager prevede due modalità di calcolo dei costi e del relativo contenimento quando tenta di gestire il cluster. Il primo meccanismo è semplicemente il conteggio ogni spostamento che verrebbe eseguito. Se due soluzioni vengono generate in modo bilanciato, ovvero con un punteggio analogo, Cluster Resource Manager sceglie quella con il costo minore (numero totale degli spostamenti).

Questa strategia funziona bene. Ma come con i carichi predefiniti o statici, è improbabile che in qualsiasi sistema complesso tutti gli spostamenti siano uguali. Alcuni possono risultare molto più costosi.

Impostazione dei costi di spostamento

È possibile specificare il costo predefinito degli spostamenti di un servizio al momento della creazione:

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

È anche possibile specificare o aggiornare in modo dinamico MoveCost per un servizio dopo averlo creato:

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

Specificare in modo dinamico il costo di spostamento su base di replica

I precedenti frammenti di codice sono tutti per la specifica di MoveCost contemporaneamente per un intero servizio all'esterno del servizio stesso. Tuttavia, il costo di spostamento è più utile quando il costo di spostamento di un oggetto servizio specifico cambia nel corso della sua durata. Poiché i servizi stessi sono a conoscenza del costo del loro spostamento in un determinato momento, è disponibile un'API per i servizi che notifica i singoli costi di spostamento in fase di runtime.

C#:

this.Partition.ReportMoveCost(MoveCost.Medium);

Nota

È possibile impostare solo il costo di spostamento per le repliche secondarie tramite il codice.

Creazione di report sui costi di spostamento per una partizione

La sezione precedente descrive in che modo le repliche o le istanze del servizio segnalano moveCost. È stata fornita l'API di Service Fabric per segnalare i valori MoveCost per conto di altre partizioni. A volte la replica del servizio o l'istanza non possono determinare il valore MoveCost migliore da solo e deve basarsi su altre logica di servizi. Reporting MoveCost per conto di altre partizioni, insieme al carico di creazione di report per conto di altre partizioni, consente di gestire completamente le partizioni dall'esterno. Queste API eliminano le esigenze per il modello Sidecar, dal punto di vista del Resource Manager cluster.

È possibile segnalare gli aggiornamenti di MoveCost per una partizione diversa con la stessa chiamata API. È necessario specificare l'oggetto PartitionMoveCostDescription per ogni partizione da aggiornare con nuovi valori di MoveCost. L'API consente più modi per aggiornare MoveCost:

  • Una partizione del servizio con stato può aggiornare la replica primaria MoveCost.
  • Entrambi i servizi senza stato possono aggiornare MoveCost di tutte le repliche o le istanze secondarie.
  • Entrambi i servizi senza stato possono aggiornare MoveCost di una replica o un'istanza specifica in un nodo.

Ogni aggiornamento MoveCost per la partizione deve contenere almeno un valore valido che verrà modificato. Ad esempio, è possibile ignorare l'aggiornamento della replica primaria con l'assegnazione di null alla voce di replica primaria, altre voci verranno usate durante l'aggiornamento moveCost e si ignora l'aggiornamento MoveCost per la replica primaria. Poiché l'aggiornamento di MoveCost per più partizioni con una singola chiamata API è possibile, l'API fornisce un elenco di codici restituiti per la partizione corrispondente. Se si accetta e si elabora una richiesta per l'aggiornamento MoveCost, il codice restituito sarà Riuscito. In caso contrario, l'API fornisce codice di errore:

  • PartitionNotFound: l'ID di partizione specificato non esiste.
  • Riconfigurazione In sospeso: la partizione è attualmente riconfigurazione.
  • InvalidForStatelessServices: è stato effettuato un tentativo di modificare moveCost di una replica primaria per una partizione appartenente a un servizio senza stato.
  • ReplicaDoesNotExist : replica secondaria o istanza non esiste in un nodo specificato.
  • InvalidOperation: aggiornamento di MoveCost per una partizione appartenente all'applicazione Di sistema.

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

Con questo esempio si eseguirà un aggiornamento dell'ultimo costo di spostamento segnalato per una partizione 53df3d7f-5471-403b-b736-bde6ad584f42. I costi di spostamento della replica primaria saranno MoltoHigh. Tutti i costi di spostamento delle repliche secondarie saranno Zero, ad eccezione dei costi di spostamento per una replica secondaria specifica situata nel nodo NodeName0. Il costo di spostamento per una replica specifica sarà Medium. Se si vuole ignorare il costo di spostamento dell'aggiornamento per la replica primaria o tutte le repliche secondarie, è possibile lasciare la voce corrispondente come Null.

Impatto del costo di spostamento

MoveCost ha cinque livelli: Zero, Low, Medium, High e VeryHigh. Sono applicabili le regole seguenti:

  • MoveCosts è relativo l'uno all'altro, ad eccezione di Zero e VeryHigh.
  • Se un costo di spostamento è di livello Zero, significa che lo spostamento è gratuito e non deve influire sul punteggio della soluzione.
  • L'impostazione del costo di spostamento su High o VeryHigh non garantisce che la replica non venga mai spostata.
  • Le repliche con costi di spostamento MoltoHigh verranno spostate solo se nel cluster è presente una violazione del vincolo che non può essere risolta in alcun altro modo (anche se richiede lo spostamento di molte altre repliche per correggere la violazione)

Costo di spostamento come fattore da considerare per la selezione delle repliche da spostare

MoveCost consente di trovare le soluzioni che causano un'interruzione complessivamente minima e che sono più facili da realizzare garantendo allo stesso tempo un bilanciamento equivalente. Il concetto di costo di un servizio può essere correlato a molti aspetti. I fattori più comuni per il calcolo del costo di spostamento sono:

  • La quantità di stato o dati che il servizio deve spostare.
  • Il costo di disconnessione dei client. Lo spostamento di una replica primaria è solitamente più costoso dello spostamento di una replica secondaria.
  • Il costo di interruzione di un'operazione in corso. Alcune operazioni a livello di archivio dati o operazioni eseguite in risposta a una chiamata del client sono costose. Dopo un certo punto è preferibile non arrestarle se non è indispensabile. Durante l'esecuzione dell'operazione, aumentare il costo di spostamento di questo oggetto del servizio per ridurre la probabilità che si sposti. Al termine dell'operazione, reimpostare il costo sul valore normale.

Importante

L'uso del costo di spostamento VeryHigh deve essere considerato attentamente perché limita significativamente la capacità di Resource Manager cluster di trovare una soluzione di posizionamento ottimale a livello globale nel cluster. Le repliche con costi di spostamento MoltoHigh verranno spostate solo se nel cluster è presente una violazione del vincolo che non può essere risolta in alcun altro modo (anche se richiede lo spostamento di molte altre repliche per correggere la violazione)

Abilitazione del costo di spostamento del cluster

Per considerare il MoveCosts più granulare, è necessario abilitare MoveCost nel cluster. Senza questa impostazione, viene usata la modalità predefinita per conteggio degli spostamenti per calcolare MoveCost e i report di MoveCost vengono ignorati.

ClusterManifest.xml:

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

mediante ClusterConfig.json per le distribuzioni autonome o Template.json per i cluster ospitati in Azure:

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

Passaggi successivi