Programové škálování clusteru Service Fabric

Clustery Service Fabric běžící v Azure jsou postavené na škálovacích sadách virtuálních počítačů. Škálování clusteru popisuje, jak je možné škálovat clustery Service Fabric ručně nebo pomocí pravidel automatického škálování. Tento článek popisuje, jak spravovat přihlašovací údaje a škálovat cluster na více nebo více instancí pomocí fluent Azure Compute SDK, což je pokročilejší scénář. Přehled najdete v tématu o programových metodách koordinace operací škálování Azure.

Poznámka

K interakci s Azure doporučujeme použít modul Azure Az PowerShell. Začněte tím, že si projdete téma Instalace Azure PowerShellu. Informace o tom, jak migrovat na modul Az PowerShell, najdete v tématu Migrace Azure PowerShellu z AzureRM na Az.

Správa přihlašovacích údajů

Jednou z výzev při vytváření služby pro zpracování škálování je to, že služba musí mít přístup k prostředkům škálovací sady virtuálních počítačů bez interaktivního přihlášení. Přístup ke clusteru Service Fabric je snadný, pokud škálovací služba upravuje vlastní aplikaci Service Fabric, ale pro přístup ke škálovací sadě jsou potřeba přihlašovací údaje. K přihlášení můžete použít instanční objekt vytvořený pomocí Azure CLI.

Instanční objekt je možné vytvořit pomocí následujících kroků:

  1. Přihlaste se k Azure CLI (az login) jako uživatel s přístupem ke škálovací sadě virtuálních počítačů.
  2. Vytvoření instančního objektu pomocí az ad sp create-for-rbac
    1. Poznamenejte si appId (jinde označované jako ID klienta), jméno, heslo a tenanta pro pozdější použití.
    2. Budete také potřebovat ID předplatného, které můžete zobrazit pomocí az account list

Výpočetní knihovna Fluent se může přihlásit pomocí těchto přihlašovacích údajů následujícím způsobem (mějte na paměti, že základní typy Fluent Azure, jako IAzure jsou, jsou v balíčku Microsoft.Azure.Management.Fluent ):

var credentials = new AzureCredentials(new ServicePrincipalLoginInformation {
                ClientId = AzureClientId,
                ClientSecret = 
                AzureClientKey }, AzureTenantId, AzureEnvironment.AzureGlobalCloud);
IAzure AzureClient = Azure.Authenticate(credentials).WithSubscription(AzureSubscriptionId);

if (AzureClient?.SubscriptionId == AzureSubscriptionId)
{
    ServiceEventSource.Current.ServiceMessage(Context, "Successfully logged into Azure");
}
else
{
    ServiceEventSource.Current.ServiceMessage(Context, "ERROR: Failed to login to Azure");
}

Po přihlášení je možné dotazovat počet instancí škálovací sady prostřednictvím AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.

Horizontální navýšení kapacity

Pomocí fluent azure compute SDK je možné přidat instance do škálovací sady virtuálních počítačů pomocí několika volání :

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

Alternativně je možné velikost škálovací sady virtuálních počítačů spravovat také pomocí rutin PowerShellu. Get-AzVmss může načíst objekt škálovací sady virtuálních počítačů. Aktuální kapacita je k dispozici prostřednictvím .sku.capacity vlastnosti . Po změně kapacity na požadovanou hodnotu je možné škálovací sadu virtuálních počítačů v Azure aktualizovat pomocí Update-AzVmss příkazu .

Stejně jako při ručním přidávání uzlu by přidání instance škálovací sady mělo být vše, co je potřeba ke spuštění nového uzlu Service Fabric, protože šablona škálovací sady obsahuje rozšíření pro automatické připojení nových instancí ke clusteru Service Fabric.

Horizontální snížení kapacity

Horizontální snížení kapacity se podobá horizontálnímu navýšení kapacity. Skutečné změny škálovací sady virtuálních počítačů jsou prakticky stejné. Jak už jsme ale probírali dříve, Service Fabric automaticky vyčistí pouze odebrané uzly se stálostí Gold nebo Silver. V případě škálování bronzové odolnosti je proto nutné komunikovat s clusterem Service Fabric, aby se uzel, který se má odebrat, vypnul a pak odebrat jeho stav.

Příprava uzlu na vypnutí zahrnuje vyhledání uzlu, který se má odebrat (naposledy přidaná instance škálovací sady virtuálních počítačů) a jeho deaktivace. Instance škálovací sady virtuálních počítačů se číslují v pořadí, ve kterém se přidají, takže novější uzly najdete porovnáním přípony čísla v názvech uzlů (které odpovídají názvům instancí základní škálovací sady virtuálních počítačů).

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

Jakmile je uzel, který se má odebrat, nalezen, může být deaktivován a odebrán pomocí stejné FabricClient instance a IAzure instance z předchozí instance.

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 shutdown
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 VMSS capacity
var newCapacity = (int)Math.Max(MinimumNodeCount, scaleSet.Capacity - 1); // Check min count 

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

Stejně jako u horizontálního navýšení kapacity je možné v případě, že je vhodnější použít skriptovací přístup, rutiny PowerShellu pro úpravu kapacity škálovací sady virtuálních počítačů. Po odebrání instance virtuálního počítače je možné odebrat stav uzlu Service Fabric.

await client.ClusterManager.RemoveNodeStateAsync(mostRecentLiveNode.NodeName);

Další kroky

Pokud chcete začít s implementací vlastní logiky automatického škálování, seznamte se s následujícími koncepty a užitečnými rozhraními API: