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 instancji aplikacji Service Fabric, czasami wiążą się z dodatkowymi wymaganiami. Na przykład możesz chcieć:

  • Zarezerwuj część zasobów na węzłach w klastrze dla usług wewnątrz instancji aplikacji o określonej nazwie.
  • Ogranicz całkowitą liczbę węzłów, na których działają usługi w ramach nazwanej instancji aplikacji (zamiast rozkładać je na cały klaster)
  • Definiowanie limitów w danej instancji aplikacji w celu ograniczenia liczby usług lub całkowitego zużycia zasobów przez te usługi.

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. Powoduje to skonsolidowanie wszystkich usług w danym wystąpieniu aplikacji na określoną liczbę maszyn. Konsolidacja jest przydatna, gdy próbujesz przewidzieć albo ograniczyć zużycie zasobów fizycznych przez usługi związane z danym wystąpieniem aplikacji.

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

Instancja aplikacji określająca 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 aplikacyjne umożliwiają również definiowanie metryk skojarzonych z danym nazwanym wystąpieniem aplikacji oraz możliwość przetwarzania tych metryk przez wystąpienie aplikacji. 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 instancja aplikacji miała pojemność 10 i już była obciążona na pięć. 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.

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 rezerwowane, gdy tworzona jest instancja aplikacji.

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

  • instancja aplikacji jest tworzona, ale nie zawiera jeszcze żadnych usług
  • liczba usług w każdej instancji 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 MinimumNodes i NodeReservationCapacity gwarantuje minimalną rezerwację zasobów 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 ustawione na dwa
  • Metryka aplikacji zdefiniowana za pomocą polecenia
    • Pojemność rezerwacji węzła: 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 rezerwuje pojemność na dwóch węzłach dla Application1 i nie zezwala usługom z Application2 na korzystanie z tej pojemności, nawet jeśli aktualnie żadna usługa w Application1 nie wykorzystuje obciążenia. Zarezerwowana pojemność aplikacji jest uznawana za zużytą i zalicza się do pozostałej pojemności na tym węźle oraz w obrębie klastra. 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 zapewnia elastyczność i lepsze wykorzystanie zasobów, ponieważ zasoby są rezerwowane na węzłach tylko 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.

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. Informacje te obejmują dane o minimalnych i maksymalnych węzłach oraz o liczbie węzłów aktualnie używanych przez aplikację. Zawiera również informacje o każdej metryce obciążenia aplikacji, w tym:

  • Nazwa metryki: określenie 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 aplikacji zarządzania pojemnością z instancji 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.
  • MinimalneWęzły nigdy nie powinny być większe niż MaksymalneWęzły.
  • 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 wartość maksymalnej liczby węzłów ustawiono 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ń lokalizacji 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ć powiązań lub ograniczeń dotyczących lokalizacji.

Następne kroki