적용 대상: Azure Local 2311.2 이상; Windows Server 2022, Windows Server 2019
이 문서에서는 Azure 로컬 및 Windows Server의 Health Service 오류에 대한 자세한 정보를 제공합니다.
건강 서비스 문제 정보
상태 관리 서비스는 저장소 공간 Direct 클러스터를 지속적으로 모니터링하여 문제를 감지하고 "오류"를 생성합니다. 하나의 cmdlet은 모든 현재 오류를 표시하므로, 모든 항목이나 기능을 일일이 확인하지 않고도 배포 상태를 쉽게 확인할 수 있습니다. 오류는 정확하고, 이해하기 쉽고, 조치 가능하도록 설계되었습니다.
각 오류에는 5개의 중요한 필드가 포함됩니다.
- 심각도
- 문제에 대한 설명
- 문제 해결을 위한 권장되는 다음 단계
- 오류를 일으킨 엔터티의 식별 정보
- 물리적 위치(해당되는 경우)
예를 들어 다음은 일반적인 오류입니다.
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
참고
물리적 위치는 장애 도메인 구성에서 파생됩니다. 장애 도메인에 대한 자세한 내용은 장애 도메인 인식을 참조 하세요. 이 정보를 제공하지 않으면 위치 필드가 덜 유용합니다. 예를 들어 슬롯 번호만 표시할 수 있습니다.
오류에 대한 참조 정보는 헬스 서비스 오류 참조에서 확인하세요.
근본 원인 분석
보건 서비스는 결함이 있는 엔터티 간의 잠재적 인과 관계를 평가하여 동일한 기본 문제의 결과인 오류를 식별하고 결합할 수 있습니다. 효과 체인을 인식하면 보고가 간결해집니다. 예를 들어 서버가 다운된 경우 서버 내의 모든 드라이브도 연결되지 않은 것으로 예상됩니다. 따라서 하나의 오류만 근본 원인(이 경우 서버)으로 제기됩니다.
PowerShell의 사용량
PowerShell에서 현재 오류를 보려면 다음 cmdlet을 실행합니다.
Get-HealthFault
이렇게 하면 전체 저장소 공간 Direct 클러스터에 영향을 주는 모든 오류가 반환됩니다. 대부분의 경우 이러한 오류는 하드웨어 또는 구성과 관련이 있습니다. 오류가 없으면 cmdlet은 아무 것도 반환하지 않습니다.
참고
비프로덕션 환경 및 사용자 고유의 위험에서 직접 오류를 트리거하여 이 기능을 실험할 수 있습니다. 예를 들어 하나의 실제 디스크를 제거하거나 하나의 노드를 종료하여 이 작업을 수행할 수 있습니다. 오류가 나타나면 실제 디스크를 다시 삽입하거나 노드를 다시 시작하여 오류가 사라지도록 합니다.
.NET 및 C#의 사용량
이 섹션에서는 헬스 서비스에 연결하고, 검색 개체를 사용하며, 오류 쿼리를 실행하는 방법을 보여 줍니다.
연결
건강 서비스를 쿼리하기 위해 클러스터와 함께 CimSession을 설정합니다. 이렇게 하려면 전체 Microsoft .NET에서만 사용할 수 있는 몇 가지 항목이 필요합니다. 즉, 웹 또는 모바일 앱에서 직접 이 작업을 수행할 수 없습니다. 이 섹션의 코드 샘플은 이 데이터 액세스 계층에서 가장 간단한 선택인 C#을 사용합니다.
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;
}
제공된 사용자 이름은 대상 컴퓨터의 로컬 관리자여야 합니다.
암호 가 일반 텍스트로 메모리에 저장되지 않도록 사용자 입력에서 직접 암호 SecureString 을 실시간으로 생성하는 것이 좋습니다. 이렇게 하면 다양한 보안 문제를 완화할 수 있습니다. 그러나 실제로 위와 같이 생성하는 것은 프로토타입 제작 목적으로 일반적입니다.
개체 검색
CimSession이 설정되면 클러스터에서 WMI(Windows Management Instrumentation)를 쿼리할 수 있습니다.
오류 또는 메트릭을 가져오기 전에 여러 관련 개체의 인스턴스를 가져와야 합니다. 먼저 클러스터에서 Storage Spaces Direct를 나타내는 MSFT_StorageSubSystem을 가져옵니다. 이를 사용하여 클러스터의 모든 MSFT_StorageNode 데이터 볼륨의 모든 MSFT_Volume 가져올 수 있습니다. 마지막으로 MSCluster_ClusterHealthService, 즉 상태 관리 서비스 자체를 가져와야 합니다.
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();
}
Get-StorageSubSystem, Get-StorageNode, and Get-Volume과 같은 cmdlet을 사용하여 PowerShell에서 가져오는 것과 동일한 개체입니다.
스토리지 관리 API 클래스에 설명된 모든 동일한 속성에 액세스할 수 있습니다.
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());
}
쿼리 오류
진단을 호출하여 클러스터 또는 볼륨일 수 있는 대상 CimInstance에 범위가 지정된 현재의 오류를 가져옵니다.
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!
}
}
}
선택 사항: MyFault 클래스
오류의 고유한 표현을 구성하고 유지하는 것이 합리적일 수 있습니다. 예를 들어 MyFault 클래스는 나중에 업데이트를 연결하거나, 알림을 제거하거나, 동일한 오류가 여러 번 검색되는 경우 중복 제거에 사용할 수 있는 FaultId를 포함하여 오류의 몇 가지 주요 속성을 저장합니다.
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));
}
각 오류의 전체 속성 목록(DiagnoseResult)은 오류 속성 섹션의 뒷부분에 설명되어 있습니다.
오류 이벤트
오류가 생성, 제거 또는 업데이트되면 헬스 서비스가 WMI 이벤트를 생성합니다. 이는 자주 폴링하지 않고 애플리케이션 상태를 동기화 상태로 유지하는 데 필수적이며, 예를 들어 이메일 경고를 보낼 시기를 결정하는 것과 같은 작업에 도움이 될 수 있습니다. 이러한 이벤트를 구독하기 위해 다음 샘플 코드는 관찰자 디자인 패턴을 사용합니다.
먼저 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);
}
다음으로, 새 이벤트가 생성될 때마다 OnNext() 메서드가 호출되는 Observer를 구현합니다.
각 이벤트에는 오류가 생성, 제거 또는 업데이트되었는지 여부와 관련 FaultId를 나타내는 ChangeType이 포함됩니다.
또한 각 이벤트에는 오류 자체의 모든 속성이 포함됩니다.
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
}
}
오류 수명 주기 이해
오류는 사용자가 '표시됨'으로 표시하거나 해결하도록 의도된 것이 아닙니다. 상태 관리 서비스 문제를 관찰할 때 생성되며 상태 관리 서비스 더 이상 문제를 관찰할 수 없는 경우에만 자동으로 제거됩니다. 일반적으로 문제가 해결되었음을 반영합니다.
그러나 경우에 따라 장애 조치(failover) 후, 간헐적 연결 등과 같이 보건 서비스에서 오류를 다시 발견할 수 있습니다. 이러한 이유로, 쉽게 중복 제거 할 수 있도록 오류의 자신의 표현을 유지하는 것이 합리적 일 수있다. 이는 전자 메일 경고 또는 이와 동등한 메시지를 보내는 경우에 특히 중요합니다.
오류 속성
다음 표에서는 오류 개체의 몇 가지 주요 속성을 제공합니다. 전체 스키마의 경우 storagewmi.mof에서 MSFT_StorageDiagnoseResult 클래스를 검사합니다.
| 속성 | 예제 |
|---|---|
| 결함 ID | {12345-12345-12345-12345-12345} |
| 결함 유형 | Microsoft.Health.FaultType.볼륨.용량 |
| 원인 | 볼륨에 사용 가능한 공간이 부족합니다. |
| 인지된 심각성 | 5 |
| 오류 객체 설명 | Contoso XYZ9000 S.N. 123456789 |
| 오류 객체 위치 | Rack A06, RU 25, 슬롯 11 |
| 권장 조치 | {"볼륨을 확장합니다.", "워크로드를 다른 볼륨으로 마이그레이션합니다."} |
FaultId: 한 클러스터 범위 내의 고유 ID입니다.
PerceivedSeverity: PerceivedSeverity = { 4, 5, 6 } = { "정보", "경고", "오류" }, 또는 동등한 색상인 파란색, 노란색, 빨간색으로 표현될 수 있습니다.
FaultingObjectDescription: 하드웨어에 대한 파트 정보로, 일반적으로 소프트웨어 개체의 경우 비어 있습니다.
FaultingObjectLocation: 하드웨어에 대한 위치 정보로, 일반적으로 소프트웨어 개체의 경우 비어 있습니다.
RecommendedActions: 독립적이고 특정 순서가 없는 권장 작업 목록입니다. 현재 이 목록은 길이가 1인 경우가 많습니다.
오류 이벤트 속성
다음 표에서는 오류 이벤트의 몇 가지 주요 속성을 제공합니다. 전체 스키마의 경우 storagewmi.mof에서 MSFT_StorageFaultEvent 클래스를 검사합니다.
오류가 생성, 제거 또는 업데이트되는지 여부와 FaultId를 나타내는 ChangeType을 확인합니다. 이벤트에는 영향을 받는 오류의 모든 속성도 포함됩니다.
| 속성 | 예제 |
|---|---|
| 변경 유형 | 0 |
| 결함 ID | {12345-12345-12345-12345-12345} |
| 결함 유형 | Microsoft.Health.FaultType.볼륨.용량 |
| 원인 | 볼륨에 사용 가능한 공간이 부족합니다. |
| 인지된 심각성 | 5 |
| 오류 객체 설명 | Contoso XYZ9000 S.N. 123456789 |
| 오류 객체 위치 | Rack A06, RU 25, 슬롯 11 |
| 권장 조치 | {"볼륨을 확장합니다.", "워크로드를 다른 볼륨으로 마이그레이션합니다."} |
ChangeType: ChangeType = { 0, 1, 2 } = { "Create", "Remove", "Update" }.
의료 서비스 결함 참조
Azure 로컬 및 Windows Server의 Health Service는 스토리지, 네트워킹 및 컴퓨팅 리소스를 비롯한 다양한 시스템 구성 요소에서 오류를 감지할 수 있습니다.
오류 심각도 매핑, 상태 설정(데이터 형식, 오류 연결, 기본값 및 설명) 및 수집된 메트릭 목록을 비롯한 상태 오류에 대한 자세한 개요를 보려면 상태 서비스 오류 스프레드시트를 다운로드합니다.
건강 서비스 오류에 관한 고려할 사항:
일부 오류는 기본적으로 비활성화되어 있습니다. 오류를 활성화하려면 해당 건강 설정을 true로 설정하세요. 예를 들어 오류 유형
Microsoft.Health.FaultType.PhysicalDisk.HighLatency.AverageIO은 기본적으로 사용하지 않도록 설정됩니다. 이를 사용하도록 설정하려면 상태 설정을System.Storage.PhysicalDisk.HighLatency.Threshold.Tail.Enabledtrue로 설정합니다.팬, 전원 공급 장치 및 센서와 같은 스토리지 인클로저 구성 요소의 상태는 SES(SCSI 인클로저 서비스)에서 파생됩니다. 공급업체에서 이 정보를 제공하지 않으면 Health Service에서 표시할 수 없습니다.