Introduktion till automatisk skalning

Automatisk skalning är en annan funktion i Service Fabric för att dynamiskt skala dina tjänster baserat på belastningen som tjänsterna rapporterar, eller baserat på deras användning av resurser. Automatisk skalning ger stor elasticitet och möjliggör etablering av extra instanser eller partitioner av tjänsten på begäran. Hela processen för automatisk skalning är automatiserad och transparent, och när du har konfigurerat dina principer för en tjänst behöver du inte utföra manuella skalningsåtgärder på tjänstnivå. Automatisk skalning kan aktiveras antingen när tjänsten skapas eller när som helst genom att uppdatera tjänsten.

Ett vanligt scenario där automatisk skalning är användbart är när belastningen på en viss tjänst varierar över tid. Till exempel kan en tjänst som en gateway skalas baserat på mängden resurser som krävs för att hantera inkommande begäranden. Nu ska vi ta en titt på ett exempel på hur skalningsreglerna kan se ut:

  • Om alla instanser av min gateway använder fler än två kärnor i genomsnitt skalar du ut gatewaytjänsten genom att lägga till ytterligare en instans. Gör det här tillägget varje timme, men har aldrig fler än sju instanser totalt.
  • Om alla instanser av min gateway använder mindre än 0,5 kärnor i genomsnitt skalar du in tjänsten genom att ta bort en instans. Gör detta borttagning varje timme, men har aldrig färre än tre instanser totalt.

Automatisk skalning stöds för både containrar och vanliga Service Fabric-tjänster. För att kunna använda automatisk skalning måste du köra version 6.2 eller senare av Service Fabric-körningen.

Resten av den här artikeln beskriver skalningsprinciper, sätt att aktivera eller inaktivera automatisk skalning och ger exempel på hur du använder den här funktionen.

Beskriva automatisk skalning

Principer för automatisk skalning kan definieras för varje tjänst i ett Service Fabric-kluster. Varje skalningsprincip består av två delar:

  • Skalningsutlösaren beskriver när skalning av tjänsten utförs. Villkor som definieras i utlösaren kontrolleras regelbundet för att avgöra om en tjänst ska skalas eller inte.

  • Skalningsmekanismen beskriver hur skalning utförs när den utlöses. Mekanismen tillämpas endast när villkoren från utlösaren uppfylls.

Alla utlösare som för närvarande stöds fungerar antingen med logiska belastningsmått eller med fysiska mått som cpu- eller minnesanvändning. Hur som helst övervakar Service Fabric den rapporterade belastningen för måttet och utvärderar utlösaren regelbundet för att avgöra om skalning behövs.

Det finns två mekanismer som för närvarande stöds för automatisk skalning. Den första är avsedd för tillståndslösa tjänster eller för containrar där automatisk skalning utförs genom att lägga till eller ta bort instanser. För både tillståndskänsliga och tillståndslösa tjänster kan automatisk skalning också utföras genom att lägga till eller ta bort namngivna partitioner i tjänsten.

Kommentar

För närvarande finns det bara stöd för en skalningsprincip per tjänst och endast en skalningsutlösare per skalningsprincip.

Genomsnittlig utlösare för partitionsbelastning med instansbaserad skalning

Den första typen av utlösare baseras på belastningen på instanser i en tillståndslös tjänstpartition. Måttbelastningar jämnas först ut för att hämta belastningen för varje instans av en partition, och sedan beräknas dessa värden i genomsnitt för alla instanser av partitionen. Det finns tre faktorer som avgör när tjänsten skalas:

  • Lägre belastningströskel är ett värde som avgör när tjänsten skalas in. Om den genomsnittliga belastningen för alla instanser av partitionerna är lägre än det här värdet skalas tjänsten in.
  • Övre belastningströskel är ett värde som avgör när tjänsten skalas ut. Om den genomsnittliga belastningen för alla instanser av partitionen är högre än det här värdet skalas tjänsten ut.
  • Skalningsintervall avgör hur ofta utlösaren kontrolleras. När utlösaren har kontrollerats tillämpas mekanismen om skalning behövs. Om skalning inte behövs vidtas ingen åtgärd. I båda fallen kontrolleras inte utlösaren igen innan skalningsintervallet upphör att gälla igen.

Den här utlösaren kan endast användas med tillståndslösa tjänster (antingen tillståndslösa containrar eller Service Fabric-tjänster). Om en tjänst har flera partitioner utvärderas utlösaren separat för varje partition och varje partition har den angivna mekanismen tillämpad på den separat. Därför kan skalningsbeteendena för tjänstpartitioner variera beroende på belastningen. Det är möjligt att vissa partitioner av tjänsten skalas ut, medan vissa andra skalas in. Vissa partitioner kanske inte skalas alls samtidigt.

Den enda mekanism som kan användas med den här utlösaren är PartitionInstanceCountScaleMechanism. Det finns tre faktorer som avgör hur den här mekanismen tillämpas:

  • Skalningssteg avgör hur många instanser som läggs till eller tas bort när mekanismen utlöses.
  • Maximalt antal instanser definierar den övre gränsen för skalning. Om antalet instanser av partitionen når den här gränsen skalas tjänsten ut, oavsett belastning. Det går att utelämna den här gränsen genom att ange värdet -1, och i så fall skalas tjänsten ut så mycket som möjligt (gränsen är antalet noder som är tillgängliga i klustret).
  • Minsta antal instanser definierar den lägre gränsen för skalning. Om antalet instanser av partitionen når den här gränsen skalas inte tjänsten in oavsett belastning.

Ange principen för automatisk skalning för instansbaserad skalning

Använda programmanifest

<LoadMetrics>
<LoadMetric Name="MetricB" Weight="High"/>
</LoadMetrics>
<ServiceScalingPolicies>
<ScalingPolicy>
    <AveragePartitionLoadScalingTrigger MetricName="MetricB" LowerLoadThreshold="1" UpperLoadThreshold="2" ScaleIntervalInSeconds="100"/>
    <InstanceCountScalingMechanism MinInstanceCount="3" MaxInstanceCount="4" ScaleIncrement="1"/>
</ScalingPolicy>
</ServiceScalingPolicies>

Använda C#-API:er

FabricClient fabricClient = new FabricClient();
StatelessServiceDescription serviceDescription = new StatelessServiceDescription();
//set up the rest of the ServiceDescription
AveragePartitionLoadScalingTrigger trigger = new AveragePartitionLoadScalingTrigger();
PartitionInstanceCountScaleMechanism mechanism = new PartitionInstanceCountScaleMechanism();
mechanism.MaxInstanceCount = 3;
mechanism.MinInstanceCount = 1;
mechanism.ScaleIncrement = 1;
trigger.MetricName = "servicefabric:/_CpuCores";
trigger.ScaleInterval = TimeSpan.FromMinutes(20);
trigger.LowerLoadThreshold = 1.0;
trigger.UpperLoadThreshold = 2.0;
ScalingPolicyDescription policy = new ScalingPolicyDescription(mechanism, trigger);
serviceDescription.ScalingPolicies.Add(policy);
//as we are using scaling on a resource this must be exclusive service
//also resource monitor service needs to be enabled
serviceDescription.ServicePackageActivationMode = ServicePackageActivationMode.ExclusiveProcess
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

Använd PowerShell

$mechanism = New-Object -TypeName System.Fabric.Description.PartitionInstanceCountScaleMechanism
$mechanism.MinInstanceCount = 1
$mechanism.MaxInstanceCount = 6
$mechanism.ScaleIncrement = 2
$trigger = New-Object -TypeName System.Fabric.Description.AveragePartitionLoadScalingTrigger
$trigger.MetricName = "servicefabric:/_CpuCores"
$trigger.LowerLoadThreshold = 0.3
$trigger.UpperLoadThreshold = 0.8
$trigger.ScaleInterval = New-TimeSpan -Minutes 10
$scalingpolicy = New-Object -TypeName System.Fabric.Description.ScalingPolicyDescription
$scalingpolicy.ScalingMechanism = $mechanism
$scalingpolicy.ScalingTrigger = $trigger
$scalingpolicies = New-Object 'System.Collections.Generic.List[System.Fabric.Description.ScalingPolicyDescription]'
$scalingpolicies.Add($scalingpolicy)
#as we are using scaling on a resource this must be exclusive service
#also resource monitor service needs to be enabled
Update-ServiceFabricService -Stateless -ServiceName "fabric:/AppName/ServiceName" -ScalingPolicies $scalingpolicies

Genomsnittlig utlösare för tjänstbelastning med partitionsbaserad skalning

Den andra utlösaren baseras på belastningen på alla partitioner i en tjänst. Måttbelastningar jämnas först ut för att hämta belastningen för varje replik eller instans av en partition. För tillståndskänsliga tjänster anses belastningen på partitionen vara belastningen på den primära repliken, medan belastningen på partitionen är den genomsnittliga belastningen för alla instanser av partitionen för tillståndslösa tjänster. Dessa värden är genomsnittliga för alla partitioner av tjänsten och det här värdet används för att utlösa den automatiska skalningen. På samma sätt som i föregående mekanism finns det tre faktorer som avgör när tjänsten skalas:

  • Lägre belastningströskel är ett värde som avgör när tjänsten skalas in. Om den genomsnittliga belastningen för alla partitioner i tjänsten är lägre än det här värdet skalas tjänsten in.
  • Övre belastningströskel är ett värde som avgör när tjänsten skalas ut. Om den genomsnittliga belastningen för alla partitioner i tjänsten är högre än det här värdet skalas tjänsten ut.
  • Skalningsintervall avgör hur ofta utlösaren kontrolleras. När utlösaren har kontrollerats tillämpas mekanismen om skalning behövs. Om skalning inte behövs vidtas ingen åtgärd. I båda fallen kontrolleras utlösaren igen innan skalningsintervallet upphör att gälla igen.

Den här utlösaren kan användas både med tillståndskänsliga och tillståndslösa tjänster. Den enda mekanism som kan användas med den här utlösaren är AddRemoveIncrementalNamedPartitionScalingMechanism. När tjänsten skalas ut läggs en ny partition till och när tjänsten skalas i en av befintliga partitioner tas bort. Det finns begränsningar som kontrolleras när tjänsten skapas eller uppdateras och tjänstens skapande/uppdatering misslyckas om dessa villkor inte uppfylls:

  • Namngivet partitionsschema måste användas för tjänsten.
  • Partitionsnamn måste vara heltalsnummer i följd, till exempel "0", "1", ...
  • Det första partitionsnamnet måste vara "0".

Om en tjänst till exempel först skapas med tre partitioner är den enda giltiga möjligheten för partitionsnamn "0", "1" och "2".

Den faktiska automatiska skalningsåtgärden som utförs respekterar även det här namngivningsschemat:

  • Om aktuella partitioner av tjänsten heter "0", "1" och "2" får partitionen som lagts till för utskalning namnet "3".
  • Om aktuella partitioner av tjänsten heter "0", "1" och "2" är partitionen som tagits bort för skalning i partitionen med namnet "2".

På samma sätt som med mekanismen som använder skalning genom att lägga till eller ta bort instanser finns det tre parametrar som avgör hur den här mekanismen tillämpas:

  • Skalningssteg avgör hur många partitioner som läggs till eller tas bort när mekanismen utlöses.
  • Maximalt antal partitioner definierar den övre gränsen för skalning. Om antalet partitioner av tjänsten når den här gränsen skalas inte tjänsten ut, oavsett belastning. Det går att utelämna den här gränsen genom att ange värdet -1, och i så fall skalas tjänsten ut så mycket som möjligt (gränsen är klustrets faktiska kapacitet).
  • Minsta partitionsantal definierar den lägre gränsen för skalning. Om antalet partitioner av tjänsten når den här gränsen skalas inte tjänsten in oavsett belastning.

Varning

När AddRemoveIncrementalNamedPartitionScalingMechanism används med tillståndskänsliga tjänster lägger Service Fabric till eller tar bort partitioner utan meddelande eller varning. Ompartitionering av data utförs inte när skalningsmekanismen utlöses. Vid utskalning kommer nya partitioner att vara tomma, och vid skalning tas partitionen bort tillsammans med alla data som den innehåller.

Ange principen för automatisk skalning för partitionsbaserad skalning

Använda programmanifest

<NamedPartition>
    <Partition Name="0" />
</NamedPartition>
<ServiceScalingPolicies>
    <ScalingPolicy>
        <AverageServiceLoadScalingTrigger MetricName="servicefabric:/_MemoryInMB" LowerLoadThreshold="300" UpperLoadThreshold="500" ScaleIntervalInSeconds="600"/>
        <AddRemoveIncrementalNamedPartitionScalingMechanism MinPartitionCount="1" MaxPartitionCount="3" ScaleIncrement="1"/>
    </ScalingPolicy>
</ServiceScalingPolicies>

Använda C#-API:er

FabricClient fabricClient = new FabricClient();
StatefulServiceUpdateDescription serviceUpdate = new StatefulServiceUpdateDescription();
AveragePartitionLoadScalingTrigger trigger = new AverageServiceLoadScalingTrigger();
PartitionInstanceCountScaleMechanism mechanism = new AddRemoveIncrementalNamedPartitionScalingMechanism();
mechanism.MaxPartitionCount = 4;
mechanism.MinPartitionCount = 1;
mechanism.ScaleIncrement = 1;
//expecting that the service already has metric NumberOfConnections
trigger.MetricName = "NumberOfConnections";
trigger.ScaleInterval = TimeSpan.FromMinutes(15);
trigger.LowerLoadThreshold = 10000;
trigger.UpperLoadThreshold = 20000;
ScalingPolicyDescription policy = new ScalingPolicyDescription(mechanism, trigger);
serviceUpdate.ScalingPolicies = new List<ScalingPolicyDescription>;
serviceUpdate.ScalingPolicies.Add(policy);
await fabricClient.ServiceManager.UpdateServiceAsync(new Uri("fabric:/AppName/ServiceName"), serviceUpdate);

Använd PowerShell

$mechanism = New-Object -TypeName System.Fabric.Description.AddRemoveIncrementalNamedPartitionScalingMechanism
$mechanism.MinPartitionCount = 1
$mechanism.MaxPartitionCount = 3
$mechanism.ScaleIncrement = 2
$trigger = New-Object -TypeName System.Fabric.Description.AverageServiceLoadScalingTrigger
$trigger.MetricName = "servicefabric:/_MemoryInMB"
$trigger.LowerLoadThreshold = 5000
$trigger.UpperLoadThreshold = 10000
$trigger.ScaleInterval = New-TimeSpan -Minutes 25
$scalingpolicy = New-Object -TypeName System.Fabric.Description.ScalingPolicyDescription
$scalingpolicy.ScalingMechanism = $mechanism
$scalingpolicy.ScalingTrigger = $trigger
$scalingpolicies = New-Object 'System.Collections.Generic.List[System.Fabric.Description.ScalingPolicyDescription]'
$scalingpolicies.Add($scalingpolicy)
#as we are using scaling on a resource this must be exclusive service
#also resource monitor service needs to be enabled
New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -TargetReplicaSetSize 3 -MinReplicaSetSize 2 -HasPersistedState true -PartitionNames @("0","1") -ServicePackageActivationMode ExclusiveProcess -ScalingPolicies $scalingpolicies

Automatisk skalning baserat på resurser

Om du vill att resursövervakartjänsten skalar baserat på faktiska resurser kan du lägga till ResourceMonitorService funktionen på följande sätt:

"fabricSettings": [
...   
],
"addonFeatures": [
    "ResourceMonitorService"
],

Service Fabric har stöd för processor- och minnesstyrning med hjälp av två inbyggda mått: servicefabric:/_CpuCores för CPU och servicefabric:/_MemoryInMB för minne. Resource Monitor-tjänsten ansvarar för att spåra processor- och minnesanvändning och uppdatera Klusterresurshanteraren med den aktuella resursanvändningen. Den här tjänsten tillämpar ett viktat glidande medelvärde för att ta hänsyn till potentiella kortvariga toppar. Resursövervakning stöds för både containerbaserade och icke-kontaineriserade program i Windows och för containerbaserade program i Linux.

Kommentar

Processor- och minnesförbrukning som övervakas i resource monitor-tjänsten och som uppdaterats till Klusterresurshanteraren påverkar inte några beslutsprocesser utanför den automatiska skalningen. Om resursstyrning behövs kan den konfigureras utan att störa funktionerna för automatisk skalning och vice versa.

Viktigt!

Resursbaserad automatisk skalning stöds endast för tjänster som aktiveras i den exklusiva processmodellen.

Nästa steg

Läs mer om programmets skalbarhet.