Udostępnij za pośrednictwem


Planowanie i skalowanie pojemności dla usługi Azure Service Fabric

Przed utworzeniem klastra usługi Azure Service Fabric lub skalowania zasobów obliczeniowych hostujących klaster należy zaplanować pojemność. Aby uzyskać więcej informacji na temat planowania pojemności, zobacz Planowanie pojemności klastra usługi Service Fabric. Aby uzyskać dalsze wskazówki dotyczące najlepszych rozwiązań dotyczących skalowalności klastra, zobacz Zagadnienia dotyczące skalowalności usługi Service Fabric.

Oprócz rozważenia cech typu węzła i klastra należy oczekiwać, że operacje skalowania będą trwać dłużej niż godzinę dla środowiska produkcyjnego. Ta kwestia jest prawdziwa niezależnie od liczby dodanych maszyn wirtualnych.

Skalowanie automatyczne

Operacje skalowania należy wykonywać za pośrednictwem szablonów usługi Azure Resource Manager, ponieważ najlepszym rozwiązaniem jest traktowanie konfiguracji zasobów jako kodu.

Użycie automatycznego skalowania za pośrednictwem zestawów skalowania maszyn wirtualnych spowoduje, że szablon usługi Resource Manager w wersji niedokładnie zdefiniuje liczbę wystąpień dla zestawów skalowania maszyn wirtualnych. Niedokładna definicja zwiększa ryzyko, że przyszłe wdrożenia spowodują niezamierzone operacje skalowania. Ogólnie rzecz biorąc, należy użyć skalowania automatycznego, jeśli:

  • Wdrażanie szablonów usługi Resource Manager z zadeklarowaną odpowiednią pojemnością nie obsługuje twojego przypadku użycia.

    Oprócz ręcznego skalowania można skonfigurować potok ciągłej integracji i dostarczania w usługach Azure DevOps Services przy użyciu projektów wdrażania grup zasobów platformy Azure. Ten potok jest często wyzwalany przez aplikację logiki korzystającą z metryk wydajności maszyny wirtualnej, których dotyczy zapytanie z interfejsu API REST usługi Azure Monitor. Potok skutecznie automatycznie skaluje się na podstawie dowolnych metryk, a jednocześnie optymalizując szablony usługi Resource Manager.

  • Należy jednocześnie skalować tylko jeden węzeł zestawu skalowania maszyn wirtualnych w poziomie.

    Aby skalować w poziomie o co najmniej trzy węzły, należy skalować klaster usługi Service Fabric w poziomie przez dodanie zestawu skalowania maszyn wirtualnych. Można bezpiecznie skalować zestawy skalowania maszyn wirtualnych w poziomie i skalować je w poziomie, jeden węzeł naraz.

  • Niezawodność silver lub wyższa dla klastra usługi Service Fabric oraz trwałość silver lub wyższa w dowolnej skali, w której konfigurujesz reguły skalowania automatycznego.

    Minimalna pojemność reguł skalowania automatycznego musi być równa lub większa niż pięć wystąpień maszyn wirtualnych. Musi być również równa lub większa niż minimalna warstwa niezawodności dla typu węzła podstawowego.

Uwaga

Stanowa usługa Service Fabric service fabric:/System/InfrastructureService/<NODE_TYPE_NAME> jest uruchamiana na każdym typie węzła o trwałości silver lub wyższej. Jest to jedyna usługa systemowa obsługiwana na platformie Azure w dowolnym typie węzłów klastrów.

Ważne

Skalowanie automatyczne usługi Service Fabric obsługuje Default NewestVM konfiguracje i zestaw skalowania maszyn wirtualnych.

Zagadnienia dotyczące skalowania w pionie

Skalowanie w pionie typu węzła w usłudze Azure Service Fabric wymaga kilku kroków i zagadnień. Na przykład:

  • Klaster musi być w dobrej kondycji przed skalowaniem. W przeciwnym razie zdestabilizujesz klaster.
  • Poziom trwałości srebra lub większy jest wymagany dla wszystkich typów węzłów klastra usługi Service Fabric hostujących usługi stanowe.

Uwaga

Podstawowy typ węzła hostujący stanowe usługi systemu usługi Service Fabric musi mieć poziom trwałości silver lub wyższy. Po włączeniu trwałości silver operacje klastra, takie jak uaktualnienia, dodawanie lub usuwanie węzłów itd., będą wolniejsze, ponieważ system optymalizuje bezpieczeństwo danych z szybkością operacji.

Skalowanie w pionie zestawu skalowania maszyn wirtualnych przez zmianę jednostki SKU zasobów jest operacją destrukcyjną, ponieważ ponownie obrazuje hosty, usuwając w ten sposób cały stan utrwalone lokalnie. Zamiast tego należy skalować klaster w poziomie, dodając nowy zestaw skalowania z odpowiednią jednostkę SKU, a następnie przeprowadzić migrację usług do nowego zestawu skalowania w celu ukończenia bezpiecznej operacji skalowania w pionie.

Klaster używa właściwości węzła usługi Service Fabric i ograniczeń umieszczania, aby zdecydować, gdzie hostować usługi aplikacji. Podczas skalowania w pionie typu węzła podstawowego wdrożysz drugi typ węzła podstawowego, a następnie ustawisz ("isPrimary": false) w oryginalnym typie węzła podstawowego i przejdziesz do wyłączenia węzłów i usunięcia zestawu skalowania i powiązanych zasobów. Aby uzyskać szczegółowe informacje, zobacz Skalowanie w górę typu węzła podstawowego klastra usługi Service Fabric.

Uwaga

Zawsze weryfikuj operacje w środowiskach testowych przed podjęciem próby wprowadzenia zmian w środowisku produkcyjnym. Domyślnie usługi systemowe klastra usługi Service Fabric mają ograniczenie umieszczania tylko do docelowego typu węzła podstawowego.

Po zadeklarowaniu właściwości węzła i ograniczeń umieszczania wykonaj następujące kroki w jednym wystąpieniu maszyny wirtualnej. Dzięki temu usługi systemowe (i usługi stanowe) mogą być bezpiecznie zamykane w wystąpieniu maszyny wirtualnej, które usuwasz, ponieważ nowe repliki są tworzone w innym miejscu.

  1. W programie PowerShell uruchom polecenie Disable-ServiceFabricNode z zamiarem RemoveNode wyłączenia węzła, który chcesz usunąć. Usuń typ węzła, który ma największą liczbę. Jeśli na przykład masz klaster z sześciowęźle, usuń wystąpienie maszyny wirtualnej "MyNodeType_5".
  2. Uruchom polecenie Get-ServiceFabricNode , aby upewnić się, że węzeł został przeniesiony do wyłączonego. Jeśli nie, poczekaj na wyłączenie węzła. Może to potrwać kilka godzin dla każdego węzła. Nie kontynuuj, dopóki węzeł nie zostanie przeniesiony do wyłączonego.
  3. Zmniejsz liczbę maszyn wirtualnych o jedną w tym typie węzła. Najwyższe wystąpienie maszyny wirtualnej zostanie usunięte.
  4. Powtórz kroki od 1 do 3 zgodnie z potrzebami, ale nigdy nie skaluj liczby wystąpień w typach węzłów podstawowych mniej niż to, co gwarantuje warstwa niezawodności. Zobacz Planowanie pojemności klastra usługi Service Fabric, aby uzyskać listę zalecanych wystąpień.
  5. Gdy wszystkie maszyny wirtualne znikną (reprezentowane jako "W dół") sieć szkieletowa:/System/InfrastructureService/[nazwa węzła] pokaże stan Błąd. Następnie możesz zaktualizować zasób klastra, aby usunąć typ węzła. Możesz użyć wdrożenia szablonu usługi ARM lub edytować zasób klastra za pomocą usługi Azure Resource Manager. Spowoduje to uruchomienie uaktualnienia klastra, które spowoduje usunięcie usługi fabric:/System/InfrastructureService/[typ węzła], która jest w stanie błędu.
  6. Następnie możesz opcjonalnie usunąć zestaw VMScaleSet, ale węzły będą nadal widoczne jako "W dół" w widoku narzędzia Service Fabric Explorer. Ostatnim krokiem byłoby wyczyszczenie ich za pomocą Remove-ServiceFabricNodeState polecenia .

Skalowanie w poziomie

Skalowanie w poziomie można wykonać ręcznie lub programowo.

Uwaga

W przypadku skalowania typu węzła, który ma trwałość silver lub Gold, skalowanie będzie powolne.

Skalowanie w poziomie

Skalowanie klastra usługi Service Fabric w poziomie przez zwiększenie liczby wystąpień dla określonego zestawu skalowania maszyn wirtualnych. Skalowanie w poziomie można skalować programowo, używając identyfikatora AzureClient żądanego zestawu skalowania w celu zwiększenia pojemności.

var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);
var newCapacity = (int)Math.Min(MaximumNodeCount, scaleSet.Capacity + 1);
scaleSet.Update().WithCapacity(newCapacity).Apply(); 

Aby przeprowadzić skalowanie w poziomie ręcznie, zaktualizuj pojemność we właściwości SKU żądanego zasobu zestawu skalowania maszyn wirtualnych.

"sku": {
    "name": "[parameters('vmNodeType0Size')]",
    "capacity": "[parameters('nt0InstanceCount')]",
    "tier": "Standard"
}

Skalowanie w

Skalowanie w systemie wymaga większej uwagi niż skalowanie w yjść. Na przykład:

  • Usługi systemowe usługi Service Fabric są uruchamiane w podstawowym typie węzła w klastrze. Nigdy nie zamykaj ani nie skaluj liczby wystąpień dla tego typu węzła, aby mieć mniej wystąpień niż to, co gwarantuje warstwa niezawodności.
  • W przypadku usługi stanowej potrzebna jest pewna liczba węzłów, które są zawsze w stanie zachować dostępność i zachować stan usługi. Co najmniej wymagana jest liczba węzłów równych docelowej liczbie zestawów replik partycji lub usługi.

Aby przeprowadzić skalowanie ręcznie, wykonaj następujące kroki:

  1. W programie PowerShell uruchom polecenie Disable-ServiceFabricNode z zamiarem RemoveNode wyłączenia węzła, który chcesz usunąć. Usuń typ węzła, który ma największą liczbę. Jeśli na przykład masz klaster z sześciowęźle, usuń wystąpienie maszyny wirtualnej "MyNodeType_5".
  2. Uruchom polecenie Get-ServiceFabricNode , aby upewnić się, że węzeł został przeniesiony do wyłączonego. Jeśli nie, poczekaj na wyłączenie węzła. Może to potrwać kilka godzin dla każdego węzła. Nie kontynuuj, dopóki węzeł nie zostanie przeniesiony do wyłączonego.
  3. Zmniejsz liczbę maszyn wirtualnych o jedną w tym typie węzła. Najwyższe wystąpienie maszyny wirtualnej zostanie usunięte.
  4. Powtórz kroki od 1 do 3 zgodnie z potrzebami, dopóki nie aprowizujesz żądanej pojemności. Nie skaluj liczby wystąpień w typach węzłów podstawowych do mniejszej niż to, co gwarantuje warstwa niezawodności. Zobacz Planowanie pojemności klastra usługi Service Fabric, aby uzyskać listę zalecanych wystąpień.

Aby przeprowadzić skalowanie ręcznie, zaktualizuj pojemność we właściwości SKU żądanego zasobu zestawu skalowania maszyn wirtualnych.

"sku": {
    "name": "[parameters('vmNodeType0Size')]",
    "capacity": "[parameters('nt0InstanceCount')]",
    "tier": "Standard"
}

Należy przygotować węzeł do zamknięcia w celu programowego skalowania. Znajdź węzeł do usunięcia (węzeł o najwyższym wystąpieniu). Na przykład:

using (var client = new FabricClient())
{
    var mostRecentLiveNode = (await client.QueryManager.GetNodeListAsync())
        .Where(n => n.NodeType.Equals(NodeTypeToScale, StringComparison.OrdinalIgnoreCase))
        .Where(n => n.NodeStatus == System.Fabric.Query.NodeStatus.Up)
        .OrderByDescending(n =>
        {
            var instanceIdIndex = n.NodeName.LastIndexOf("_");
            var instanceIdString = n.NodeName.Substring(instanceIdIndex + 1);
            return int.Parse(instanceIdString);
        })
        .FirstOrDefault();

Dezaktywuj i usuń węzeł przy użyciu tego samego FabricClient wystąpienia (client w tym przypadku) i wystąpienia węzła (instanceIdString w tym przypadku), które zostało użyte w poprzednim kodzie:

var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);

// Remove the node from the Service Fabric cluster
ServiceEventSource.Current.ServiceMessage(Context, $"Disabling node {mostRecentLiveNode.NodeName}");
await client.ClusterManager.DeactivateNodeAsync(mostRecentLiveNode.NodeName, NodeDeactivationIntent.RemoveNode);

// Wait (up to a timeout) for the node to gracefully shut down
var timeout = TimeSpan.FromMinutes(5);
var waitStart = DateTime.Now;
while ((mostRecentLiveNode.NodeStatus == System.Fabric.Query.NodeStatus.Up || mostRecentLiveNode.NodeStatus == System.Fabric.Query.NodeStatus.Disabling) &&
        DateTime.Now - waitStart < timeout)
{
    mostRecentLiveNode = (await client.QueryManager.GetNodeListAsync()).FirstOrDefault(n => n.NodeName == mostRecentLiveNode.NodeName);
    await Task.Delay(10 * 1000);
}

// Decrement virtual machine scale set capacity
var newCapacity = (int)Math.Max(MinimumNodeCount, scaleSet.Capacity - 1); // Check min count 

scaleSet.Update().WithCapacity(newCapacity).Apply();

Uwaga

Podczas skalowania w klastrze zobaczysz usunięte wystąpienie węzła/maszyny wirtualnej wyświetlane w stanie złej kondycji w narzędziu Service Fabric Explorer. Aby uzyskać wyjaśnienie tego zachowania, zobacz Zachowania, które można zaobserwować w narzędziu Service Fabric Explorer. Masz następujące możliwości:

  • Wywołaj polecenie Remove-ServiceFabricNodeState z odpowiednią nazwą węzła.
  • Wdróż aplikację pomocnika automatycznego skalowania usługi Service Fabric w klastrze. Ta aplikacja gwarantuje, że węzły skalowane w dół zostaną wyczyszczone z narzędzia Service Fabric Explorer.

Poziomy niezawodności

Poziom niezawodności jest właściwością zasobu klastra usługi Service Fabric. Nie można go skonfigurować inaczej dla poszczególnych typów węzłów. Steruje czynnikiem replikacji usług systemowych klastra i jest ustawieniem na poziomie zasobu klastra.

Poziom niezawodności określi minimalną liczbę węzłów, które musi mieć typ węzła podstawowego. Warstwa niezawodności może przyjmować następujące wartości:

  • Platinum: uruchamia usługi systemowe z docelową liczbą zestawów replik z siedmiu i dziewięciu węzłów inicjowania.
  • Gold: Uruchamia usługi systemowe z docelową liczbą zestawów replik z siedmiu i siedmiu węzłów inicjowania.
  • Silver: uruchamia usługi systemowe z docelową liczbą zestawów replik pięciu i pięciu węzłów inicjowania.
  • Brąz: uruchamia usługi systemowe z docelową liczbą zestawów replik trzech i trzech węzłów inicjowania.

Minimalny zalecany poziom niezawodności to Silver.

Poziom niezawodności jest ustawiany w sekcji właściwości zasobu Microsoft.ServiceFabric/clusters w następujący sposób:

"properties":{
    "reliabilityLevel": "Silver"
}

Poziomy trwałości

Ostrzeżenie

Typy węzłów uruchomione z trwałością brązu nie uzyskują żadnych uprawnień. Zadania infrastruktury wpływające na obciążenia bezstanowe nie zostaną zatrzymane ani opóźnione, co może mieć wpływ na obciążenia.

Użyj trwałości brązowej tylko dla typów węzłów, które uruchamiają obciążenia bezstanowe. W przypadku obciążeń produkcyjnych uruchom program Silver lub nowszy, aby zapewnić spójność stanu. Wybierz odpowiednią niezawodność na podstawie wskazówek zawartych w dokumentacji dotyczącej planowania pojemności.

Poziom trwałości musi być ustawiony w dwóch zasobach. Jednym z nich jest profil rozszerzenia zasobu zestawu skalowania maszyn wirtualnych:

"extensionProfile": {
    "extensions":          {
        "name": "[concat('ServiceFabricNodeVmExt','_vmNodeType0Name')]",
        "properties": {
            "settings": {
                "durabilityLevel": "Bronze"
            }
        }
    }
}

Drugi zasób znajduje się nodeTypes w zasobie Microsoft.ServiceFabric/clusters:

"nodeTypes": [
    {
        "name": "[variables('vmNodeType0Name')]",
        "durabilityLevel": "Bronze"
    }
]

Następne kroki