Inleiding tot automatisch schalen

Automatisch schalen is een andere mogelijkheid van Service Fabric om uw services dynamisch te schalen op basis van de belasting die services rapporteren of op basis van het gebruik van resources. Automatisch schalen biedt grote elasticiteit en maakt het inrichten van extra exemplaren of partities van uw service op aanvraag mogelijk. Het volledige proces voor automatisch schalen is geautomatiseerd en transparant en zodra u uw beleid voor een service hebt ingesteld, hoeft u geen handmatige schaalbewerkingen op serviceniveau uit te voeren. Automatisch schalen kan worden ingeschakeld tijdens het maken van de service of op elk gewenst moment door de service bij te werken.

Een veelvoorkomend scenario waarbij automatisch schalen nuttig is, is wanneer de belasting van een bepaalde service in de loop van de tijd varieert. Een service zoals een gateway kan bijvoorbeeld worden geschaald op basis van de hoeveelheid resources die nodig zijn om binnenkomende aanvragen te verwerken. Laten we eens kijken naar een voorbeeld van hoe deze schaalregels eruit kunnen zien:

  • Als alle exemplaren van mijn gateway gemiddeld meer dan twee kernen gebruiken, schaalt u de gatewayservice uit door nog één exemplaar toe te voegen. Doe dit elke uur, maar heb nooit meer dan zeven exemplaren in totaal.
  • Als alle exemplaren van mijn gateway gemiddeld minder dan 0,5 kernen gebruiken, schaalt u de service in door één exemplaar te verwijderen. Doe deze verwijdering elk uur, maar heb nooit minder dan drie exemplaren in totaal.

Automatisch schalen wordt ondersteund voor zowel containers als reguliere Service Fabric-services. Als u automatisch schalen wilt gebruiken, moet u worden uitgevoerd op versie 6.2 of hoger van de Service Fabric-runtime.

In de rest van dit artikel worden de schaalbeleidsregels beschreven, manieren om automatisch schalen in of uit te schakelen en vindt u voorbeelden van het gebruik van deze functie.

Automatisch schalen beschrijven

Beleidsregels voor automatisch schalen kunnen worden gedefinieerd voor elke service in een Service Fabric-cluster. Elk schaalbeleid bestaat uit twee delen:

  • De schaaltrigger wordt beschreven wanneer het schalen van de service wordt uitgevoerd. Voorwaarden die in de trigger zijn gedefinieerd, worden periodiek gecontroleerd om te bepalen of een service moet worden geschaald of niet.

  • Het schaalmechanisme beschrijft hoe schalen wordt uitgevoerd wanneer deze wordt geactiveerd. Mechanisme wordt alleen toegepast wanneer aan de voorwaarden van de trigger wordt voldaan.

Alle triggers die momenteel worden ondersteund, werken met metrische gegevens voor logische belasting of met fysieke metrische gegevens, zoals CPU of geheugengebruik. In beide gevallen bewaakt Service Fabric de gerapporteerde belasting voor de metrische gegevens en evalueert de trigger periodiek om te bepalen of schalen nodig is.

Er zijn twee mechanismen die momenteel worden ondersteund voor automatisch schalen. De eerste is bedoeld voor staatloze services of voor containers waarbij automatisch schalen wordt uitgevoerd door exemplaren toe te voegen of te verwijderen. Voor stateful en stateless services kan automatisch schalen ook worden uitgevoerd door benoemde partities van de service toe te voegen of te verwijderen.

Notitie

Er is momenteel slechts één schaalbeleid per service en slechts één schaaltrigger per schaalbeleid.

Gemiddelde trigger voor het laden van partities met schaalaanpassing op basis van exemplaren

Het eerste type trigger is gebaseerd op de belasting van exemplaren in een stateless servicepartitie. Het laden van metrische gegevens wordt eerst vereffend om de belasting voor elk exemplaar van een partitie te verkrijgen. Vervolgens worden deze waarden gegemiddeld voor alle exemplaren van de partitie. Er zijn drie factoren die bepalen wanneer de service wordt geschaald:

  • Lagere drempelwaarde voor belasting is een waarde die bepaalt wanneer de service wordt ingeschaald. Als de gemiddelde belasting van alle exemplaren van de partities lager is dan deze waarde, wordt de service ingeschaald.
  • Drempelwaarde voor bovenbelasting is een waarde die bepaalt wanneer de service wordt uitgeschaald. Als de gemiddelde belasting van alle exemplaren van de partitie hoger is dan deze waarde, wordt de service uitgeschaald.
  • Het interval voor schalen bepaalt hoe vaak de trigger wordt gecontroleerd. Zodra de trigger is gecontroleerd, wordt het mechanisme toegepast als schalen nodig is. Als schalen niet nodig is, wordt er geen actie ondernomen. In beide gevallen wordt de trigger niet opnieuw gecontroleerd voordat het schaalinterval opnieuw verloopt.

Deze trigger kan alleen worden gebruikt met stateless services (staatloze containers of Service Fabric-services). Als een service meerdere partities heeft, wordt de trigger afzonderlijk geëvalueerd voor elke partitie en wordt voor elke partitie het opgegeven mechanisme toegepast. Het schaalgedrag van servicepartities kan daarom variëren op basis van hun belasting. Het is mogelijk dat sommige partities van de service worden uitgeschaald, terwijl sommige andere worden ingeschaald. Sommige partities worden mogelijk niet tegelijkertijd geschaald.

Het enige mechanisme dat met deze trigger kan worden gebruikt, is PartitionInstanceCountScaleMechanism. Er zijn drie factoren die bepalen hoe dit mechanisme wordt toegepast:

  • Schaalverhoging bepaalt hoeveel exemplaren worden toegevoegd of verwijderd wanneer het mechanisme wordt geactiveerd.
  • Maximumaantal exemplaren definieert de bovengrens voor schalen. Als het aantal exemplaren van de partitie deze limiet bereikt, wordt de service uitgeschaald, ongeacht de belasting. Het is mogelijk om deze limiet weg te laten door de waarde -1 op te geven en in dat geval wordt de service zoveel mogelijk uitgeschaald (de limiet is het aantal knooppunten dat beschikbaar is in het cluster).
  • Minimumaantal exemplaren definieert de ondergrens voor schalen. Als het aantal exemplaren van de partitie deze limiet bereikt, wordt de service niet geschaald, ongeacht de belasting.

Beleid voor automatisch schalen instellen voor schalen op basis van exemplaren

Toepassingsmanifest gebruiken

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

C#-API's gebruiken

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

PowerShell gebruiken

$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

Gemiddelde trigger voor servicebelasting met schalen op basis van partities

De tweede trigger is gebaseerd op de belasting van alle partities van één service. Metrische belastingen worden eerst gladgestreken om de belasting voor elke replica of instantie van een partitie te verkrijgen. Voor stateful services wordt de belasting van de partitie beschouwd als de belasting van de primaire replica, terwijl voor stateless services de belasting van de partitie de gemiddelde belasting is van alle exemplaren van de partitie. Deze waarden worden gemiddeld voor alle partities van de service en deze waarde wordt gebruikt om automatisch schalen te activeren. Hetzelfde als in het vorige mechanisme zijn er drie factoren die bepalen wanneer de service wordt geschaald:

  • Lagere drempelwaarde voor belasting is een waarde die bepaalt wanneer de service wordt ingeschaald. Als de gemiddelde belasting van alle partities van de service lager is dan deze waarde, wordt de service ingeschaald.
  • Drempelwaarde voor bovenbelasting is een waarde die bepaalt wanneer de service wordt uitgeschaald. Als de gemiddelde belasting van alle partities van de service hoger is dan deze waarde, wordt de service uitgeschaald.
  • Het interval voor schalen bepaalt hoe vaak de trigger wordt gecontroleerd. Zodra de trigger is gecontroleerd, wordt het mechanisme toegepast als schalen nodig is. Als schalen niet nodig is, wordt er geen actie ondernomen. In beide gevallen wordt de trigger opnieuw gecontroleerd voordat het schaalinterval opnieuw verloopt.

Deze trigger kan zowel worden gebruikt met stateful als stateless services. Het enige mechanisme dat met deze trigger kan worden gebruikt, is AddRemoveIncrementalNamedPartitionScalingMechanism. Wanneer de service wordt uitgeschaald, wordt er een nieuwe partitie toegevoegd en wanneer de service wordt geschaald in een van de bestaande partities, wordt verwijderd. Er zijn beperkingen die worden gecontroleerd wanneer de service wordt gemaakt of bijgewerkt en het maken/bijwerken van services mislukt als niet aan deze voorwaarden wordt voldaan:

  • Het benoemde partitieschema moet worden gebruikt voor de service.
  • Partitienamen moeten opeenvolgende gehele getallen zijn, zoals '0', '1', ...
  • De naam van de eerste partitie moet '0' zijn.

Als een service bijvoorbeeld in eerste instantie met drie partities wordt gemaakt, is de enige geldige mogelijkheid voor partitienamen '0', '1' en '2'.

De werkelijke bewerking voor automatisch schalen die wordt uitgevoerd, respecteert ook dit naamgevingsschema:

  • Als de huidige partities van de service de naam '0', '1' en '2' hebben, krijgt de partitie die is toegevoegd voor uitschalen de naam 3.
  • Als de huidige partities van de service de naam '0', '1' en '2' hebben, is de partitie die is verwijderd om in te schalen partitie met de naam 2.

Hetzelfde als bij het mechanisme dat gebruikmaakt van schalen door instanties toe te voegen of te verwijderen, zijn er drie parameters die bepalen hoe dit mechanisme wordt toegepast:

  • Schaalverhoging bepaalt hoeveel partities zijn toegevoegd of verwijderd wanneer het mechanisme wordt geactiveerd.
  • Maximumaantal partities definieert de bovengrens voor schalen. Als het aantal partities van de service deze limiet bereikt, wordt de service niet uitgeschaald, ongeacht de belasting. Het is mogelijk om deze limiet weg te laten door de waarde -1 op te geven en in dat geval wordt de service zoveel mogelijk uitgeschaald (de limiet is de werkelijke capaciteit van het cluster).
  • Minimumaantal partities definieert de ondergrens voor schalen. Als het aantal partities van de service deze limiet bereikt, wordt de service niet geschaald, ongeacht de belasting.

Waarschuwing

Wanneer AddRemoveIncrementalNamedPartitionScalingMechanism wordt gebruikt met stateful services, worden partities zonder melding of waarschuwing door Service Fabric toegevoegd of verwijderd. Het opnieuw partitioneren van gegevens wordt niet uitgevoerd wanneer het schaalmechanisme wordt geactiveerd. In het geval van uitschalen zijn nieuwe partities leeg en in het geval van inschalen worden partities samen met alle gegevens die deze bevat, verwijderd.

Beleid voor automatisch schalen instellen voor schalen op basis van partities

Toepassingsmanifest gebruiken

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

C#-API's gebruiken

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

PowerShell gebruiken

$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

Automatisch schalen op basis van resources

Als u wilt dat de resourcemonitorservice kan worden geschaald op basis van werkelijke resources, kunt u de ResourceMonitorService functie als volgt toevoegen:

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

Service Fabric ondersteunt CPU- en geheugenbeheer met behulp van twee ingebouwde metrische gegevens: servicefabric:/_CpuCores voor CPU en servicefabric:/_MemoryInMB voor geheugen. De Resource Monitor-service is verantwoordelijk voor het bijhouden van HET CPU- en geheugengebruik en het bijwerken van Cluster Resource Manager met het huidige resourcegebruik. Deze service past een gewogen zwevend gemiddelde toe om rekening te houden met potentiële pieken met een korte levensduur. Resourcebewaking wordt ondersteund voor toepassingen in containers en niet-gecontaineriseerde toepassingen in Windows en voor toepassingen in containers in Linux.

Notitie

Het CPU- en geheugenverbruik dat wordt bewaakt in de Resource Monitor-service en bijgewerkt naar clusterresourcebeheer, heeft geen invloed op een besluitvormingsproces buiten automatisch schalen. Als resourcebeheer nodig is, kan deze worden geconfigureerd zonder dat dit de functionaliteit voor automatisch schalen verstoort en vice versa.

Belangrijk

Automatisch schalen op basis van resources wordt alleen ondersteund voor services die zijn geactiveerd in het exclusieve procesmodel.

Volgende stappen

Meer informatie over schaalbaarheid van toepassingen.