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ů:
- Přihlaste se k Azure CLI (
az login
) jako uživatel s přístupem ke škálovací sadě virtuálních počítačů. - Vytvoření instančního objektu pomocí
az ad sp create-for-rbac
- Poznamenejte si appId (jinde označované jako ID klienta), jméno, heslo a tenanta pro pozdější použití.
- 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:
- Ruční škálování nebo pravidla automatického škálování
- Knihovny pro správu Azure pro .NET (užitečné pro interakci se základními škálovacími sadami virtuálních počítačů clusteru Service Fabric)
- System.Fabric.FabricClient (užitečné pro interakci s clusterem Service Fabric a jeho uzly)