Dela via


Introduktion till programgrupper

Service Fabrics kluster Resource Manager hanterar vanligtvis klusterresurser genom att fördela belastningen (representeras via mått) jämnt i klustret. Service Fabric hanterar kapaciteten för noderna i klustret och klustret som helhet via kapacitet. Mått och kapacitet fungerar bra för många arbetsbelastningar, men mönster som använder olika Service Fabric-programinstanser ger ibland ytterligare krav. Du kanske till exempel vill:

  • Reservera viss kapacitet på noderna i klustret för tjänsterna i någon namngiven programinstans
  • Begränsa det totala antalet noder som tjänsterna i en namngiven programinstans körs på (i stället för att sprida ut dem över hela klustret)
  • Definiera kapaciteter på själva den namngivna programinstansen för att begränsa antalet tjänster eller den totala resursförbrukningen för tjänsterna i den

För att uppfylla dessa krav stöder Service Fabric-klustret Resource Manager en funktion som kallas programgrupper.

Begränsa det maximala antalet noder

Det enklaste användningsfallet för programkapacitet är när en programinstans måste begränsas till ett visst maximalt antal noder. Detta konsoliderar alla tjänster i den programinstansen till ett angivet antal datorer. Konsolidering är användbart när du försöker förutsäga eller begränsa användningen av fysiska resurser av tjänsterna i den namngivna programinstansen.

Följande bild visar en programinstans med och utan ett maximalt antal definierade noder:

Programinstans som definierar maximalt antal noder

I det vänstra exemplet har programmet inte ett maximalt antal definierade noder och har tre tjänster. Klustrets Resource Manager har spridit ut alla repliker över sex tillgängliga noder för att uppnå den bästa balansen i klustret (standardbeteendet). I rätt exempel ser vi att samma program är begränsat till tre noder.

Parametern som styr det här beteendet kallas MaximumNodes. Den här parametern kan anges när programmet skapas eller uppdateras för en programinstans som redan kördes.

PowerShell

New-ServiceFabricApplication -ApplicationName fabric:/AppName -ApplicationTypeName AppType1 -ApplicationTypeVersion 1.0.0.0 -MaximumNodes 3
Update-ServiceFabricApplication –ApplicationName fabric:/AppName –MaximumNodes 5

C#

ApplicationDescription ad = new ApplicationDescription();
ad.ApplicationName = new Uri("fabric:/AppName");
ad.ApplicationTypeName = "AppType1";
ad.ApplicationTypeVersion = "1.0.0.0";
ad.MaximumNodes = 3;
await fc.ApplicationManager.CreateApplicationAsync(ad);

ApplicationUpdateDescription adUpdate = new ApplicationUpdateDescription(new Uri("fabric:/AppName"));
adUpdate.MaximumNodes = 5;
await fc.ApplicationManager.UpdateApplicationAsync(adUpdate);

I uppsättningen noder garanterar Resource Manager inte vilka tjänstobjekt som placeras tillsammans eller vilka noder som används.

Programmått, inläsning och kapacitet

Med programgrupper kan du också definiera mått som är associerade med en viss namngiven programinstans och programinstansens kapacitet för dessa mått. Med programmått kan du spåra, reservera och begränsa resursförbrukningen för tjänsterna i programinstansen.

För varje programmått finns det två värden som kan anges:

  • Total programkapacitet – den här inställningen representerar programmets totala kapacitet för ett visst mått. Klustret Resource Manager tillåter inte att nya tjänster skapas i den här programinstansen som skulle göra att den totala belastningen överskrider det här värdet. Anta till exempel att programinstansen hade en kapacitet på 10 och redan hade en belastning på fem. Det skulle inte vara tillåtet att skapa en tjänst med en total standardbelastning på 10.
  • Maximal nodkapacitet – Den här inställningen anger den maximala totala belastningen för programmet på en enda nod. Om belastningen överskrider den här kapaciteten flyttar Resource Manager repliker till andra noder så att belastningen minskar.

PowerShell:

New-ServiceFabricApplication -ApplicationName fabric:/AppName -ApplicationTypeName AppType1 -ApplicationTypeVersion 1.0.0.0 -Metrics @("MetricName:Metric1,MaximumNodeCapacity:100,MaximumApplicationCapacity:1000")

C#:

ApplicationDescription ad = new ApplicationDescription();
ad.ApplicationName = new Uri("fabric:/AppName");
ad.ApplicationTypeName = "AppType1";
ad.ApplicationTypeVersion = "1.0.0.0";

var appMetric = new ApplicationMetricDescription();
appMetric.Name = "Metric1";
appMetric.TotalApplicationCapacity = 1000;
appMetric.MaximumNodeCapacity = 100;
ad.Metrics.Add(appMetric);
await fc.ApplicationManager.CreateApplicationAsync(ad);

Reservera kapacitet

En annan vanlig användning för programgrupper är att se till att resurser i klustret är reserverade för en viss programinstans. Utrymmet är alltid reserverat när programinstansen skapas.

Att reservera utrymme i klustret för programmet sker omedelbart även när:

  • programinstansen har skapats men har inga tjänster i den än
  • antalet tjänster i programinstansen ändras varje gång
  • tjänsterna finns men förbrukar inte resurserna

Att reservera resurser för en programinstans kräver att två ytterligare parametrar anges: MinimumNodes och NodeReservationCapacity

  • MinimumNodes – Definierar det minsta antalet noder som programinstansen ska köras på.
  • NodeReservationCapacity – den här inställningen är per mått för programmet. Värdet är mängden mått som reserverats för programmet på alla noder där tjänsterna i programmet körs.

Genom att kombinera MinimumNodes och NodeReservationCapacity garanteras en minsta belastningsreservation för programmet i klustret. Om det finns mindre återstående kapacitet i klustret än den totala reservation som krävs misslyckas skapandet av programmet.

Nu ska vi titta på ett exempel på kapacitetsreservation:

Programinstanser som definierar reserverad kapacitet

I det vänstra exemplet har program ingen definierad programkapacitet. Klustret Resource Manager balanserar allt enligt normala regler.

I exemplet till höger ska vi säga att Application1 skapades med följande inställningar:

  • MinimumNodes inställt på två
  • Ett programmått som definierats med
    • NodeReservationCapacity av 20

PowerShell

New-ServiceFabricApplication -ApplicationName fabric:/AppName -ApplicationTypeName AppType1 -ApplicationTypeVersion 1.0.0.0 -MinimumNodes 2 -Metrics @("MetricName:Metric1,NodeReservationCapacity:20")

C#

ApplicationDescription ad = new ApplicationDescription();
ad.ApplicationName = new Uri("fabric:/AppName");
ad.ApplicationTypeName = "AppType1";
ad.ApplicationTypeVersion = "1.0.0.0";
ad.MinimumNodes = 2;

var appMetric = new ApplicationMetricDescription();
appMetric.Name = "Metric1";
appMetric.NodeReservationCapacity = 20;

ad.Metrics.Add(appMetric);

await fc.ApplicationManager.CreateApplicationAsync(ad);

Service Fabric reserverar kapacitet på två noder för Application1 och tillåter inte att tjänster från Application2 använder den kapaciteten även om ingen belastning förbrukas av tjänsterna i Application1 vid den tidpunkten. Den här reserverade programkapaciteten anses förbrukad och räknas mot den återstående kapaciteten på noden och i klustret. Reservationen dras av från den återstående klusterkapaciteten omedelbart, men den reserverade förbrukningen dras av från kapaciteten för en specifik nod endast när minst ett tjänstobjekt placeras på den. Den här senare reservationen ger flexibilitet och bättre resursanvändning eftersom resurser endast är reserverade på noder när det behövs.

Hämta programinläsningsinformationen

För varje program som har en programkapacitet definierad för ett eller flera mått kan du hämta information om den aggregeringsbelastning som rapporteras av repliker av dess tjänster.

PowerShell:

Get-ServiceFabricApplicationLoadInformation –ApplicationName fabric:/MyApplication1

C#

var v = await fc.QueryManager.GetApplicationLoadInformationAsync("fabric:/MyApplication1");
var metrics = v.ApplicationLoadMetricInformation;
foreach (ApplicationLoadMetricInformation metric in metrics)
{
    Console.WriteLine(metric.ApplicationCapacity);  //total capacity for this metric in this application instance
    Console.WriteLine(metric.ReservationCapacity);  //reserved capacity for this metric in this application instance
    Console.WriteLine(metric.ApplicationLoad);  //current load for this metric in this application instance
}

ApplicationLoad-frågan returnerar grundläggande information om programkapaciteten som angavs för programmet. Den här informationen innehåller information om minsta noder och maximalt antal noder och det antal som programmet för närvarande upptar. Den innehåller även information om varje programinläsningsmått, inklusive:

  • Måttnamn: Namnet på måttet.
  • Reservationskapacitet: Klusterkapacitet som är reserverad i klustret för det här programmet.
  • Programinläsning: Total belastning för det här programmets underordnade repliker.
  • Programkapacitet: Högsta tillåtna värde för programbelastning.

Ta bort programkapacitet

När parametrarna för programkapacitet har angetts för ett program kan de tas bort med api:er för uppdatering av program eller PowerShell-cmdletar. Exempel:

Update-ServiceFabricApplication –Name fabric:/MyApplication1 –RemoveApplicationCapacity

Det här kommandot tar bort alla parametrar för programkapacitetshantering från programinstansen. Detta inkluderar MinimumNodes, MaximumNodes och programmets mått, om det finns några. Effekten av kommandot är omedelbar. När det här kommandot har slutförts använder kluster Resource Manager standardbeteendet för att hantera program. Programkapacitetsparametrar kan anges igen via Update-ServiceFabricApplication/System.Fabric.FabricClient.ApplicationManagementClient.UpdateApplicationAsync().

Begränsningar för programkapacitet

Det finns flera begränsningar för programkapacitetsparametrar som måste respekteras. Om det finns valideringsfel sker inga ändringar.

  • Alla heltalsparametrar måste vara icke-negativa tal.
  • MinimumNodes får aldrig vara större än MaximumNodes.
  • Om kapaciteter för ett belastningsmått definieras måste de följa dessa regler:
    • Nodreservationskapaciteten får inte vara större än maximal nodkapacitet. Du kan till exempel inte begränsa kapaciteten för måttet "CPU" på noden till två enheter och försöka reservera tre enheter på varje nod.
    • Om MaximumNodes anges får produkten maximumnoder och maximal nodkapacitet inte vara större än total programkapacitet. Anta till exempel att måttet Maximal nodkapacitet för belastningsmåttet "CPU" är inställt på åtta. Anta också att du anger Maximalt antal noder till 10. I det här fallet måste den totala programkapaciteten vara större än 80 för det här inläsningsmåttet.

Begränsningarna tillämpas både när programmet skapas och uppdateras.

Så här använder du inte programkapacitet

  • Försök inte använda programgruppsfunktionerna för att begränsa programmet till en specifik delmängd av noderna. Med andra ord kan du ange att programmet körs på högst fem noder, men inte vilka specifika fem noder i klustret. Du kan begränsa ett program till specifika noder med placeringsbegränsningar för tjänster.
  • Försök inte använda programkapaciteten för att säkerställa att två tjänster från samma program placeras på samma noder. Använd i stället tillhörighets - eller placeringsbegränsningar.

Nästa steg