Condividi tramite


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 codice.

Creazione di report sui costi di spostamento per una partizione

La sezione precedente descrive il modo in cui le repliche del servizio o le istanze segnalano moveCost. È stata fornita l'API di Service Fabric per la creazione di report sui valori MoveCost per conto di altre partizioni. A volte la replica del servizio o l'istanza non è in grado di determinare il valore MoveCost migliore da solo e deve basarsi su altre logiche dei servizi. La creazione di report moveCost per conto di altre partizioni, insieme alla creazione di report sul carico 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 di Cluster Resource Manager.

È 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 i 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 e con stato possono aggiornare MoveCost di tutte le repliche o istanze secondarie.
  • Entrambi i servizi senza stato e con stato possono aggiornare MoveCost di una replica o di 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 di MoveCost e verrà ignorato 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 correttamente una richiesta di aggiornamento MoveCost, il codice restituito sarà Operazione riuscita. In caso contrario, l'API fornisce il 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: la replica o l'istanza secondaria 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. Il costo dello spostamento della replica primaria sarà VeryHigh. Tutti i costi di spostamento delle repliche secondarie saranno Zero, ad eccezione del costo di spostamento per una replica secondaria specifica che si trova nel nodo NodeName0. Il costo di spostamento per una replica specifica sarà Medio. 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. Si applicano le seguenti regole:

  • 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 VeryHigh verranno spostate solo se è presente una violazione del vincolo nel cluster che non può essere risolta in 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 Cluster Resource Manager di trovare una soluzione di posizionamento ottimale a livello globale nel cluster. Le repliche con costi di spostamento VeryHigh verranno spostate solo se è presente una violazione del vincolo nel cluster che non può essere risolta in 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