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 skalowalności klastra, zobacz Zagadnienia dotyczące skalowalności usługi Service Fabric.

Oprócz rozważenia typów węzłów i cech 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 w wersji Resource Manager 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 Resource Manager z zadeklarowaną odpowiednią pojemnością nie obsługuje przypadku użycia.

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

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

    Aby skalować w poziomie przez co najmniej trzy węzły w danym momencie, należy skalować klaster usługi Service Fabric 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/InfastructureService/<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 dowolnych typach węzłów klastrów.

Ważne

Skalowanie automatyczne usługi Service Fabric obsługuje DefaultNewestVM konfiguracje zestawu skalowania maszyn wirtualnych.

Zagadnienia dotyczące skalowania w pionie

Skalowanie w pionie typu węzła w usłudze Azure Service Fabric wymaga wielu kroków i zagadnień. 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, który hostuje stanowe usługi systemu usługi Service Fabric, musi mieć poziom trwałości silver lub większy. 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 po prostu zmianę jednostki SKU zasobu jest operacją destrukcyjną, ponieważ ponownie obrazuje hosty, co eliminuje cały stan utrwalone lokalnie. Zamiast tego chcesz skalować klaster w poziomie przez dodanie nowego zestawu skalowania z odpowiednią jednostkę SKU, a następnie zmigrowanie 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 przejdź 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

Przed podjęciem próby zmiany środowiska produkcyjnego zawsze weryfikuj operacje w środowiskach testowych. 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 naraz. Dzięki temu usługi systemowe (i usługi stanowe) można bezpiecznie zamknąć 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 intencją RemoveNode , aby wyłączyć węzeł, 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 jeden w tym typie węzła. Najwyższe wystąpienie maszyny wirtualnej zostanie usunięte.
  4. Powtórz kroki od 1 do 3 w razie potrzeby, ale nigdy nie skaluj w liczbie 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. Po zniknięciu wszystkich maszyn wirtualnych (reprezentowanych jako "W dół") sieć szkieletowa:/System/InfrastructureService/[nazwa węzła] wyświetli 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, węzły będą nadal widoczne jako "W dół" z widoku Service Fabric Explorer. Ostatnim krokiem będzie 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 przy użyciu 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 ręcznie skalować w poziomie, zaktualizuj pojemność we właściwości jednostki SKU żądanego zasobu zestawu skalowania maszyn wirtualnych .

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

Skalowanie w

Skalowanie w obiekcie wymaga większej uwagi niż skalowanie w górę. 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 zawsze są w stanie zapewnić 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 intencją RemoveNode , aby wyłączyć węzeł, 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 jeden 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 do momentu aprowizowania żą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 jednostki 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 skalowania w sposób programowy. Znajdź węzeł do usunięcia (węzeł najwyższego wystąpienia). 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) użytego 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 Service Fabric Explorer. Aby uzyskać wyjaśnienie tego zachowania, zobacz Zachowania, które można obserwować w Service Fabric Explorer. Możesz:

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:

  • Platyny: uruchamia usługi systemowe z docelową liczbą zestawów replik z siedmiu i dziewięciu węzłów inicjowania.
  • Złoto: 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 z pięcioma węzłami początkowymi.
  • 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żywaj trwałości brązu 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 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