Когда нужно обеспечить быстродействие и надежность дисковой системы, а также возможность горячей замены дисков без выключения сервера, большую помощь окажут дисковые контроллеры с кэш памятью и защитным аккумулятором, такие как MegaRAID. Новые версии этих контроллеров есть на сайте https://www.broadcom.com/products/storage/raid-controllers.

Для надежной работы дисковой системы сервера необходимо настроить мониторинг контроллера и подключенных к ним дисков. В этой статье вы найдете практическое руководство, которое позволит вам организовать такой мониторинг для контроллера MegaRAID с помощью Zabbix.

При этом вы будете использовать программу zabbix_sender, с помощью которой, без преувеличения, можно настроить мониторинг практически чего угодно. В данном случае для получения данных мониторинга мы будем использовать программу MegaCli.

Приемы, описанные в этой статье, вы сможете использовать для мониторинга других контроллеров или устройств, если не найдете для них готовых шаблонов на сайте https://www.zabbix.com/integrations.

Установка программы MegaCli

Вы можете загрузить архив с программой MegaCli для многих платформ, включая Linux и Windows, на сайте https://www.broadcom.com, например, по этой ссылке: https://docs.broadcom.com/docs/12351587. Мы расскажем о том, как установить программу MegaCli в ОС Debian 11 из репозитория le-vert.net, где есть утилиты для различных контроллеров RAID. Также приведем инструкцию по установке для CentOS и FreeBSD.

Установка MegaCli в ОС Debian 11

Чтобы установить программу MegaCli в ОС Debian 11, нужно подключить репозиторий le-vert.net. Для этот добавьте в файл /etc/apt/ sources.list следующую строку:

deb http://hwraid.le-vert.net/debian bullseye main

После этого добавьте ключ, обновите пакеты и установите программу:

# wget -O - http://hwraid.le-vert.net/debian/hwraid.le-vert.net.gpg.key | apt-key add -
# apt update
# apt install megacli

После установки проверьте версию программы:

# megacli -v
  MegaCLI SAS RAID Management Tool  Ver 8.07.14 Dec 16, 2013
 (c)Copyright 2013, LSI Corporation, All Rights Reserved.

Обратите внимание, что мы запускаем программу megacli, а не MegaCli.

После установки можно отключить репозиторий. Для этого закройте в файле /etc/apt/sources.list символом комментария добавленную строку и обновите пакеты:

# apt update

Установка MegaCli в CentOS

Если нужно установить программу MegaCli в CentOS, прежде всего скачайте нужный пакет:

# wget --user=hetzner --password=download http://download.hetzner.de/tools/LSI/tools/MegaCLI/8.07.14_MegaCLI.zip

Далее установите утилиту unzip, если ее нет на сервере:

# yum install unzip

Распакуйте пакет и установите программу megacli следующим образом:

# unzip 8.07.14_MegaCLI.zip
# cd Linux
# rpm -i MegaCli-8.07.14-1.noarch.rpm
# ln -s /opt/MegaRAID/MegaCli/MegaCli64 /usr/bin/megacli

Проверьте версию установленной программы:

# megacli -V
MegaCLI SAS RAID Management Tool  Ver 8.07.14 Dec 16, 2013
(c)Copyright 2013, LSI Corporation, All Rights Reserved.

Установка MegaCli в ОС FreeBSD

Выполните установку MegaCli из портов ОС FreeBSD. Для этого сначала обновите порты:

# portsnap fetch update

Затем установите программу MegaCli следующим образом:

# cd /usr/ports/sysutils/megacli
# make install

Проверьте версию установленной программы:

# MegaCli -v

Обратите внимание, что в отличие от Debian и CentOS, в командном приглашении FreeBSD нужно запускать команду MegaCli, а не megacli.

Мониторинг состояния массива RAID с контроллером MegaRAID вручную

Прежде чем мы займемся настройкой мониторинга дискового массива RAID с контроллером MegaRAID с помощью Zabbix, выполним основные процедуры диагностики вручную из командной строки.

Проверка состояния массива RAID

Для проверки массива RAID, созданного контроллером как виртуальное дисковое устройство, используйте команду megacli с параметром -LDInfo (в ОС FreeBSD запустите команду MageCli):

# megacli -LDInfo -LALL -aALL

Эта команда покажет важную информацию о виртуальном дисковом устройстве (RAID-массиве):

Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 557.861 GB
Sector Size         : 512
Mirror Data         : 557.861 GB
State               : Optimal
Strip Size          : 64 KB
Number Of Drives    : 2
Span Depth          : 1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disabled
Encryption Type     : None
Is VD Cached: No
Number of Dedicated Hot Spares: 1
    0 : EnclId - 4 SlotId - 2

В данном случае сконфигурировано зеркало из двух дисков объемом 557.861 ГБайт каждый.

Если массив находится в оптимальном состоянии, и данные останутся в сохранности при выходе из строя одного из дисков, то значение параметра State будет равно Optimal.

Также обратите внимание на параметр политики кэширования Current Cache Policy

Если ваш контроллер оснащен аккумулятором, защищающим кэш-память контроллера от внезапного отключения электропитания, то по умолчанию при нормальном заряде и емкости аккумулятора контроллер использует отложенный режим записи WriteBack. 

В этом случае контроллер сообщает о том, что данные записаны, сразу после того, как они оказываются в кэше контроллера, еще до завершения фактической записи данных на диск. Этот режим сильно ускоряет запись данных, но он безопасен только при нормальном состоянии аккумулятора.

Если аккумулятор контроллера разряжен в результате запуска периодической тренировки или в результате исчерпания ресурса, то режим отложенной записи WriteBack отключается и включается режим прямой записи WriteThrough:

Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU

В этом режиме контроллер будет дожидаться завершения процесса записи на диск перед тем, как сообщить программе о завершении операции записи.

Политика дискового контроллера Default Cache Policy, установленная по умолчанию, предполагает отключение кэша записи при неисправном или разряженном аккумуляторе. Если кэш не отключить, что в случае аварии с электропитанием можно потерять данные, находящиеся в кэше, но еще не записанные на диск. В этом случае велика вероятность повреждения файловой системы.

Проверка состояния аккумулятора

Дисковый контроллер MegaRAID может быть оснащен блоком батарейного (на самом деле аккумуляторного) питания (рис. 1).

Рис. 1. Блок аккумуляторного питания для контроллера MegaRAID
Рис. 1. Блок аккумуляторного питания для контроллера MegaRAID

На рис. 2 показан литий-ионный аккумулятор упомянутого выше блока. Новые версии контроллеров оснащаются не литий-ионными аккумуляторами, а супер-конденсаторами (ионисторами), имеющими большой срок службы.

Рис. 2. Аккумулятор в блоке для контроллера MegaRAID
Рис. 2. Аккумулятор в блоке для контроллера MegaRAID

Для проверки состояния аккумулятора используйте следующую команду:

# megacli -AdpBbuCmd -aAll

Эта команда выведет на консоль довольно обширную информацию. На что нужно обратить внимание в первую очередь?

Прежде всего, параметр Battery State должен быть равен Optimal. Если это не так, то с контроллером что-то случилось. В лучшем случае поможет запуск обучения аккумулятора, в худшем — блок аккумулятора придется заменить.

Если контроллер по какой-то причине не запустил автоматическое обучение, может появиться строка с сообщением о необходимости запуска обучения вручную:

Battery State: Degraded(Need Attention)
  A manual learn is required.

В этом случае запустите обучение с помощью такой команды:

# megacli -AdpBbuCmd -BbuLearn -aAll

Если обучение запустилось, вы увидите сообщение на консоли:

Adapter 0: BBU Learn Succeeded.

Теперь чтобы отслеживать процесс обучения, время от времени выдавайте команду «megacli -AdpBbuCmd -aAll». Контролируйте состояние заряда или разряда аккумулятора Charging Status, запрос цикла обучения Learn Cycle Requested, его активность Learn Cycle Active и текущее состояние обучения Learn Cycle Status:

Charging Status         : Discharging
  Learn Cycle Requested : Yes
  Learn Cycle Active    : Yes
  Learn Cycle Status    : OK

Заметим, что обучение может выполняться долго, не один час, так что запаситесь терпением. Со временем, после того как аккумулятор в процессе обучения полностью разрядится, начнется его зарядка.  Статус Charging Status изменится на Charging.

Еще один важный параметр аккумуляторного блока, это количество циклов обучения Cycle Count. Его можно посмотреть так:

# megacli -AdpBbuCmd -aAll | grep "Cycle Count"
  Cycle Count: 4062

Этот параметр показывает степень износа аккумуляторов. В приведенном выше примере аккумуляторный блок давно нужно было заменить.

Просмотр свойств контроллера

Следующая команда выведет на консоль информацию обо всех дисковых контроллерах MegaRAID, установленных на сервере:

# megacli -AdpAllinfo -aAll

Здесь можно увидеть название контроллера Product Name и его серийный номер Serial No, что может пригодиться при обращении в сервис.

Вы можете узнать, оснащен ли контроллер блоком аккумуляторов (поле BBU) и определить размер кэш памяти, количество и состояние сконфигурированных виртуальных дисков Virtual Drives, количество и состояние физических дисков Disks, возможности контроллера и его параметры по умолчанию.

Подробное описание этой информации выходит за рамки нашей статьи. Хорошее описание команды megacli можно найти в руководстве MegaRAID SAS Software User Guide, доступном по адресу https://docs.broadcom.com/docs/12353236.

Просмотр свойств дисков

Со временем жесткие диски, как и диски SSD, могут выходить из строя. Если на сервере установлен контроллер MegaRAID, то список подключенных физических дисков и их состояние можно легко узнать так:

# megacli -PDList -aAll

После запуска команды на консоли появится множество различных параметров и их значения. Параметр Enclosure Device ID содержит идентификатор места расположения, по которому вы сможете адресоваться к диску при выполнении с ним различных операций. Вам также потребуется номер слота Slot Number.

Ниже мы показали команды, с помощью которых можно быстро узнать упомянутый выше идентификатор и номер:

# megacli -PDList -aAll | grep "Enclosure Device ID"
Enclosure Device ID: 252
Enclosure Device ID: 252
Enclosure Device ID: 252
# megacli -PDList -aAll | grep "Slot Number"
Slot Number: 0
Slot Number: 1
Slot Number: 2

Параметр Firmware state очень важен — анализируя его, можно узнать состояние диска:

# megacli -PDList -aAll | grep "Firmware state"
Firmware state: Unconfigured(bad)
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up

Здесь видно, что первый диск, для которого Enclosure Device ID равен 252, а номер слота Slot Number находится в аварийном состоянии и не сконфигурирован для работы в массиве. Остальные два диска работают нормально.

Если вам нужен новый диск на замену, то типы дисков, подключенных к контроллеру, можно узнать так:

# megacli -PDList -aAll | grep "Inquiry Data"
Inquiry Data: SEAGATE ST3600057SS     00063SL098QA
Inquiry Data: SEAGATE ST3600057SS     00063SL09XZ1
Inquiry Data: SEAGATE ST3600057SS     00063SL09EVP

Как видите, используются диски Seagate, указана модель и серийный номер. Для замены нужно приобрести такой же или совместимы диск.

Чтобы посмотреть детальную информацию о диске, укажите следующей команде идентификатор Enclosure Device ID и номер слота Slot Number:

# megacli -PDInfo -PhysDrv\[252:0] -aAll

Будет полезной информация о количестве ошибок на диске:

# megacli -PDInfo -PhysDrv\[252:0] -aAll | grep Error
Media Error Count: 3
Other Error Count: 2

Если появились такие ошибки, то диск скоро может выйти из строя.

Контроллер время от времени запускает тестовое чтение дисков (Patrol Read) с целью обнаружения потенциальных проблем.

С помощью следующих двух команд вы можете инициировать запуск тестового чтения и посмотреть его состояние:

# megacli -AdpPR Start -aAll
# megacli -AdpPR Info -aAll

Другие полезные команды

Если вы заменили вышедший из строя диск, контроллер автоматически запускает перенос на него данных. Эта операция называется CopyBack, а ее состояние можно узнать следующим образом:

# megacli -PDCpyBk -ShowProg -PhysDrv\[252:0] -aAll
Copyback Progress on Device at Enclosure 4, Slot 0 Completed 28% in 192 Minutes.

Также может оказаться полезной команда добавления диска в горячий резерв:

# megacli -PDHSP -set -PhysDrv\[252:3\] -a0

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

И, наконец, приведем еще одну полезную команду — чтение журнала контроллера:

# megacli -AdpAlILog -aAll > lsi_log.txt

Содержимое журнала будет записано в файл, который можно проанализировать или отдать для анализа в сервис.

Программа zabbix_sender

Программа с названием zabbix_sender позволяет передавать данные на сервер Zabbix без использования агента zabbix_agent. Если подготовить для нее данные в виде текстового файла, то она сможет передать сразу несколько элементов данных на сервер Zabbix через порт 10050.

Установка программы zabbix_sender

Во второй статье нашей серии про Zabbix мы рассказывали о том, как установить программу zabbix_sender. Нужно установить репозиторий Zabbix, а затем выполнить установку:

# wget https://repo.zabbix.com/zabbix/6.2/debian/pool/main/z/zabbix-release/zabbix-release_6.2-1+debian11_all.deb
# dpkg -i zabbix-release_6.2-1+debian11_all.deb
# apt update
# apt install zabbix-sender

После установки проверьте версию zabbix_sender:

# zabbix_sender -V

Если на сервере установлена ОС FreeBSD, то программа zabbix_sender будет установлена вместе с агентом Zabbix из порта /usr/ports/net-mgmt/zabbix6-agent.

Подготовка файла с данными для zabbix_sender

Если вам нужно передать на сервер Zabbix несколько элементов данных, то нужно подготовить текстовый файл такого вида:

d207 lsi.isOptimal 1
d207 lsi.WriteBack 0
d207 lsi.OnlineDriveCount 2
d207 lsi.HotspareDriveCount 0
d207 lsi.BatteryReplacementRequired  No
d207 lsi.RemainingCapacityLow  Yes
d207 lsi.RaidDriveHasErrors 1
d207 lsi.PredictiveFailureCount 0
d207 lsi.CycleCount  107

Здесь в каждой строке следует указать через пробел имя хоста, как оно было задано при добавлении в мониторинг, далее имя элемента данных, указанное в шаблоне, созданном для мониторинга этих элементов данных, а также значение элемента данных.

В данном случае в файл записаны данные, полученные от контроллера MegaRAID с помощью утилиты megacli и скрипта, составленного на языке Perl.

Запуск программы zabbix_sender

Для запуска программы zabbix_sender с целью передачи содержимого файла со значениями параметров мы используем следующую команду:

/usr/bin/zabbix_sender -vv -z xxx.xxx.xxx.xxx -i /home/frolov/zabbix_lsi/zabbix_data.txt

Здесь вместо xxx.xxx.xxx.xxx в параметре -z нужно указать адрес IP вашего сервера Zabbix. Параметр -vv позволяет при запуске программы увидеть на консоли детали выполнения операции. И, наконец, параметр -i задает путь к файлу со значениями элементов данных.

Программа check_lsi.pl для сбора и отправки данных мониторинга MegaRAID

Чтобы получить данные от контроллера MegaRAID, сформировать текстовый файла с результатами мониторинга и отправить эти данные на сервер Zabbix с помощью программы zabbix_sender, мы подготовили программу check_lsi.pl. 

Эту программу, а также соответствующий шаблон check_lsi.xml для Zabbix вы найдете на GitHub по адресу https://github.com/AlexandreFrolov/shop2you_zabbix_monitoring.

Расскажем кратко о программе check_lsi.pl.

Инициализация

На этапе инициализации программа check_lsi.pl получает первые три параметра командной строки:

my $zabbix_server_ip = $ARGV[0];
my $hostname = $ARGV[1];
if($ARGV[2] eq 'debug') { $debug = 1; } else { $debug = 0; }

Через первый параметр программе передается адреса IP серверов Zabbix, на которые нужно отправить данные мониторинга контроллера MegaRAID и подключенных к нему дисков. Если серверов Zabbix несколько, разделите адреса запятой.

Второй параметр задает имя хоста, к которому подключен контроллер. Это имя должно совпадать с именем соответствующего хоста на сервере Zabbix.

И, наконец, третий параметр позволяет включить вывод отладочной информации на консоль, и при обычном запуске он не используется.

Также при инициализации программа check_lsi.pl определяет версию ОС, на которой ее запустили. В зависимости от версии программа записывает в переменную $zabbix_sender различные пути для Linux и FreeBSD.

Получение состояния MegaRAID и дисков

На этапе получения состояния контроллера и дисков программа выдает команду megacli с параметром -LDInfo, о которой мы говорили выше:

my $cmd;
$cmd = "$bin_megacli -LDInfo -LALL -aALL";

my @rqout = ();
@rqout = split /\n/, `$cmd`;
my $isOptimal = 0;
my $WriteBack = 0;
foreach my $line (@rqout)
{
  next if ($line eq "" or !defined $line);
  if($line=~/State/ && $line=~/Optimal/)  { $isOptimal = 1; }
  if($line=~/Current Cache Policy/ && $line=~/WriteBack/)  { $WriteBack = 1; }
}

Здесь программа проверяет, находится ли дисковый массив в оптимальном состоянии, и используется ли режим отложенной записи. Результат сохраняется в переменных isOptimal и WriteBack, соответственно.

Проверка состояния дисков

Далее программа выдает команду megacli с параметром -PDList для получения информации обо всех дисках:

$cmd = "$bin_megacli -PDList -aALL";

В программе определяются переменные:

my $MediaErrorCount = 0; // количество ошибок на диске
my $OtherErrorCount = 0; // количество прочих ошибок
my $PredictiveFailureCount = 0; // счетчик предупреждений о возможных сбоях
my $OnlineDriveCount = 0; // счетчик дисков в состоянии онлайн
my $HotspareDriveCount = 0; // счетчик дисков горячего резерва
my $DeviceId = 0; // идентификатор диска
my $raid_drive_has_errors = 0; // признак наличия ошибок в на диске
my $HasPredictiveFailureCount = 0; // признак наличия предупреждений о возможных сбоях

Программа предпринимает несколько попыток выдачи команды -PDList:

my $retry_count = 2;
do
{
  @rqout = ();
  @rqout = split /\n/, `$cmd`;
  my $responce_array_size = $#rqout;
  if ($responce_array_size < 3) # PDList cmd failed
  {
    $retry_count -= 1;
    sleep(10);
  }
  else
  {
     $retry_count = 0;
  }
} while ($retry_count > 0);

Если команда выполнилась успешно, программа анализирует полученные от нее данные и устанавливает соответствующим образом состояние перечисленных выше переменных:

foreach my $line (@rqout)
{
  if($line=~/Device Id/)
  {
    ($str, $DeviceId) = split(/:/, $line);
    $MediaErrorCount = 0;
    $OtherErrorCount = 0;
    $PredictiveFailureCount = 0;
  }
  if($line=~/Media Error Count/)  { ($str, $MediaErrorCount) = split(/:/, $line); }
  if($line=~/Other Error Count/)  { ($str, $OtherErrorCount) = split(/:/, $line); }
  if($line=~/Predictive Failure Count/)  { ($str, $PredictiveFailureCount) = split(/:/, $line); }
  if($MediaErrorCount != 0 || $OtherErrorCount != 0 || $PredictiveFailureCount != 0)
  {
    $drive_with_errors{$DeviceId} = { MediaErrorCount => $MediaErrorCount, OtherErrorCount => $OtherErrorCount, PredictiveFailureCount => $PredictiveFailureCount };
    $raid_drive_has_errors = 1;
  }
  if($PredictiveFailureCount != 0)
  {
     $HasPredictiveFailureCount = 1;
  }
  if($line=~/Firmware state/ && $line=~/Online/)  { $OnlineDriveCount += 1; }
  if($line=~/Firmware state/ && $line=~/Hotspare/)  { $HotspareDriveCount += 1; }
}

Проверка состояния блока аккумуляторов

Для получения состояния блока аккумуляторов, установленных на контроллере MegaRAID, программа выдает команду megacli с параметром -AdpBbuCmd:

$cmd = "$bin_megacli -AdpBbuCmd -aAll";
@rqout = ();
@rqout = split /\n/, `$cmd`;
my $BatteryReplacementRequired = 'No';
my $RemainingCapacityLow = 'No';
my $CycleCount=0;
foreach my $line (@rqout)
{
  if ($debug) { print $line."\n"; }
  if($line=~/Battery Replacement required/)  { ($str, $BatteryReplacementRequired) = split(/:/, $line); }
  if($line=~/Remaining Capacity Low/)  { ($str, $RemainingCapacityLow) = split(/:/, $line); }
  if($line=~/Cycle Count/) { ($str,$CycleCount) = split(/:/, $line);  }
}

По результатам анализа программа записывает в переменную BatteryReplacementRequired строку «Yes», если есть необходимость замены блока аккумуляторов.

В переменная RemainingCapacityLow будет записано предупреждение, если емкость аккумуляторной батареи стала низкой.

Что касается переменной CycleCount, то в ней сохраняется текущее значение счетчика циклов обучения аккумуляторного блока.

Запись данных в файл и отправка на сервер Zabbix

Теперь, когда все данных подготовлены, программа check_lsi.pl записывает их в файл:

open(my $fh, '>', $zabbix_sender_data_file) or die "Не могу открыть '$zabbix_sender_data_file' $!";
print $fh $hostname." lsi.isOptimal ".$isOptimal."\n";
print $fh $hostname." lsi.WriteBack ".$WriteBack."\n";
print $fh $hostname." lsi.OnlineDriveCount ".$OnlineDriveCount."\n";
print $fh $hostname." lsi.HotspareDriveCount ".$HotspareDriveCount."\n";
print $fh $hostname." lsi.BatteryReplacementRequired ".$BatteryReplacementRequired."\n";
print $fh $hostname." lsi.RemainingCapacityLow ".$RemainingCapacityLow."\n";
print $fh $hostname." lsi.RaidDriveHasErrors ".$raid_drive_has_errors."\n";
print $fh $hostname." lsi.PredictiveFailureCount ".$HasPredictiveFailureCount."\n";
print $fh $hostname." lsi.CycleCount ".$CycleCount."\n";
close $fh;

После этого файл отправляется на все серверы Zabbix, адреса которых были заданы в командной строке через запятую:

my @zabbix_server_ip_array = split(',', $zabbix_server_ip);
foreach my $server_ip (@zabbix_server_ip_array)
{
  my $trap_cmd = $zabbix_sender.' -vv -z '.$server_ip.' -i '.$zabbix_sender_data_file;
  my @trapout = ();
  @trapout = split /\n/, `$trap_cmd`;
}

Запуск check_lsi.pl через crontab

Для запуска программы check_lsi.pl мы используем crontab. В этом примере проверка запускается каждый час:

0 * * * * /usr/bin/perl /home/frolov/zabbix_lsi/check_lsi.pl xxx.xxx.xxx.xx1,xxx.xxx.xxx.xx2 d207

В командной строке заданы адреса IP двух серверов Zabbix, на которые отправляются данные, а также имя хоста, на котором установлен контроллер MegaCLI.

Файл шаблона для мониторинга MegaCLI

Шаблон для программы check_lsi.pl вы найдете по адресу https://github.com/AlexandreFrolov/shop2you_zabbix_monitoring/blob/main/check_lsi.xml. Вам необходимо подключить этот шаблон к серверу, на котором установлен контроллер MegaCLI.

На рис. 3 показаны элементы данных, определенных в этом шаблоне.

Рис. 3. Элементы данных шаблона check_lsi.xml
Рис. 3. Элементы данных шаблона check_lsi.xml

Как видите, здесь имеются все элементы, которые получает и отправляет на сервер Zabbix только что описанная программа check_lsi.pl.

В шаблоне также определены триггеры (рис. 4).

Рис. 4. Триггеры шаблона check_lsi.xml
Рис. 4. Триггеры шаблона check_lsi.xml

Очень высокая степень важности (High) задана для триггеров, указывающих на деградацию массива RAID, а также на снижение количества дисков в состоянии Online ниже двух (в нашем случае используется зеркало из двух дисков и третий диск горячего резерва).

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

Также обратите внимание на триггер No LSI heartbeats within last 1.5 hour, для срабатывания которого проверяется следующее выражение:

nodata(/Shop2YOU LSI/lsi.isOptimal,5400s)=1

Триггер срабатывает, если данные мониторинга не приходили от сервера дольше чем полтора часа. Так как мы запускаем программу check_lsi.pl через задание crontab раз в час, то этот триггер сообщит нам, что по какой-то причине мониторинг состояния контроллера и дисков не отработал.

Для других триггеров установлена минимальная степень важности Information. Например, триггеры BBU Remaining Capacity Low и Mode changed from WriteBack to WriteThrough могут срабатывать при периодическом выполнении цикла обучения, когда аккумулятор сначала разряжается, а потом снова заряжается. Нет необходимости обращать внимание системного администратора на запуск процесса обучения.

Если сработал триггер Predictive Failure Count, то это также не приведет к немедленному риску потери информации, однако является поводом для более глубокого анализа состояния контроллера и массива.

Аналогично, сообщение Some Raid Drives has Errors сообщает, что на дисках есть ошибки, но сами по себе диски с ошибками могут работать довольно долго (а могут и быстро выйти из строя).

Разумеется, для мониторинга своей системы вы можете установить другие степени важности триггеров, а также выбрать другую периодичность запуска программы check_lsi.pl.

Автор: Александр Фролов.


НЛО прилетело и оставило здесь промокод для читателей нашего блога:

— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

Комментарии (6)


  1. MikeDeblin
    16.08.2022 20:20
    +1

    А есть ли возможность выполнить megacli в Windows с повышенными привилегиями из скрипта?
    Пытаюсь прикрутить к zabbix, но megacli не может собирать данные без повышенных привилегий. UAC отключить не вариант.


    1. kalach_89
      17.08.2022 01:17
      +2

      Попробуйте создать исправление для megacli через microsoft application compatibility toolkit. Выбираете программу - run as invoker.


    1. vesper-bot
      17.08.2022 09:35
      +1

      Запилите задачу с дампом вывода megacli и настройте запускаться от системы, потом парсите вывод. Вам ведь не сам процесс нужен, а его результат.


  1. ilyakruchinin
    17.08.2022 03:36
    +5

    Опять велосипедостроение через intergrations.
    IMHO, integrations - самый вредный раздел сайта zabbix.com (куча самодела).
    Начнем с того, что MegaCLI был заменен на StorCLI (и считается устаревшим - legacy).
    StorCLI является рекомендованным вместо MegaCLI начиная в 2013-го года (9 лет назад!). И, насколько я помню, самые свежие raid-карты поддерживают только StorCLI.
    https://docs.broadcom.com/doc/12352476
    https://www.intel.com.au/content/www/au/en/support/articles/000023172/server-products.html
    StorCLI поддерживает вывод в JSON - ключ J (а Zabbix умеет нативно вытаскивать данные при препроцессинге из JSON)

    Все эти велосипеды с perl/python/bash, вызывающие legacy бинарники через cron и отправляющие переработанный на клиенте результат из временного файла через zabbix-sender (чем не устроил zabbix-agent и грамотно настроенный sudoers.d?) - вселенское зло, IMHO.
    А сохранение вывода во временный файл с последующей отправкой содержимого этого файла через zabbix-sender без проверки timestamp (а был ли файл с сохраненными данными обновлен?) - это вообще жесть (будете продолжать слать старые данные о том, что "raid в порядке", когда отвалился скрипт опроса???).


    1. ilyakruchinin
      17.08.2022 03:40

      Даже бегло - вот это уже значительно лучше (но очень далеко от идеала): https://github.com/zabbix/community-templates/tree/main/Server_Hardware/RAID_Cards/template_lsi_avago_broadcom_using_json_outputs_of_storcli

      Данные лучше парсить/вытаскивать из машинночитаемого JSON на Zabbix-сервере (там же делать discovery контроллеров, дисков и статуса), благо возможностей препроцессинга на Zabbix-сервере - куча.
      И просто отправлять сырой вывод storcli в машинночитаемом JSON (с крайне ограниченно настроенным sudoers) как есть на сервер (без предобработки на клиенте). И никаких "временных" файлов с данными и zabbix-sender-ов в cron без логики проверки свежести содержимого временного файла (ну вы что!).


      1. AlexandreFrolov
        17.08.2022 09:07

        Наш SAAS-сервис интернет-магазинов был создан давно, более 16 лет назад. И в нем широко использовались (и до сих пор есть на некоторых серверах) именно контроллеры MegaCLI (и еще были контроллеры Adaptec). Кроме того, мы начинали внедрять Zabbix еще с версии 3.x.

        Полагаю, контроллеры MegaCLI есть у многих, а у кого новее - смогут легко адаптировать этот скрипт или написать на его основе свой собственный. В свое время готового решения на https://www.zabbix.com/integrations мне найти не удалось.

        Но как сказал Генри Форд: "Всё можно сделать лучше, чем делалось до сих пор."

        Что касается "отвала скрипта опроса" и "проверки свежести", то это полностью решается триггером, который срабатывает, если данные слишком долго не передавались на сервер Zabbix (есть в конце статьи):

        nodata(/Shop2YOU LSI/lsi.isOptimal,5400s)=1

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

        А если контроллер полностью вышел из строя, то сработает другой триггер - по недоступности сервера. И тогда сразу придет SMS и будет сделан дозвон роботом до системного администратора с передачей голосового сообщения о проблеме.

        Что касается zabbix-sender, то с его помощью можно контролировать процессы, которые выполняются довольно долго, не заставляя ждать окончания получения данных агента Zabbix. В этом смысле zabbix-sender позволяет мониторить что угодно.

        На практике уже много лет это решение очень помогает нам обнаружить выход из строя как отдельных дисков массива, так и необходимость замены блока аккумулятора в контроллере. Также успешно отслеживается процесс переобучения аккумулятора и режим кэширования при записи.