Partilhar via


Falhas do Serviço de Integridade

Aplica-se a: Windows Server 2016

O que são falhas

O Serviço de Integridade monitora constantemente o cluster de Espaços de Armazenamento Diretos para detectar problemas e gerar "falhas". Um novo cmdlet exibe as falhas atuais, permitindo que você verifique facilmente a integridade da implantação sem ter que examinar cada entidade ou recurso. As falhas são projetadas para serem precisas, fáceis de entender e acionáveis.

Cada falha contém cinco campos importantes:

  • Severidade
  • Descrição do problema
  • Próximas etapas recomendadas para solucionar o problema
  • Informações de identificação para a entidade com falha
  • Sua localização física (se aplicável)

Por exemplo, aqui está uma falha típica:

Severity: MINOR
Reason: Connectivity has been lost to the physical disk.
Recommendation: Check that the physical disk is working and properly connected.
Part: Manufacturer Contoso, Model XYZ9000, Serial 123456789
Location: Seattle DC, Rack B07, Node 4, Slot 11

Observação

A localização física é derivada da configuração do domínio de falha. Para obter mais informações sobre domínios de falha, confira Domínios de falha no Windows Server 2016 Se você não fornecer essas informações, o campo local poderá ser menos útil (por exemplo, ele pode mostrar apenas o número de slot).

Análise da causa raiz

O Serviço de Integridade pode avaliar a potencial de causalidade entre entidades com falha para identificar e combinar falhas que são consequências do mesmo problema subjacente. Reconhecendo cadeias de efeito, isso gera relatórios menos longos. Por exemplo, se um servidor estiver inoperante, espera-se que as unidades dentro do servidor também fiquem sem conectividade. Portanto, apenas uma falha será gerada para a causa-raiz (nesse caso, o servidor).

Uso no PowerShell

Para ver as falhas atuais no PowerShell, execute este cmdlet:

Get-StorageSubSystem Cluster* | Debug-StorageSubSystem

Isso retorna qualquer falha que afeta o cluster geral de Espaços de Armazenamento Diretos. Em geral, essas falhas estão relacionadas a hardware ou configuração. Se não houver falha, este cmdlet não retornará nada.

Observação

Em um ambiente de não produção e por conta própria, você pode experimentar esse recurso disparando falhas por conta própria (por exemplo, removendo um disco físico ou desligando um nó). Quando ocorrer a falha, insira novamente o disco físico ou reinicie o nó e a falha desaparecerá novamente.

Você também pode exibir falhas que afetam somente determinados volumes ou compartilhamentos de arquivos com os seguintes cmdlets:

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

Get-FileShare -Name <Name> | Debug-FileShare

Isso retorna as falhas que afetam apenas o volume ou compartilhamento de arquivos específico. Em geral, essas falhas estão relacionadas ao planejamento da capacidade, à resiliência de dados ou a recursos como Qualidade de Serviço de Armazenamento ou Réplica de Armazenamento.

Uso em .NET e C#

Conectar

Para consultar o Serviço de Integridade, será necessário estabelecer uma CimSession com o cluster. Para fazer isso, serão necessárias algumas opções que só estarão disponíveis no .NET completo, isso significa que não será possível fazer isso facilmente direto de um aplicativo Web ou móvel. Esses exemplos de código usarão C#, a escolha mais direta para essa camada de acesso a dados.

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

O nome de usuário fornecido deverá ser um administrador local do computador de destino.

É recomendável que você construa a SecureString de Senha diretamente da entrada de usuário em tempo real para que a senha nunca seja armazenada na memória com texto não criptografado. Isso ajudará a mitigar uma variedade de problemas de segurança. Mas, na prática, construí-la conforme indicado acima é comum para fins de prototipagem.

Descobrir objetos

Com a CimSession estabelecida, você poderá consultar a WMI (Instrumentação de Gerenciamento do Windows) no cluster.

Antes de obter as Falhas ou Métricas, será necessário obter as instâncias de vários objetos relevantes. Primeiro, o MSFT_StorageSubSystem que representa os Espaços de Armazenamento Diretos no cluster. Usando isso, será possível obter cada MSFT_StorageNode no cluster e cada MSFT_Volume, os volumes de dados. Por fim, também será necessário o MSFT_StorageHealth, o próprio Serviço de Integridade.

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 MSFT_StorageHealth itself
    HealthService = Session.EnumerateAssociatedInstances(Cluster.CimSystemProperties.Namespace,
        Cluster, "MSFT_StorageSubSystemToStorageHealth", null, "StorageSubSystem", "StorageHealth").First();
}

Esses são os mesmos objetos que você obtém no PowerShell usando os cmdlets como Get-StorageSubSystem, Get-StorageNode e Get-Volume.

Você poderá acessar todas as mesmas propriedades, documentadas em Classes de API para Gerenciamento de Armazenamento.

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

Falhas de consulta

Invoque Diagnosticar para ver as falhas atuais que abrangem o CimInstance de destino, que é o cluster ou qualquer volume.

A lista completa de falhas disponíveis em cada escopo no Windows Server 2016 está documentada abaixo.

public void GetFaults(CimSession Session, CimInstance Target)
{
    // Set Parameters (None)
    CimMethodParametersCollection FaultsParams = new CimMethodParametersCollection();
    // Invoke API
    CimMethodResult Result = Session.InvokeMethod(Target, "Diagnose", FaultsParams);
    IEnumerable<CimInstance> DiagnoseResults = (IEnumerable<CimInstance>)Result.OutParameters["DiagnoseResults"].Value;
    // Unpack
    if (DiagnoseResults != null)
    {
        foreach (CimInstance DiagnoseResult in DiagnoseResults)
        {
            // TODO: Whatever you want!
        }
    }
}

Opcional: classe MyFault

Pode fazer sentido para você construir e persistir sua própria representação de falhas. Por exemplo, essa classe MyFault armazena várias propriedades principais de falhas, incluindo a FaultId, que pode ser usada posteriormente para associar notificações de atualização ou remoção ou para eliminar duplicação, caso a mesma falha seja detectada várias vezes, por qualquer motivo.

public class MyFault {
    public String FaultId { get; set; }
    public String Reason { get; set; }
    public String Severity { get; set; }
    public String Description { get; set; }
    public String Location { get; set; }

    // Constructor
    public MyFault(CimInstance DiagnoseResult)
    {
        CimKeyedCollection<CimProperty> Properties = DiagnoseResult.CimInstanceProperties;
        FaultId     = Properties["FaultId"                  ].Value.ToString();
        Reason      = Properties["Reason"                   ].Value.ToString();
        Severity    = Properties["PerceivedSeverity"        ].Value.ToString();
        Description = Properties["FaultingObjectDescription"].Value.ToString();
        Location    = Properties["FaultingObjectLocation"   ].Value.ToString();
    }
}
List<MyFault> Faults = new List<MyFault>;

foreach (CimInstance DiagnoseResult in DiagnoseResults)
{
    Faults.Add(new Fault(DiagnoseResult));
}

A lista completa de propriedades em cada falha (DiagnoseResult) está documentada abaixo.

Eventos de falha

Quando falhas são criadas, removidas ou atualizadas, o Serviço de Integridade gera eventos WMI. Eles são essenciais para manter o estado do aplicativo em sincronia sem sondagem frequente e podem ajudar em situações como determinar quando enviar alertas por email, por exemplo. Para assinar esses eventos, este código de exemplo usa o Padrão de Design do Observador novamente.

Primeiro, assine eventos MSFT_StorageFaultEvent.

public void ListenForFaultEvents()
{
    IObservable<CimSubscriptionResult> Events = Session.SubscribeAsync(
        @"root\microsoft\windows\storage", "WQL", "SELECT * FROM MSFT_StorageFaultEvent");
    // Subscribe the Observer
    FaultsObserver<CimSubscriptionResult> Observer = new FaultsObserver<CimSubscriptionResult>(this);
    IDisposable Disposeable = Events.Subscribe(Observer);
}

Em seguida, implemente um Observador cujo método OnNext() será invocado sempre que um novo evento for gerado.

Cada evento contém o ChangeType indicando se uma falha está sendo criada, removida ou atualizada e o FaultId relevante.

Além disso, eles contêm todas as propriedades da própria falha.

class FaultsObserver : IObserver
{
    public void OnNext(T Event)
    {
        // Cast
        CimSubscriptionResult SubscriptionResult = Event as CimSubscriptionResult;

        if (SubscriptionResult != null)
        {
            // Unpack
            CimKeyedCollection<CimProperty> Properties = SubscriptionResult.Instance.CimInstanceProperties;
            String ChangeType = Properties["ChangeType"].Value.ToString();
            String FaultId = Properties["FaultId"].Value.ToString();

            // Create
            if (ChangeType == "0")
            {
                Fault MyNewFault = new MyFault(SubscriptionResult.Instance);
                // TODO: Whatever you want!
            }
            // Remove
            if (ChangeType == "1")
            {
                // TODO: Use FaultId to find and delete whatever representation you have...
            }
            // Update
            if (ChangeType == "2")
            {
                // TODO: Use FaultId to find and modify whatever representation you have...
            }
        }
    }
    public void OnError(Exception e)
    {
        // Handle Exceptions
    }
    public void OnCompleted()
    {
        // Nothing
    }
}

Entender o ciclo de vida da falha

As falhas não devem ser marcadas como "vistas" ou resolvidas pelo usuário. Elas são criadas quando o Serviço de Integridade observa um problema e são removidas automaticamente e somente quando o Serviço de Integridade não pode mais observar o problema. Em geral, isso indica que o problema foi corrigido.

No entanto, em alguns casos, as falhas podem ser redescobertas pelo Serviço de Integridade (por exemplo, após o failover ou devido à conectividade intermitente etc.). Por esse motivo, pode fazer sentido persistir sua própria representação de falhas, para que você possa eliminar a duplicação facilmente. Isso é especialmente importante se você enviar alertas por email ou equivalentes.

Propriedades de falhas

Esta tabela apresenta várias propriedades principais do objeto de falha. Para obter o esquema completo, inspecione a classe MSFT_StorageDiagnoseResult em storagewmi.mof.

Propriedade Exemplo
FaultId {12345-12345-12345-12345-12345}
FaultType Microsoft.Health.FaultType.Volume.Capacity
Motivo "O volume está ficando sem espaço disponível."
PerceivedSeverity 5
FaultingObjectDescription Contoso XYZ9000 S.N. 123456789
FaultingObjectLocation Rack A06, RU 25, Slot 11
RecommendedActions {"Expand the volume.", "Migrate workloads to other volumes."}

FaultId Exclusivo dentro do escopo de um cluster.

PerceivedSeverity PerceivedSeverity = { 4, 5, 6 } = { "Informational", "Warning", and "Error" }, ou cores equivalentes, como azul, amarelo e vermelho.

FaultingObjectDescription Informações de peça para hardware, normalmente em branco para objetos de software.

FaultingObjectLocation Informações de local para hardware, normalmente em branco para objetos de software.

RecommendedActions Lista de ações recomendadas, que são independentes e não estão em uma ordem específica. Hoje, essa lista geralmente tem 1.

Propriedades de eventos de falha

Esta tabela apresenta várias propriedades principais do evento de falha. Para obter o esquema completo, inspecione a classe MSFT_StorageFaultEvent em storagewmi.mof.

Observe o ChangeType, que indica se uma falha está sendo criada, removida ou atualizada, e o FaultId. Um evento também contém todas as propriedades da falha afetada.

Propriedade Exemplo
ChangeType 0
FaultId {12345-12345-12345-12345-12345}
FaultType Microsoft.Health.FaultType.Volume.Capacity
Motivo "O volume está ficando sem espaço disponível."
PerceivedSeverity 5
FaultingObjectDescription Contoso XYZ9000 S.N. 123456789
FaultingObjectLocation Rack A06, RU 25, Slot 11
RecommendedActions {"Expand the volume.", "Migrate workloads to other volumes."}

ChangeType ChangeType = { 0, 1, 2 } = { "Create", "Remove", "Update" }.

Cobertura

No Windows Server 2016, o Serviço de Integridade fornece a seguinte cobertura de falha:

PhysicalDisk (8)

FaultType: Microsoft.Health.FaultType.PhysicalDisk.FailedMedia

  • Gravidade: Aviso
  • Motivo: "O disco físico falhou."
  • RecommendedAction: "Substitua o disco físico."

FaultType: Microsoft.Health.FaultType.PhysicalDisk.LostCommunication

  • Gravidade: Aviso
  • Motivo: "A conectividade foi perdida para o disco físico."
  • RecommendedAction: "Verifique se o disco físico está funcionando e se está conectado corretamente."

FaultType: Microsoft.Health.FaultType.PhysicalDisk.Unresponsive

  • Gravidade: Aviso
  • Motivo: "O disco físico não responde de forma recorrente."
  • RecommendedAction: "Substitua o disco físico."

FaultType: Microsoft.Health.FaultType.PhysicalDisk.PredictiveFailure

  • Gravidade: Aviso
  • Motivo: "Uma falha do disco físico deve ocorrer em breve."
  • RecommendedAction: "Substitua o disco físico."

FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnsupportedHardware

  • Gravidade: Aviso
  • Motivo: "O disco físico está em quarentena porque não tem suporte do fornecedor da solução."
  • RecommendedAction: "Substitua o disco físico por hardware com suporte."

FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnsupportedFirmware

  • Gravidade: Aviso
  • Motivo: "O disco físico está em quarentena porque sua versão de firmware não tem suporte do fornecedor da solução."
  • RecommendedAction: "Atualize o firmware no disco físico para a versão de destino."

FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnrecognizedMetadata

  • Gravidade: Aviso
  • Motivo: "O disco físico tem metadados não reconhecidos."
  • RecommendedAction: "Esse disco pode conter dados de um pool de armazenamento desconhecido. Primeiro, verifique se não há dados úteis nesse disco e, em seguida, redefina o disco."

FaultType: Microsoft.Health.FaultType.PhysicalDisk.FailedFirmwareUpdate

  • Gravidade: Aviso
  • Motivo: "Falha ao tentar atualizar o firmware no disco físico."
  • RecommendedAction: "Tente usar um binário de firmware diferente."

Disco Virtual (2)

FaultType: Microsoft.Health.FaultType.VirtualDisks.NeedsRepair

  • Severidade: Informational
  • Motivo: "Alguns dados nesse volume não são totalmente resilientes. Ele permanece acessível."
  • RecommendedAction: "Como restaurar a resiliência dos dados."

FaultType: Microsoft.Health.FaultType.VirtualDisks.Detached

  • Gravidade: crítica
  • Motivo: "O volume está inacessível. Alguns dados podem ser perdidos."
  • RecommendedAction: "Verifique a conectividade física e/ou de rede de todos os dispositivos de armazenamento. Talvez seja necessário restaurar do backup."

Capacidade do pool (1)

FaultType: Microsoft.Health.FaultType.StoragePool.InsufficientReserveCapacityFault

  • Gravidade: Aviso
  • Motivo: "O pool de armazenamento não tem a capacidade mínima de reserva recomendada. Isso pode limitar sua capacidade de restaurar a resiliência de dados em caso de falhas de unidade."
  • RecommendedAction: "Adicione mais capacidade ao pool de armazenamento ou libere a capacidade. A reserva mínima recomendada varia de acordo com a implantação, mas é de aproximadamente duas unidades de capacidade."

Capacidade do volume (2)1

FaultType: Microsoft.Health.FaultType.Volume.Capacity

  • Gravidade: Aviso
  • Motivo: "O volume está ficando sem espaço disponível."
  • RecommendedAction: "Expanda o volume ou migre as cargas de trabalho para outros volumes."

FaultType: Microsoft.Health.FaultType.Volume.Capacity

  • Gravidade: crítica
  • Motivo: "O volume está ficando sem espaço disponível."
  • RecommendedAction: "Expanda o volume ou migre as cargas de trabalho para outros volumes."

Servidor (3)

FaultType: Microsoft.Health.FaultType.Server.Down

  • Gravidade: crítica
  • Motivo: "Não é possível acessar o servidor."
  • RecommendedAction: "Inicie ou substitua o servidor."

FaultType: Microsoft.Health.FaultType.Server.Isolated

  • Gravidade: crítica
  • Motivo: "O servidor está isolado do cluster devido a problemas de conectividade."
  • RecommendedAction: "Se o isolamento persistir, verifique as redes ou migre as cargas de trabalho para outros nós."

FaultType: Microsoft.Health.FaultType.Server.Quarantined

  • Gravidade: crítica
  • Motivo: "O servidor está em quarentena pelo cluster devido a falhas recorrentes."
  • RecommendedAction: "Substitua o servidor ou corrija a rede."

Cluster (1)

FaultType: Microsoft.Health.FaultType.ClusterQuorumWitness.Error

  • Gravidade: crítica
  • Motivo: "Basta um falha do servidor para que o cluster fique inoperante."
  • RecommendedAction: "Verifique o recurso testemunha e reinicie conforme necessário. Inicie ou substitua os servidores com falha."

Adaptador de rede (4)

FaultType: Microsoft.Health.FaultType.NetworkAdapter.Disconnected

  • Gravidade: Aviso
  • Motivo: "O adaptador de rede foi desconectado."
  • RecommendedAction: "Reconecte o cabo de rede."

FaultType: Microsoft.Health.FaultType.NetworkInterface.Missing

  • Gravidade: Aviso
  • Motivo: "O servidor {server} não tem adaptadores de rede ausentes conectados à rede de cluster {rede de cluster}."
  • RecommendedAction: "Conecte o servidor à rede de cluster ausente."

FaultType: Microsoft.Health.FaultType.NetworkAdapter.Hardware

  • Gravidade: Aviso
  • Motivo: "O adaptador de rede teve uma falha de hardware."
  • RecommendedAction: "Substitua o adaptador de adaptador de rede."

FaultType: Microsoft.Health.FaultType.NetworkAdapter.Disabled

  • Gravidade: Aviso
  • Motivo: "O adaptador de rede {network interface} não está habilitado e não está sendo usado."
  • RecommendedAction: "Habilite o adaptador de rede."

Compartimento (6)

FaultType: Microsoft.Health.FaultType.StorageEnclosure.LostCommunication

  • Gravidade: Aviso
  • Motivo: "A comunicação foi perdida para o compartimento de armazenamento."
  • RecommendedAction: "Inicie ou substitua o compartimento de armazenamento."

FaultType: Microsoft.Health.FaultType.StorageEnclosure.FanError

  • Gravidade: Aviso
  • Motivo: "A ventoinha na posição {position} do compartimento de armazenamento falhou."
  • RecommendedAction: "Substitua a ventoinha no compartimento de armazenamento."

FaultType: Microsoft.Health.FaultType.StorageEnclosure.CurrentSensorError

  • Gravidade: Aviso
  • Motivo: "O sensor de corrente na posição {position} do compartimento de armazenamento falhou."
  • RecommendedAction: "Substitua um sensor de corrente no compartimento de armazenamento."

FaultType: Microsoft.Health.FaultType.StorageEnclosure.VoltageSensorError

  • Gravidade: Aviso
  • Motivo: "O sensor de tensão na posição {position} do compartimento de armazenamento falhou."
  • RecommendedAction: "Substitua um sensor de tensão no compartimento de armazenamento."

FaultType: Microsoft.Health.FaultType.StorageEnclosure.IoControllerError

  • Gravidade: Aviso
  • Motivo: "O controlador na posição {position} do compartimento de armazenamento falhou."
  • RecommendedAction: "Substitua um controlador de E/S no compartimento de armazenamento."

FaultType: Microsoft.Health.FaultType.StorageEnclosure.TemperatureSensorError

  • Gravidade: Aviso
  • Motivo: "O sensor de temperatura na posição {position} do compartimento de armazenamento falhou."
  • RecommendedAction: "Substitua um sensor de temperatura no compartimento de armazenamento."

Distribuição de firmware (3)

FaultType: Microsoft.Health.FaultType.FaultDomain.FailedMaintenanceMode

  • Gravidade: Aviso
  • Motivo: "Atualmente, não é possível fazer progresso ao executar a distribuição de firmware."
  • RecommendedAction: "Verifique se todos os espaços de armazenamento estão íntegros e se não há domínio de falha no modo de manutenção no momento."

FaultType: Microsoft.Health.FaultType.FaultDomain.FirmwareVerifyVersionFaile

  • Gravidade: Aviso
  • Motivo: "A distribuição de firmware foi cancelada devido a informações de versão de firmware ilegíveis ou inesperadas, depois de aplicar uma atualização de firmware."
  • RecommendedAction: "Reinicie a implantação do firmware depois que o problema do firmware for resolvido."

FaultType: Microsoft.Health.FaultType.FaultDomain.TooManyFailedUpdates

  • Gravidade: Aviso
  • Motivo: "A distribuição de firmware foi cancelada porque muitos discos físicos estão falhando em uma tentativa de atualização de firmware."
  • RecommendedAction: "Reinicie a implantação do firmware depois que o problema do firmware for resolvido."

QoS de armazenamento (3)2

FaultType: Microsoft.Health.FaultType.StorQos.InsufficientThroughput

  • Gravidade: Aviso
  • Motivo: "A taxa de transferência de armazenamento é insuficiente para atender às reservas."
  • RecommendedAction: "Reconfigure as políticas de QoS de armazenamento."

FaultType: Microsoft.Health.FaultType.StorQos.LostCommunication

  • Gravidade: Aviso
  • Motivo: "O gerenciador de políticas de QoS de armazenamento perdeu a comunicação com o volume."
  • RecommendedAction: "Reinicialize os nós {nodes}"

FaultType: Microsoft.Health.FaultType.StorQos.MisconfiguredFlow

  • Gravidade: Aviso
  • Motivo: "Um ou mais consumidores de armazenamento (geralmente Máquinas Virtuais) estão usando uma política inexistente com a ID {id}."
  • RecommendedAction: "Recrie as políticas de QoS de armazenamento ausentes."

1 Indica que o volume está 80% cheio (gravidade baixa) ou 90% cheio (gravidade alta). 2 Indica que alguns .vhd(s) no volume não atenderam à IOPS Mínima para acima de 10% (baixa), 30% (alta) ou 50% (crítica) para a janela de 24 horas ininterruptas.

Observação

A integridade dos componentes do compartimento de armazenamento, como sensores, fontes de alimentação e ventiladores, é derivada de SES (Serviços de Compartimento) SCSI. Se o fornecedor não lhe der essas informações, o Serviço de Integridade não poderá exibi-las.

Referências adicionais