Get-ClusterLog и поиск ошибок в Failover Clusters

Обновлено 17.02.2022

Failover Clusters

Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов в рунете Pyatilistnik.org. В прошлый раз мы с вами разобрали установку NuGet в Windows, и рассмотрели как его можно использовать. В сегодняшней публикации я с вами поделюсь практическим опытом по поиску ошибок на отказоустойчивом кластере Windows. Покажу, где удобнее смотреть логи событий, как их фильтровать и многое другое, мы познакомимся с новым командлетом Get-ClusterLog, о котором я еще вам не рассказывал.

Как удобно искать ошибки на Failover Clusters

Недавно у меня была ошибка на кластере SQL Server, где произошла перезагрузка инстансов на одном из узлом. Первым делом я стал изучать логи Windows, но оказалось. В логах я обнаруживал такие события:

SQL Server has encountered 1 occurrence(s) of I/O requests taking longer than 15 seconds to complete on file [J:\MountPoints\DB_Data_2\DB\Name.mdf] in database id 23. The OS file handle is 0x0000000000002240. The offset of the latest long I/O is: 0x0000b26e132000

The IO operation at logical block address 0xb3c0cc00 for Disk 34 (PDO name: \Device\000000a4) was retried.

A component on the server did not respond in a timely fashion. This caused the cluster resource 'SQL Server (Name)' (resource type 'SQL Server', DLL 'sqsrvres.dll') to exceed its time-out threshold. As part of cluster health detection, recovery actions will be taken. The cluster will try to automatically recover by terminating and restarting the Resource Hosting Subsystem (RHS) process that is running this resource. Verify that the underlying infrastructure (such as storage, networking, or services) that are associated with the resource are functioning correctly.

Event ID 1230

Так же я понял, что искать в просмотре событий логи относящиеся непосредственно к самому кластеру не очень удобно. Сама оснастка Failover Clusters так же не была информативной, поэтому я в очередной решил воспользоваться командлетами PowerShell, а именно Get-Clusterlog.

Что такое Get-Clusterlog?

Командлет Get-Clusterlog — это быстрый и удобный способ получить информацию из кластера Windows. Этот командлет создаст текстовый файл журнала для всех узлов или определенного узла (если он указан) в отказоустойчивом кластере. Вы даже можете использовать командлет, чтобы указать определенный промежуток времени, например, последние 15 минут, что может быть очень удобно, если вы знаете, что проблема возникла в этот период времени.

Откройте на одном из узлов кластера оболочку PowerShell от имени администратора, и введите:

Get-ClusterLog

Get-ClusterLog

Команда по умолчанию cгенерирует файл Cluster.log на ВСЕХ узлах в папке C:\Windows\Cluster\Reports. Имя файла будет Cluster.log. Обратите внимание, что файл лога может быть весьма внушительный по размеру.

Запуск Get-ClusterLog

Если вы хотите сохранить файл в нужное место, то нужно воспользоваться параметром –Destination, команда будет выглядеть вот так:

Get-ClusterLog –Destination "C:\Temp"

Get-ClusterLog сохранение логов в нужную папку

если вы хотите, чтобы журнал кластера генерировался для определенных узлов, мы можем использовать параметр –Node. Мы можем поместить имена узлов, разделенные запятыми, как показано ниже.

Get-ClusterLog -Node имя сервера -Destination "C:\Temp"

Get-ClusterLog журнал кластера генерировался для определенных узлов

По умолчанию в журнале кластера отображается время в формате UTC. Иногда бывает сложно перевести время UTC на местное время, особенно для часовых поясов, в которых действует переход на летнее время. К счастью, журнал кластера можно сгенерировать по локальному времени с помощью параметра UseLocalTime. Вот пример кода.

Get-ClusterLog –UseLocalTime –Destination "C:\Temp"

Get-ClusterLog –UseLocalTime

Давайте теперь получим логи за последние 60 минут. Для этого есть параметр TimeSpan. Выполните команду:

Get-ClusterLog –TimeSpan 60 –UseLocalTime –Destination "C:\Temp"

Использование Get-ClusterLog –TimeSpan

Так как полученные файлы с событиями Failover Clusters могут достигать гигабайта и более, то их сложно изучать, для этого вы можете использовать, например LogParser или Configuration Manager Trace Log Tool, или же можно воспользоваться простейшим скриптом на PowerShell. Вот простой скрипт, который перебирает папку с файлами журнала кластера и извлекает любую строку, содержащую шаблон "ERR", в другой файл. Обратите внимание, что в начале и в конце шаблона есть пробелы, так что если есть экземпляры строк, таких как "error", они не возвращаются.

$dir = "C:\Temp\"
$files = Get-ChildItem $dir -Recurse -Include "*.log"
foreach ($file in $files){
$out = "ERR_" + $file.BaseName + ".txt" select-string -path $file.FullName -Pattern " ERR " -AllMatches | out-file "$dir\$out"
}

В результате логи будут куда меньшего размера. На этом у меня все. С вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org.

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *