Sdílet prostřednictvím


Úvod do skupin aplikací

Resource Manager clusteru Service Fabric obvykle spravuje prostředky clusteru rozložením zatížení (reprezentované metrikami) rovnoměrně v celém clusteru. Service Fabric spravuje kapacitu uzlů v clusteru a clusteru jako celek prostřednictvím kapacity. Metriky a kapacita fungují skvěle pro mnoho úloh, ale vzory, které výrazně využívají různé instance aplikací Service Fabric, někdy přinášejí další požadavky. Můžete například chtít:

  • Vyhraďte si určitou kapacitu na uzlech v clusteru pro služby v rámci některé pojmenované instance aplikace.
  • Omezte celkový počet uzlů, na kterých běží služby v pojmenované instanci aplikace (místo jejich rozprostření po celém clusteru).
  • Definujte kapacity samotné pojmenované instance aplikace, abyste omezili počet služeb nebo celkovou spotřebu prostředků služeb uvnitř této instance.

Pro splnění těchto požadavků podporuje Resource Manager clusteru Service Fabric funkci s názvem Skupiny aplikací.

Omezení maximálního počtu uzlů

Nejjednodušším případem použití pro kapacitu aplikace je, když instance aplikace musí být omezena na určitý maximální počet uzlů. Tím se slučí všechny služby v rámci této instance aplikace na nastavený počet počítačů. Konsolidace je užitečná, když se pokoušíte předpovědět nebo zasadíte fyzické prostředky používané službami v rámci dané pojmenované instance aplikace.

Následující obrázek znázorňuje instanci aplikace s maximálním počtem definovaných uzlů a bez tohoto počtu:

Instance aplikace definující maximální počet uzlů

V levém příkladu aplikace nemá definovaný maximální počet uzlů a má tři služby. Správce prostředků clusteru rozložil všechny repliky mezi šest dostupných uzlů, aby se dosáhlo nejlepší rovnováhy v clusteru (výchozí chování). Ve správném příkladu vidíme stejnou aplikaci omezenou na tři uzly.

Parametr, který řídí toto chování, se nazývá MaximumNodes. Tento parametr lze nastavit při vytváření aplikace nebo aktualizovat pro instanci aplikace, která už byla spuštěna.

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

V rámci sady uzlů Správce prostředků clusteru nezaručuje, které objekty služby se umístí dohromady nebo které uzly se použijí.

Application Metrics, Load a Capacity

Skupiny aplikací také umožňují definovat metriky přidružené k dané pojmenované instanci aplikace a kapacitu této instance aplikace pro tyto metriky. Metriky aplikací umožňují sledovat, rezervovat a omezit spotřebu prostředků služeb uvnitř této instance aplikace.

Pro každou metriku aplikace existují dvě hodnoty, které je možné nastavit:

  • Celková kapacita aplikace – Toto nastavení představuje celkovou kapacitu aplikace pro konkrétní metriku. Správce prostředků clusteru zakáže vytvoření všech nových služeb v rámci této instance aplikace, které by způsobily, že by celkové zatížení překročilo tuto hodnotu. Řekněme například, že instance aplikace měla kapacitu 10 a už měla pět zatížení. Vytvoření služby s celkovým výchozím zatížením 10 by se nepovolilo.
  • Maximální kapacita uzlu – Toto nastavení určuje maximální celkové zatížení aplikace na jednom uzlu. Pokud zatížení překročí tuto kapacitu, Resource Manager clusteru přesune repliky do jiných uzlů, aby se zatížení snížilo.

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

Rezervace kapacity

Dalším běžným použitím skupin aplikací je zajistit, aby prostředky v clusteru byly vyhrazeny pro danou instanci aplikace. Prostor je vždy vyhrazen při vytváření instance aplikace.

Rezervace místa v clusteru pro aplikaci proběhne okamžitě, i když:

  • instance aplikace se vytvoří, ale zatím v ní nemá žádné služby.
  • počet služeb v instanci aplikace se pokaždé změní.
  • služby existují, ale nepoužívají prostředky.

Rezervace prostředků pro instanci aplikace vyžaduje zadání dvou dalších parametrů: MinimumNodes a NodeReservationCapacity

  • MinimumNodes – Definuje minimální počet uzlů, na kterých má instance aplikace běžet.
  • NodeReservationCapacity – Toto nastavení je pro aplikaci vázané na metriku. Hodnota je množství této metriky vyhrazené pro aplikaci v libovolném uzlu, kde se služby v dané aplikaci spouští.

Kombinace minimálních uzlů a NodeReservationCapacity zaručuje minimální rezervaci zatížení pro aplikaci v rámci clusteru. Pokud v clusteru zbývá méně kapacity, než je celková požadovaná rezervace, vytvoření aplikace se nezdaří.

Podívejme se na příklad rezervace kapacity:

Instance aplikací definující rezervovanou kapacitu

V levém příkladu aplikace nemají definovanou žádnou kapacitu aplikace. Správce prostředků clusteru vyrovnává všechno podle normálních pravidel.

V příkladu napravo řekněme, že aplikace 1 byla vytvořena s následujícím nastavením:

  • Minimální počet uzlů nastavený na dva
  • Metrika aplikace definovaná pomocí
    • NodeReservationCapacity z 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 rezervuje kapacitu na dvou uzlech pro aplikaci Application1 a neumožňuje službám z aplikace Application2 tuto kapacitu spotřebovávat, i když služby v aplikaci Application1 v daném okamžiku nevyužívají žádné zatížení. Tato rezervovaná kapacita aplikace se považuje za spotřebovanou a počítá se do zbývající kapacity na daném uzlu a v rámci clusteru. Rezervace se odečte od zbývající kapacity clusteru okamžitě, ale rezervovaná spotřeba se odečte z kapacity konkrétního uzlu pouze v případě, že je na něm umístěn alespoň jeden objekt služby. Tato pozdější rezervace umožňuje flexibilitu a lepší využití prostředků, protože prostředky jsou v případě potřeby vyhrazeny pouze na uzlech.

Získání informací o načtení aplikace

Pro každou aplikaci, která má definovanou kapacitu aplikace pro jednu nebo více metrik, můžete získat informace o agregované zátěži hlášené replikami jejích služeb.

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
}

Dotaz ApplicationLoad vrátí základní informace o kapacitě aplikace, která byla zadána pro aplikaci. Tyto informace zahrnují informace o minimálních uzlech a maximálních uzlech a číslo, které aplikace aktuálně zabírá. Obsahuje také informace o jednotlivých metrikách načítání aplikací, mezi které patří:

  • Název metriky: Název metriky.
  • Kapacita rezervace: Kapacita clusteru rezervovaná v clusteru pro tuto aplikaci.
  • Načtení aplikace: Celkové zatížení podřízených replik této aplikace.
  • Kapacita aplikace: Maximální povolená hodnota zatížení aplikace.

Odebrání kapacity aplikace

Jakmile jsou parametry kapacity aplikace nastavené pro aplikaci, je možné je odebrat pomocí rozhraní API pro aktualizaci aplikací nebo rutin PowerShellu. Příklad:

Update-ServiceFabricApplication –Name fabric:/MyApplication1 –RemoveApplicationCapacity

Tento příkaz odebere všechny parametry správy kapacity aplikace z instance aplikace. To zahrnuje MinimumNodes, MaximumNodes a metriky aplikace, pokud jsou k dispozici. Účinek příkazu je okamžitý. Po dokončení tohoto příkazu použije Správce prostředků clusteru výchozí chování pro správu aplikací. Parametry kapacity aplikace lze znovu zadat prostřednictvím Update-ServiceFabricApplication/System.Fabric.FabricClient.ApplicationManagementClient.UpdateApplicationAsync().

Omezení kapacity aplikace

Existuje několik omezení parametrů kapacity aplikace, které je potřeba respektovat. Pokud dojde k chybám ověření, neprobíhá žádné změny.

  • Všechny celočíselné parametry musí být nezáporná čísla.
  • Minimální počet uzlů nesmí být nikdy větší než MaximumNodes.
  • Pokud jsou definovány kapacity pro metriku zatížení, musí se řídit těmito pravidly:
    • Kapacita rezervace uzlu nesmí být větší než maximální kapacita uzlu. Kapacitu metriky CPU na uzlu například nemůžete omezit na dvě jednotky a pokusit se rezervovat tři jednotky na každém uzlu.
    • Pokud je zadán maximální počet uzlů, nesmí být součin Maximální počet uzlů a maximální kapacita uzlu větší než celková kapacita aplikace. Řekněme například, že maximální kapacita uzlu pro metriku zatížení cpu je nastavená na osm. Řekněme také, že nastavíte maximální počet uzlů na 10. V tomto případě musí být celková kapacita aplikace větší než 80 pro tuto metriku zatížení.

Tato omezení se vynucují jak při vytváření aplikace, tak při aktualizacích.

Jak nepoužívat kapacitu aplikace

  • Nepokoušejte se použít funkce skupiny aplikací k omezení aplikace na konkrétní podmnožinu uzlů. Jinými slovy můžete určit, že aplikace běží na maximálně pěti uzlech, ale ne na konkrétních pěti uzlech v clusteru. Omezení aplikace na konkrétní uzly lze dosáhnout pomocí omezení umístění pro služby.
  • Nepokoušejte se použít kapacitu aplikace, abyste zajistili, že jsou dvě služby ze stejné aplikace umístěné na stejných uzlech. Místo toho použijte omezení spřažení nebo umístění.

Další kroky