Introduktion till programgrupper
Service Fabrics Klusterresurshanterare 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 sig av 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 Cluster 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 programinstansen till ett visst antal datorer. Konsolidering är användbart när du försöker förutsäga eller begränsa den fysiska resursanvändningen av tjänsterna i den namngivna programinstansen.
Följande bild visar en programinstans med och utan ett maximalt antal definierade noder:
I det vänstra exemplet har programmet inte ett maximalt antal definierade noder och har tre tjänster. Klusterresurshanteraren 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 inte Klusterresurshanteraren 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. Klusterresurshanteraren tillåter inte att nya tjänster skapas i den här programinstansen, vilket skulle leda till 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 Klusterresurshanteraren 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 reserveras alltid 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
Om du reserverar resurser för en programinstans måste du ange ytterligare två parametrar: 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 av måttet som är reserverat 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:
I det vänstra exemplet har program ingen definierad programkapacitet. Klusterresurshanteraren 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 på 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 förbrukar den kapaciteten även om det inte finns någon belastning som 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 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 information om programinläsning
För varje program som har en programkapacitet definierad för ett eller flera mått kan du hämta information om den mängdbelastning 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 programkapacitet som angavs för programmet. Den här informationen innehåller information om minsta noder och maximala noder och det antal som programmet för närvarande upptar. Den innehåller också information om varje programinläsningsmått, inklusive:
- Måttnamn: Måttets namn.
- 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 uppdateringsprogram eller PowerShell-cmdletar. Till 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 några. Effekten av kommandot är omedelbar. När det här kommandot har slutförts använder Klusterresurshanteraren standardbeteendet för att hantera program. Parametrar för programkapacitet 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:
- Nodreservationskapacitet 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 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 noder. Med andra ord kan du ange att programmet körs på högst fem noder, men inte vilka specifika fem noder i klustret. Att begränsa ett program till specifika noder kan uppnås med hjälp av placeringsbegränsningar för tjänster.
- Försök inte att använda programkapaciteten för att se till 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
- Mer information om hur du konfigurerar tjänster finns i Mer information om hur du konfigurerar tjänster
- Om du vill veta mer om hur Klusterresurshanteraren hanterar och balanserar belastningen i klustret kan du läsa artikeln om belastningsutjämning
- Börja från början och få en introduktion till Service Fabric Cluster Resource Manager
- Mer information om hur mått fungerar generellt finns i Avsnittet om Service Fabric Load Metrics
- Klusterresurshanteraren har många alternativ för att beskriva klustret. Mer information om dem finns i den här artikeln om hur du beskriver ett Service Fabric-kluster