Плагин mdadm

Мониторинг массивов Linux Software RAID, управляемых mdadm, с отслеживанием состояния массива, деградировавших или отказавших устройств и прогресса перестроения/ресинхронизации.

Обзор

Плагин mdadm читает статус RAID из ядра напрямую из /proc/mdstat и сообщает о здоровье каждого активного массива на хосте:

  • Состояние массива - active, degraded, recovering, resyncing, reshaping, inactive или failed
  • Количество устройств - всего, активные, рабочие, отказавшие и резервные устройства на массив
  • Обнаружение деградации - помечает любой массив, в котором отсутствует одно или несколько устройств
  • Прогресс синхронизации - действие recovery / resync / reshape / check / repair и процент завершения
  • Размер массива - полезный размер массива в ГБ
  • Сводные счётчики - всего массивов, деградировавшие массивы и отказавшие массивы по всему хосту

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

Требования

Поддержка RAID

  • Только Linux - плагин полагается на драйвер ядра md и /proc/mdstat
  • Как минимум один собранный массив software RAID (md0, md1, …)

Зависимости

  • Python-пакеты не требуются. Плагин использует только стандартную библиотеку.
  • mdadm должен быть установлен на хосте (стандартный инструмент для создания массивов и управления ими). Драйвер md в любом случае предоставляет статус через /proc/mdstat, который является основным источником данных плагина.

Проверка наличия RAID

# Primary data source — must exist and list at least one array
cat /proc/mdstat

# Confirm mdadm is installed
mdadm --version

# Detailed view of a specific array
mdadm --detail /dev/md0

Пример /proc/mdstat со здоровым зеркалом и деградировавшим RAID 5:

Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
      104320 blocks super 1.2 [2/2] [UU]

md1 : active raid5 sdd1[3] sdc1[1] sdb1[2] sda1[0]
      3145728 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UU_U]
      [>....................]  recovery =  1.2% (12345/104320) finish=0.5min speed=12345K/sec

unused devices: <none>

Если /proc/mdstat не существует или не перечисляет активных/неактивных устройств md, плагин сообщает о себе как о недоступном и ничего не собирает.

Конфигурация

Агент читает свою конфигурацию из файла переменных окружения shell по пути /opt/statusradar/config.env, который загружается systemd (EnvironmentFile=). Это не YAML-файл.

Включение плагина

mdadm не требует переменных окружения, специфичных для плагина — просто добавьте mdadm в список PLUGINS.

Отредактируйте /opt/statusradar/config.env:

PLUGINS=mdadm

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

PLUGINS=mdadm,nginx,docker

Перезапустите агент для применения:

sudo systemctl restart statusradar-agent

Никаких параметров host, port, учётных данных или путей задавать не нужно. Плагин всегда читает /proc/mdstat.

Собираемые метрики

Плагин возвращает сводные счётчики уровня хоста плюс разбивку по каждому массиву.

Сводка по хосту

Метрика Описание Единица Тип
total_arrays Число массивов, найденных в /proc/mdstat Количество Gauge
degraded_arrays Массивы, в которых отсутствует одно или несколько устройств Количество Gauge
failed_arrays Массивы в состоянии failed или inactive Количество Gauge

Метрики по каждому массиву

Каждый массив в arrays[] идентифицируется своим устройством (например, /dev/md0) и включает:

Поле Описание Единица Тип
device Путь к устройству массива (/dev/mdN) - Label
level Уровень RAID (raid0, raid1, raid5, raid6, raid10, linear, multipath) - Label
state Состояние массива (см. ниже) - Label
total_devices Устройства-участники, перечисленные для массива Количество Gauge
active_devices Устройства, ожидаемые массивом (из [N/M]) Количество Gauge
working_devices Устройства, работающие в данный момент (из [N/M]) Количество Gauge
failed_devices Устройства, помеченные как отказавшие (F) Количество Gauge
spare_devices Устройства, помеченные как резервные (S) Количество Gauge
size_gb Полезный размер массива Гигабайты Gauge
sync_action Текущее фоновое действие: idle, recovery, resync, reshape, check, repair - Label
sync_percent Завершённость текущего действия синхронизации (100.0 при простое) Проценты Gauge
degraded Является ли массив деградировавшим Boolean Gauge
state_numeric Числовое здоровье для оповещений (см. ниже) - Gauge

Значения состояния

Поле state выводится из слова статуса ядра и строки статуса устройств ([UU], [U_] и т. д.):

  • active / clean - все устройства присутствуют и исправны
  • degraded - одно или несколько устройств отсутствуют (_ в карте устройств или working < expected)
  • recovering - выполняется recovery (например, перестроение на запасной диск)
  • resyncing - выполняется resync
  • reshaping - выполняется reshape (например, расширение массива)
  • inactive / failed - массив не работоспособен

Числовое состояние для оповещений

state_numeric упрощает настройку оповещений о здоровье RAID в VictoriaMetrics:

Значение Смысл Состояния
1.0 Здоров active, clean
0.5 Предупреждение degraded, recovering, resyncing
0.0 Критично failed, inactive (и любое другое состояние)

Метрики дашборда

Дашборд StatusRadar отображает:

Карточка обзора

  • Total Arrays - total_arrays
  • Degraded Arrays - degraded_arrays
  • Failed Arrays - failed_arrays

Детали по каждому массиву

  • State - цветовая кодировка из state_numeric (зелёный / янтарный / красный)
  • RAID Level - level
  • Devices - working_devices / active_devices с failed_devices и spare_devices
  • Size - size_gb
  • Sync Progress - sync_action и sync_percent, пока выполняется перестроение или проверка

Как работает обнаружение

  1. Плагин проверяет, что /proc/mdstat существует и содержит как минимум одно устройство md в состоянии active или inactive. Если нет — он недоступен.
  2. Он построчно парсит /proc/mdstat:
    • Строки заголовка массива (md0 : active raid1 sdb1[1] sda1[0]) дают устройство, состояние, уровень и список устройств-участников. Устройства, помеченные (F), считаются отказавшими, (S) — резервными.
    • Строка статуса (104320 blocks super 1.2 [2/2] [UU]) даёт размер массива, счётчики working/active устройств из [N/M] и карту up/down из [UU] / [U_]. Символ _ в карте или working < expected помечает массив как degraded.
    • Строки прогресса (recovery = 1.2% ...) задают sync_action и sync_percent и обновляют состояние до recovering, resyncing или reshaping.
  3. mdadm --detail /dev/mdX доступен как запасной вариант для более подробной информации по каждому массиву, но быстрый путь через /proc/mdstat является основным источником.

Тестирование

Ручной тест плагина

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

cd /opt/statusradar
export PLUGINS=mdadm
python3 plugins/mdadm_plugin.py

Ожидаемый вывод (хост с двумя массивами):

Plugin name: mdadm
Enabled: True
Available: True

Metrics collected:
  Total arrays: 2
  Degraded arrays: 1
  Failed arrays: 0

Array details:
  /dev/md0:
    Level: raid1
    State: active
    Devices: 2/2 (failed: 0)
    Size: 0.1 GB
    Sync: idle (100.0%)
    Degraded: False
  /dev/md1:
    Level: raid5
    State: recovering
    Devices: 3/4 (failed: 0)
    Size: 3.0 GB
    Sync: recovery (1.2%)
    Degraded: True

Хост без RAID-массивов:

Plugin name: mdadm
Enabled: True
Available: False

mdadm not available or no RAID arrays found
To enable: export PLUGINS=mdadm
To test: cat /proc/mdstat

Проверка в логах агента

sudo grep mdadm /var/log/statusradar/agent.log | tail -n 20

Устранение неполадок

Плагин сообщает "Available: False"

Причина: Не собрано ни одного RAID-массива, или /proc/mdstat не перечисляет активных/неактивных устройств md.

Проверьте:

# Does the file exist and list arrays?
cat /proc/mdstat

# Is the md driver loaded?
lsmod | grep -E 'md_mod|raid'

# Are arrays assembled?
mdadm --detail --scan

Если /proc/mdstat показывает только Personalities : ... и unused devices: <none>, мониторить нечего — это ожидаемо на хосте без software RAID.

Метрики не собираются

Проверка 1: Включён ли плагин?

grep '^PLUGINS' /opt/statusradar/config.env

PLUGINS должен включать mdadm.

Проверка 2: Был ли агент перезапущен после изменения конфигурации?

sudo systemctl restart statusradar-agent
sudo systemctl status statusradar-agent

Проверка 3: Запустите плагин вручную

cd /opt/statusradar && export PLUGINS=mdadm && python3 plugins/mdadm_plugin.py

Массив всегда показывает деградацию

Симптом: degraded: True сохраняется.

Это плагин корректно сообщает о реальной проблеме — одно или несколько устройств-участников отсутствуют или отказали.

# Identify the failed/missing device
cat /proc/mdstat
mdadm --detail /dev/md0

Ищите _ в карте устройств (например, [U_]) или флаг (F) рядом с участником. Замените диск и добавьте его обратно командой mdadm --manage /dev/md0 --add /dev/sdX1; массив перейдёт в recovering, и sync_percent будет расти к 100%.

Прогресс синхронизации застрял

Симптом: sync_percent не продвигается.

# Current rebuild speed limits
cat /proc/sys/dev/raid/speed_limit_min
cat /proc/sys/dev/raid/speed_limit_max

# Watch live progress
watch -n5 cat /proc/mdstat

Медленное перестроение при высокой нагрузке I/O — это нормально; повышайте speed_limit_min только если массив может выдержать дополнительную нагрузку.

Размер показан как 0.0 GB

Очень маленькие массивы (несколько МБ, например boot-разделы) округляются вниз до 0.0 ГБ, потому что размер указывается с двумя знаками после запятой. Если важен точный размер, проверьте необработанное число блоков в /proc/mdstat.

Влияние на производительность

Плагин читает один небольшой файл (/proc/mdstat) за интервал сбора и парсит его регулярными выражениями.

  • CPU: незначительно (парсинг за доли миллисекунды)
  • Память: незначительно
  • I/O: одно чтение файла ядра из памяти; без обращения к дискам массивов
  • Нет влияния на производительность RAID или скорость перестроения

Сценарии использования

1. Раннее обнаружение отказов дисков

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

Настройте оповещения на:

  • degraded_arrays > 0
  • failed_devices > 0 на любом массиве
  • state_numeric <= 0.5

2. Отслеживание прогресса перестроения

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

Отслеживайте:

  • sync_action и sync_percent
  • Возврат state_numeric к 1.0

3. Перехват отказавших массивов

Немедленно отправляйте оповещение, если массив становится неработоспособным.

Настройте оповещения на:

  • failed_arrays > 0
  • state_numeric == 0.0

Дальнейшие шаги