Delen via


Prestatiegeschiedenis van cluster ophalen

Van toepassing op: Azure Local 2311.2 en hoger; Windows Server 2022, Windows Server 2019

Health Service vermindert het werk dat nodig is om liveprestaties en capaciteitsgegevens op te halen uit uw Opslagruimten Direct-cluster. Eén cmdlet biedt een gecureerde lijst met essentiële metrische gegevens, die efficiënt en dynamisch worden verzameld over knooppunten, met ingebouwde logica voor het detecteren van clusterlidmaatschap. Alle waarden zijn uitsluitend realtime en tijdgebonden.

Gebruik in PowerShell

Gebruik de volgende cmdlet om metrische gegevens op te halen voor het hele Opslagruimten Direct-cluster:

Get-ClusterPerformanceHistory

Tip

Gebruik de Alias Get-ClusterPerf om toetsaanslagen op te slaan.

U kunt ook metrische gegevens ophalen voor één specifiek volume of een specifieke server:

Get-Volume -FileSystemLabel <Label> | Get-ClusterPerformanceHistory

Get-StorageNode -Name <Name> | Get-ClusterPerformanceHistory

Gebruik in .NET en C#

In deze secties ziet u hoe u verbinding maakt met health service, objecten detecteert en een waarnemer implementeert om metrische gegevens te streamen.

Verbinden

Als u een query wilt uitvoeren op health service, brengt u een CimSession met het cluster tot stand. Hiervoor hebt u enkele dingen nodig die alleen beschikbaar zijn in volledig Microsoft .NET, wat betekent dat u dit niet rechtstreeks vanuit een web- of mobiele app kunt doen. De codevoorbeelden in deze sectie maken gebruik van C#, de eenvoudigste keuze voor deze gegevenstoegangslaag.

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;
}

De opgegeven gebruikersnaam moet een lokale beheerder van de doelcomputer zijn.

U wordt aangeraden om het wachtwoord securestring rechtstreeks vanuit gebruikersinvoer in realtime samen te stellen, zodat het wachtwoord nooit in duidelijke tekst in het geheugen wordt opgeslagen. Dit helpt bij het beperken van verschillende beveiligingsproblemen. Maar in de praktijk is het bouwen zoals hierboven gebruikelijk voor prototypedoeleinden.

Objecten detecteren

Als de CimSession tot stand is gebracht, kunt u een query uitvoeren op Windows Management Instrumentation (WMI) op het cluster.

Voordat u fouten of metrische gegevens kunt ophalen, moet u instanties van verschillende relevante objecten ophalen. Haal eerst de MSFT_StorageSubSystem op die Opslagruimten Direct op het cluster vertegenwoordigt. Hiermee kunt u elke MSFT_StorageNode in het cluster en elke MSFT_Volume van de gegevensvolumes ophalen. Ten slotte moet u de MSCluster_ClusterHealthService, de Health Service zelf, ophalen.

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

Dit zijn dezelfde objecten die u in PowerShell krijgt met behulp van cmdlets zoals Get-StorageSubSystem, Get-StorageNode en Get-Volume.

U hebt toegang tot dezelfde eigenschappen, gedocumenteerd in Storage Management API-klassen.

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

Roep GetMetric aan om voorbeelden te streamen van een door experts samengestelde lijst met essentiële metrische gegevens op basis van opgegeven metrische namen van de parameter MetricName , die efficiënt en dynamisch worden verzameld op verschillende knooppunten, met ingebouwde logica om clusterlidmaatschap te detecteren. Voorbeelden komen binnen op basis van het opgegeven tijdsbestek van de parameter StreamName .

Zie prestatiegeschiedenis voor Opslagruimten Direct voor de volledige lijst met beschikbare metrische gegevens.

IObserver.OnNext()

In deze voorbeeldcode wordt het waarnemersontwerppatroon gebruikt om een waarnemer te implementeren waarvan de OnNext() -methode wordt aangeroepen wanneer elk nieuw voorbeeld van metrische gegevens binnenkomt. De onCompleted() -methode wordt aangeroepen als/wanneer streaming eindigt. U kunt het bijvoorbeeld gebruiken om streaming opnieuw te starten, zodat het voor onbepaalde tijd doorgaat.

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
    }
}

Streaming starten

Als de waarnemer is gedefinieerd, kunt u beginnen met streamen.

Geef de doel-CimInstance op waarnaar u de metrische gegevens wilt bepalen. Dit kan het cluster, elk knooppunt of elk volume zijn.

De tellingsparameter is het aantal voorbeelden voordat streaming eindigt.

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

Deze metrische gegevens kunnen worden gevisualiseerd, opgeslagen in een database of op elke gewenste manier worden gebruikt.

Aanvullende naslaginformatie