Sdílet prostřednictvím


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é clustery Service Fabric škálovat ručně nebo pomocí pravidel automatického škálování. Tento článek popisuje, jak spravovat přihlašovací údaje a škálovat cluster s využitím fluent azure compute SDK, což je pokročilejší scénář. Přehled najdete v programových metodách koordinace operací škálování Azure.

Poznámka:

Při práci s Azure doporučujeme používat modul Azure Az PowerShellu. Pokud chcete začít, přečtěte si 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ů

Jedním z úkolů při psaní 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 služba škálování 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 ID aplikace (označované jako ID klienta jinde), název, heslo a tenanta pro pozdější použití.
    2. Budete také potřebovat ID předplatného, které si můžete prohlédnout pomocí az account list

Fluent compute library 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 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í lze počet instancí škálovací sady dotazovat prostřednictvím AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.

Horizontální navýšení kapacity

Pomocí fluent azure compute SDK je možné instance přidat 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(); 

Případně můžete 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.

Škálování v

Horizontální navýšení kapacity je podobné horizontálnímu navýšení kapacity. Skutečné změny škálovací sady virtuálních počítačů jsou prakticky stejné. Jak bylo ale popsáno dříve, Service Fabric automaticky vyčistí odebrané uzly s odolností gold nebo Silver. V případě škálování na bronzovou odolnost je tedy nutné s clusterem Service Fabric pracovat s ukončením uzlu, který se má odebrat, 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 deaktivace ho. Instance škálovací sady virtuálních počítačů jsou očíslovány v pořadí, v jakém se přidávají, takže novější uzly lze najít porovnáním přípony čísel v názvech uzlů (které odpovídají základním názvům instancí š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 se uzel odebere, můžete ho deaktivovat a odebrat pomocí stejné FabricClient instance a IAzure instance z dřívější verze.

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 můžete použít také rutiny PowerShellu pro úpravu kapacity škálovací sady virtuálních počítačů, pokud je vhodnější použít skriptovací přístup. 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: