Získání historie výkonu clusteru
Platí pro: Azure Stack HCI verze 23H2 a 22H2; Windows Server 2022, Windows Server 2019
Služba Health Service snižuje množství práce potřebné k získání informací o živém výkonu a kapacitě z clusteru Prostory úložiště s přímým přístupem. Jedna rutina poskytuje kurátorovaný seznam základních metrik, které se efektivně shromažďují a dynamicky agregují napříč uzly, s integrovanou logikou pro detekci členství v clusteru. Všechny hodnoty jsou poskytované v reálném čase a platí jen pro daný okamžik.
Použití v PowerShellu
Pomocí následující rutiny získáte metriky pro celý cluster Prostory úložiště s přímým přístupem:
Get-ClusterPerformanceHistory
Tip
Pomocí aliasu Get-ClusterPerf uložte některé stisknutí kláves.
Můžete také získat metriky pro jeden konkrétní svazek nebo server:
Get-Volume -FileSystemLabel <Label> | Get-ClusterPerformanceHistory
Get-StorageNode -Name <Name> | Get-ClusterPerformanceHistory
Využití v .NET a C#
V těchto částech se dozvíte, jak se připojit ke službě Health Service, jak používat zjišťovací objekty a implementovat pozorovatele pro zahájení streamování metrik.
Připojit
Pokud chcete dotazovat službu Health Service, vytvoříte s clusterem cimsession . K tomu potřebujete některé věci, které jsou dostupné jenom v plné verzi microsoft .NET, což znamená, že to nemůžete snadno udělat přímo z webu nebo mobilní aplikace. Ukázky kódu v této části používají C#, což je nejjednodušší volba pro tuto vrstvu přístupu k datům.
using System.Security;
using Microsoft.Management.Infrastructure;
public CimSession Connect(string Domain = "...", string Computer = "...", string Username = "...", string Password = "...")
{
SecureString PasswordSecureString = new SecureString();
foreach (char c in Password)
{
PasswordSecureString.AppendChar(c);
}
CimCredential Credentials = new CimCredential(
PasswordAuthenticationMechanism.Default, Domain, Username, PasswordSecureString);
WSManSessionOptions SessionOptions = new WSManSessionOptions();
SessionOptions.AddDestinationCredentials(Credentials);
Session = CimSession.Create(Computer, SessionOptions);
return Session;
}
Zadané uživatelské jméno by mělo být místním správcem cílového počítače.
Doporučujeme vytvořit securestring hesla přímo ze vstupu uživatele v reálném čase, aby se heslo nikdy neukládaly v paměti jako nešifrovaný text. To pomáhá zmírnit různé aspekty zabezpečení. Ale v praxi je jeho vytvoření tak, jak je uvedeno výše, běžné pro účely vytváření prototypů.
Zjišťování objektů
Po vytvoření cimsession můžete dotazovat rozhraní WMI (Windows Management Instrumentation) v clusteru.
Než budete moct získat chyby nebo metriky, musíte získat instance několika relevantních objektů. Nejprve získejte MSFT_StorageSubSystem, který představuje Prostory úložiště s přímým přístupem v clusteru. Díky tomu můžete získat každou MSFT_StorageNode v clusteru a každou MSFT_Volume datových svazků. Nakonec potřebujete získat MSCluster_ClusterHealthService, tedy samotnou službu Health Service.
CimInstance Cluster;
List<CimInstance> Nodes;
List<CimInstance> Volumes;
CimInstance HealthService;
public void DiscoverObjects(CimSession Session)
{
// Get MSFT_StorageSubSystem for Storage Spaces Direct
Cluster = Session.QueryInstances(@"root\microsoft\windows\storage", "WQL", "SELECT * FROM MSFT_StorageSubSystem")
.First(Instance => (Instance.CimInstanceProperties["FriendlyName"].Value.ToString()).Contains("Cluster"));
// Get MSFT_StorageNode for each cluster node
Nodes = Session.EnumerateAssociatedInstances(Cluster.CimSystemProperties.Namespace,
Cluster, "MSFT_StorageSubSystemToStorageNode", null, "StorageSubSystem", "StorageNode").ToList();
// Get MSFT_Volumes for each data volume
Volumes = Session.EnumerateAssociatedInstances(Cluster.CimSystemProperties.Namespace,
Cluster, "MSFT_StorageSubSystemToVolume", null, "StorageSubSystem", "Volume").ToList();
// Get MSCluster_ClusterHealthService itself
HealthService = session.QueryInstances(@"root\MSCluster", "WQL", "SELECT * FROM MSCluster_ClusterHealthService").First();
}
Jedná se o stejné objekty, které získáte v PowerShellu pomocí rutin, jako jsou Get-StorageSubSystem, Get-StorageNode a Get-Volume.
Můžete přistupovat ke stejným vlastnostem, které jsou popsané v tématu Třídy rozhraní API pro správu úložiště.
using System.Diagnostics;
foreach (CimInstance Node in Nodes)
{
// For illustration, write each node's Name to the console. You could also write State (up/down), or anything else!
Debug.WriteLine("Discovered Node " + Node.CimInstanceProperties["Name"].Value.ToString());
}
Vyvolejte GetMetric a začněte streamovat vzorky odborníkem kurátorovaného seznamu základních metrik na základě zadaných názvů metrik z parametru MetricName , které se shromažďují efektivně a dynamicky agregují napříč uzly, s integrovanou logikou pro detekci členství v clusteru. Ukázky přicházejí na základě zadaného časového rámce z parametru StreamName .
Úplný seznam dostupných metrik najdete v tématu Historie výkonu pro Prostory úložiště s přímým přístupem.
IObserver.OnNext()
Tento vzorový kód používá vzor návrhu pozorovatele k implementaci pozorovatele, jehož metoda OnNext() je vyvolána při příchodu každého nového vzorku metrik. Jeho metoda OnCompleted() se volá, když/když skončí streamování. Můžete ho například použít k opětovnému zciťování streamování, aby pokračovalo po neomezenou dobu.
class MetricsObserver<T> : IObserver<T>
{
public void OnNext(T Result)
{
// Cast
CimMethodStreamedResult StreamedResult = Result as CimMethodStreamedResult;
if (StreamedResult != null)
{
CimInstance Metric = (CimInstance)StreamedResult.ItemValue;
Console.WriteLine("MetricName: " + Metric.CimInstanceProperties["MetricId"].Value);
IEnumerable<CimInstance> Records = (IEnumerable<CimInstance>)Metric.CimInstanceProperties["Records"].Value;
foreach (CimInstance Record in Records)
{
// Each Record has "TimeStamp" and "Value. For Illustration, just print the metric"
Console.WriteLine(record.CimInstanceProperties["TimeStamp"] + ": " + record.CimInstanceProperties["Value"]);
}
// TODO: Whatever you want!
}
}
public void OnError(Exception e)
{
// Handle Exceptions
}
public void OnCompleted()
{
// Reinvoke BeginStreamingMetrics(), defined in the next section
}
}
Zahájení streamování
S definovaným pozorovatelem můžete zahájit streamování.
Zadejte cíl CimInstance , na který chcete nastavit rozsah metrik. Může to být cluster, libovolný uzel nebo libovolný svazek.
Parametr count je počet ukázek před ukončením streamování.
CimInstance Target = Cluster; // From among the objects discovered in DiscoverObjects()
public void BeginStreamingMetrics(CimSession Session, CimInstance HealthService, CimInstance Target)
{
// Set Parameters
CimMethodParametersCollection MetricsParams = new CimMethodParametersCollection();
string[] metricNames = new string[] { "ClusterNode.Cpu.Usage,ClusterNode=RRN44-13-01", "ClusterNode.Cpu.Usage.Host,ClusterNode=RRN44-13-01" };
MetricsParams.Add(CimMethodParameter.Create("MetricName", metricNames, CimType.StringArray, CimFlags.In));
MetricsParams.Add(CimMethodParameter.Create("StreamName", "LastHour", CimType.String, CimFlags.In));
// Enable WMI Streaming
CimOperationOptions Options = new CimOperationOptions();
Options.EnableMethodResultStreaming = true;
// Invoke API
CimAsyncMultipleResults<CimMethodResultBase> InvokeHandler;
InvokeHandler = Session.InvokeMethodAsync(
HealthService.CimSystemProperties.Namespace, HealthService, "GetMetric", MetricsParams, Options
);
// Subscribe the Observer
MetricsObserver<CimMethodResultBase> Observer = new MetricsObserver<CimMethodResultBase>(this);
IDisposable Disposeable = InvokeHandler.Subscribe(Observer);
}
Tyto metriky můžete vizualizovat, ukládat do databáze nebo je používat jakýmkoli způsobem, který vám vyhovuje.