Udostępnij za pośrednictwem


Wprowadzenie do grup aplikacji

Menedżer zasobów klastra usługi Service Fabric zwykle zarządza zasobami klastra, rozkładając obciążenie (reprezentowane za pośrednictwem metryk) równomiernie w całym klastrze. Usługa Service Fabric zarządza pojemnością węzłów w klastrze i klastrze jako całością za pośrednictwem pojemności. Metryki i pojemność działają świetnie w przypadku wielu obciążeń, ale wzorce, które intensywnie korzystają z różnych wystąpień aplikacji usługi Service Fabric, czasami przynoszą dodatkowe wymagania. Na przykład możesz chcieć:

  • Rezerwuj pewną pojemność na węzłach w klastrze dla usług w ramach niektórych nazwanych wystąpień aplikacji
  • Ogranicz łączną liczbę węzłów, na których działają usługi w nazwanym wystąpieniu aplikacji (zamiast rozkładać je w całym klastrze)
  • Definiowanie pojemności w samym wystąpieniu nazwanej aplikacji w celu ograniczenia liczby usług lub całkowitego użycia zasobów usług wewnątrz niego

Aby spełnić te wymagania, menedżer zasobów klastra usługi Service Fabric obsługuje funkcję o nazwie Grupy aplikacji.

Ograniczanie maksymalnej liczby węzłów

Najprostszym przypadkiem użycia pojemności aplikacji jest ograniczenie wystąpienia aplikacji do określonej maksymalnej liczby węzłów. Spowoduje to skonsolidowanie wszystkich usług w tym wystąpieniu aplikacji na ustawionej liczbie maszyn. Konsolidacja jest przydatna, gdy próbujesz przewidzieć lub ograniczyć użycie zasobów fizycznych przez usługi w ramach tego nazwanego wystąpienia aplikacji.

Na poniższej ilustracji przedstawiono wystąpienie aplikacji z zdefiniowaną maksymalną liczbą węzłów i bez tej liczby:

Wystąpienie aplikacji definiujące maksymalną liczbę węzłów

W lewym przykładzie aplikacja nie ma zdefiniowanej maksymalnej liczby węzłów i ma trzy usługi. Menedżer zasobów klastra rozdzielił wszystkie repliki w sześciu dostępnych węzłach, aby osiągnąć najlepsze saldo w klastrze (zachowanie domyślne). W odpowiednim przykładzie widzimy tę samą aplikację ograniczoną do trzech węzłów.

Parametr, który kontroluje to zachowanie, nosi nazwę MaximumNodes. Ten parametr można ustawić podczas tworzenia aplikacji lub zaktualizować dla wystąpienia aplikacji, które było już uruchomione.

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

W zestawie węzłów menedżer zasobów klastra nie gwarantuje, które obiekty usługi są umieszczane razem lub które węzły są używane.

Metryki aplikacji, obciążenie i pojemność

Grupy aplikacji umożliwiają również definiowanie metryk skojarzonych z danym nazwanym wystąpieniem aplikacji oraz pojemność wystąpienia aplikacji dla tych metryk. Metryki aplikacji umożliwiają śledzenie, rezerwowanie i ograniczanie zużycia zasobów usług wewnątrz tego wystąpienia aplikacji.

Dla każdej metryki aplikacji można ustawić dwie wartości:

  • Łączna pojemność aplikacji — to ustawienie reprezentuje łączną pojemność aplikacji dla określonej metryki. Menedżer zasobów klastra nie zezwala na tworzenie nowych usług w tym wystąpieniu aplikacji, co spowodowałoby przekroczenie całkowitego obciążenia tej wartości. Załóżmy na przykład, że wystąpienie aplikacji miało pojemność 10 i już miało obciążenie pięciu. Tworzenie usługi z całkowitym domyślnym obciążeniem wynoszącym 10 byłoby niedozwolone.
  • Maksymalna pojemność węzła — to ustawienie określa maksymalne całkowite obciążenie aplikacji w jednym węźle. Jeśli obciążenie przekroczy tę pojemność, menedżer zasobów klastra przenosi repliki do innych węzłów, aby zmniejszyć obciążenie.

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

Rezerwowanie pojemności

Innym typowym zastosowaniem dla grup aplikacji jest zapewnienie, że zasoby w klastrze są zarezerwowane dla danego wystąpienia aplikacji. Miejsce jest zawsze zarezerwowane podczas tworzenia wystąpienia aplikacji.

Rezerwowanie miejsca w klastrze dla aplikacji odbywa się natychmiast nawet wtedy, gdy:

  • wystąpienie aplikacji jest tworzone, ale nie ma jeszcze w nim żadnych usług
  • liczba usług w wystąpieniu aplikacji zmienia się za każdym razem
  • usługi istnieją, ale nie korzystają z zasobów

Rezerwowanie zasobów dla wystąpienia aplikacji wymaga określenia dwóch dodatkowych parametrów: MinimumNodes i NodeReservationCapacity

  • MinimumNodes — definiuje minimalną liczbę węzłów, na których ma działać wystąpienie aplikacji.
  • NodeReservationCapacity — to ustawienie dotyczy metryki dla aplikacji. Wartość jest ilością tej metryki zarezerwowanej dla aplikacji w dowolnym węźle, w którym działają usługi w tej aplikacji.

Połączenie węzłów MinimumNodes i NodeReservationCapacity gwarantuje minimalną rezerwację obciążenia dla aplikacji w klastrze. Jeśli w klastrze jest mniej pojemności niż wymagana całkowita rezerwacja, tworzenie aplikacji zakończy się niepowodzeniem.

Przyjrzyjmy się przykładowi rezerwacji pojemności:

Wystąpienia aplikacji definiujące pojemność zarezerwowaną

W lewym przykładzie aplikacje nie mają zdefiniowanej pojemności aplikacji. Menedżer zasobów klastra równoważy wszystko zgodnie z normalnymi regułami.

W przykładzie po prawej stronie załóżmy, że aplikacja Application1 została utworzona przy użyciu następujących ustawień:

  • MinimumNodes ustawiono na dwa
  • Metryka aplikacji zdefiniowana za pomocą polecenia
    • NodeReservationCapacity 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);

Usługa Service Fabric rezerwuje pojemność na dwóch węzłach dla aplikacji Application1 i nie zezwala usługom z aplikacji Application2 na korzystanie z tej pojemności, nawet jeśli w tym czasie nie są używane żadne obciążenia przez usługi wewnątrz aplikacji Application1. Ta pojemność aplikacji zarezerwowanej jest traktowana jako zużywana i liczy się z pozostałą pojemnością w tym węźle i w klastrze. Rezerwacja jest odejmowana od pozostałej pojemności klastra natychmiast, jednak zużycie zarezerwowane jest odejmowane od pojemności określonego węzła tylko wtedy, gdy na nim znajduje się co najmniej jeden obiekt usługi. Ta późniejsza rezerwacja umożliwia elastyczne i lepsze wykorzystanie zasobów, ponieważ zasoby są zarezerwowane tylko w węzłach w razie potrzeby.

Uzyskiwanie informacji o obciążeniu aplikacji

Dla każdej aplikacji, która ma pojemność aplikacji zdefiniowaną dla co najmniej jednej metryki, można uzyskać informacje o zagregowanym obciążeniu zgłoszonym przez repliki jej usług.

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

Zapytanie ApplicationLoad zwraca podstawowe informacje o pojemności aplikacji określonej dla aplikacji. Te informacje obejmują informacje o węzłach minimalnych i maksymalnych węzłach oraz liczbę aktualnie zajmowaną przez aplikację. Zawiera również informacje o każdej metryce obciążenia aplikacji, w tym:

  • Nazwa metryki: nazwa metryki.
  • Pojemność rezerwacji: pojemność klastra zarezerwowana w klastrze dla tej aplikacji.
  • Obciążenie aplikacji: łączne obciążenie replik podrzędnych tej aplikacji.
  • Pojemność aplikacji: maksymalna dozwolona wartość obciążenia aplikacji.

Usuwanie pojemności aplikacji

Po ustawieniu parametrów pojemności aplikacji dla aplikacji można je usunąć przy użyciu interfejsów API aktualizacji aplikacji lub poleceń cmdlet programu PowerShell. Na przykład:

Update-ServiceFabricApplication –Name fabric:/MyApplication1 –RemoveApplicationCapacity

To polecenie usuwa wszystkie parametry zarządzania pojemnością aplikacji z wystąpienia aplikacji. Obejmuje to metryki MinimumNodes, MaximumNodes i metryki aplikacji, jeśli istnieją. Efekt polecenia jest natychmiastowy. Po zakończeniu tego polecenia menedżer zasobów klastra używa domyślnego zachowania do zarządzania aplikacjami. Parametry pojemności aplikacji można określić ponownie za pomocą polecenia Update-ServiceFabricApplication/System.Fabric.FabricClient.ApplicationManagementClient.UpdateApplicationAsync().

Ograniczenia dotyczące pojemności aplikacji

Istnieje kilka ograniczeń dotyczących parametrów pojemności aplikacji, które muszą być przestrzegane. Jeśli występują błędy walidacji, nie zostaną wprowadzone żadne zmiany.

  • Wszystkie parametry liczb całkowitych muszą być liczbami nie ujemnymi.
  • Węzły MinimumNode nigdy nie muszą być większe niż MaximumNodes.
  • Jeśli zdefiniowano pojemności dla metryki obciążenia, muszą one być zgodne z następującymi regułami:
    • Pojemność rezerwacji węzła nie może być większa niż maksymalna pojemność węzła. Na przykład nie można ograniczyć pojemności metryki "CPU" w węźle do dwóch jednostek i spróbować zarezerwować trzy jednostki w każdym węźle.
    • Jeśli określono wartość MaximumNodes, produkt MaximumNodes i maksymalna pojemność węzła nie może być większy niż łączna pojemność aplikacji. Załóżmy na przykład, że maksymalna pojemność węzła dla metryki obciążenia "CPU" jest ustawiona na osiem. Załóżmy również, że ustawiono wartość Maksymalna liczba węzłów na 10. W takim przypadku łączna pojemność aplikacji musi być większa niż 80 dla tej metryki obciążenia.

Ograniczenia są wymuszane zarówno podczas tworzenia aplikacji, jak i aktualizacji.

Jak nie używać pojemności aplikacji

  • Nie należy próbować używać funkcji grupy aplikacji, aby ograniczyć aplikację do określonego podzestawu węzłów. Innymi słowy, można określić, że aplikacja działa w co najwyżej pięciu węzłach, ale nie na których określonych pięciu węzłach w klastrze. Ograniczenie aplikacji do określonych węzłów można osiągnąć przy użyciu ograniczeń umieszczania dla usług.
  • Nie próbuj używać pojemności aplikacji, aby upewnić się, że dwie usługi z tej samej aplikacji są umieszczane w tych samych węzłach. Zamiast tego należy użyć ograniczeń koligacji lub umieszczania.

Następne kroki