Как проверить RAIDs ‘mdadm’ во время работы?

Вопрос или проблема

Я начинаю собирать коллекцию компьютеров дома, и для их поддержки у меня есть мой “сервер” на Linux с работающим RAID-массивом.

В настоящее время это mdadm RAID-1, который превратится в RAID-5, когда у меня будет больше дисков (а затем, я надеюсь, RAID-6). Однако я слышал разные истории о повреждении данных на одном диске, которое остается незамеченным из-за использования другого диска, до того момента, когда первый диск выходит из строя, и вы обнаруживаете, что ваш второй диск также испорчен (и третий, четвертый, пятый диск).

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

Как бы вы проверили работающий RAID, чтобы убедиться, что все диски работают нормально?

Я мониторю SMART на всех дисках и также настроил mdadm на отправку мне email в случае сбоя, но хотел бы знать, чтобы мои диски иногда сами “проверялись”.

Цель RAID с избыточностью – чтобы он продолжал работать, пока это возможно, но, очевидно, он обнаружит ошибки, которые переведут его в деградированный режим, такие как сбой диска. Вы можете показать текущий статус массива с помощью mdadm --detail (сокращённо как mdadm -D):

# mdadm -D /dev/md0
<snip>
       0       8        5        0      active sync   /dev/sda5
       1       8       23        1      active sync   /dev/sdb7

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

Вы также можете получить краткую информацию о состоянии всех RAID-устройств, просмотрев /proc/mdstat. Вы можете получить информацию о RAID-устройстве в /sys/class/block/md*/md/*; см. admin-guide/md.html в документации ядра. Некоторые записи /sys также доступны для записи; например, вы можете запустить полную проверку md0 с помощью echo check >/sys/class/block/md0/md/sync_action.

В дополнение к этим проверкам, mdadm может уведомить вас, как только произойдет что-то плохое. Убедитесь, что у вас в /etc/mdadm.conf есть MAILADDR root (некоторые дистрибутивы, например Debian, настраивают это автоматически). Тогда вы получите уведомление по электронной почте, как только произойдет ошибка (деградированный массив).

Убедитесь, что вы получаете почту, отправленную на root на локальном компьютере (некоторые современные дистрибутивы упускают это, потому что считают, что вся почта отправляется через внешних провайдеров — но получение локальной почты необходимо для любого серьезного системного администратора). Проверьте это, отправив root письмо: echo hello | mail -s test root@localhost. Обычно правильная настройка электронной почты требует двух вещей:

  • Запустить MTA на вашем локальном компьютере. MTA должен быть настроен как минимум для локальной доставки почты. Все дистрибутивы поставляются с подходящими MTA, выберите любой (но не nullmailer, если вы хотите, чтобы почта доставлялась локально).

  • Переадресовать почту, отправляемую на системные аккаунты (по крайней мере root), на адрес, который вы регулярно читаете. Это может быть ваша учетная запись на локальном компьютере или внешняя почтовая адреса. В большинстве MTA адрес можно настроить в /etc/aliases; у вас должна быть строка, такая как

     root: djsmiley2k
    

    для локальной доставки, или

     root: [email protected]
    

    для удаленной доставки. Если вы выберете удаленную доставку, убедитесь, что ваш MTA настроен для этого. В зависимости от вашего MTA, возможно, вам потребуется выполнить команду newaliases после редактирования /etc/aliases.

Вы можете принудительно проверить весь массив, пока он находится в сети. Например, чтобы проверить массив на /dev/md0, выполните команду от имени root:

echo check > /sys/block/md0/md/sync_action

У меня также есть задача cron, которая выполняет следующую команду раз в месяц:

tar c /dir/of/raid/filesystem > /dev/null

Это не полная проверка самого диска, но она заставляет систему периодически проверять, что (почти) каждый файл можно успешно прочитать с диска. Да, некоторые файлы будут читаться из кэша памяти вместо диска. Но я считаю, что если файл находится в кэше памяти, то он успешно считан с диска недавно или будет записан на диск, и обе эти операции также выявят ошибки диска. В любом случае, выполнение этой задачи тестирует самый важный критерий RAID-массива (“Могу ли я успешно прочитать мои данные?”), и за три года работы моего массива, единственный раз, когда у меня возникла проблема с диском, эта команда обнаружила ее.

Одно небольшое предупреждение: если ваша файловая система большая, то выполнение этой команды займет много времени; моя система занимает около 6 часов на TiB. Я запускаю ее с помощью ionice, чтобы остальная система не останавливалась во время проверки диска:

ionice -c3 tar c /dir/of/raid/filesystem > /dev/null

Пакет ‘mdadm’ в Debian и Ubuntu содержит файл

/etc/cron.d/mdadm

который запускает команду в первое воскресенье каждого месяца

/usr/share/mdadm/checkarray --cron --all --idle --quiet

которая проверяет все ваши массивы на консистентность (если вы не установили AUTOCHECK в false в /etc/default/mdadm). Отчет будет отправлен пользователю ‘root’ (убедитесь, что вы получаете такие сообщения).

Я использую эту простую функцию для проверки /proc/mdstat:

#Здоровье RAID-массива
raid() { awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}'  /proc/mdstat; }

Я добавил это в свою командную строку, создав /etc/profile.d/raid_status.sh:

raid_prompt() { awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}'  /proc/mdstat | awk '/\[U+\]/ {print "\033[32m" $0 "\033[0m"}; /\[.*_.*\]/ {print "\033[31m" $0 "\033[0m"}'; }

Затем установил PS1 на:

PS1='$(raid_prompt)\n[\u@\h \W]\$ '

Это выводит имя массива и статус участников зеленым цветом, если все участники включены. Если участник выходит из строя, статус выводится красным цветом.

Я сделал несколько улучшений кода awk, используя

этот ответ от jasonwryan – версия 1

и этот ответ от Karl Peterson – версия 2

версия 3 со списком элементов RAID-массивов и их статусами

awk '/^md/ {printf "%s: ", $1; line=""; n=3; for (;n<=NF;n++) line=line" "$n;}; /blocks/ {printf "%s %s =%s\n", $(NF-1), $NF, line}' /proc/mdstat

пример вывода 3

md121: [1/1] [U] = active raid1 sdj6[2]
md122: [2/2] [UU] = active raid1 sdh5[2] sdi5[3]
md123: [2/2] [UU] = active raid1 sdf4[0] sdg4[1]
md124: [2/2] [UU] = active raid1 sdd3[0] sde3[1]
md125: [2/1] [_U] = active raid1 sdc2[1]
md126: [2/1] [_U] = active raid1 sdb1[1]
md127: [2/1] [_U] = active raid1 sda[1]

версия 4 со списком элементов RAID-массивов с их размером и статусами, понятными для человека

awk '/^md/ {printf "%s: ", $1; line=""; n=3; for (;n<=NF;n++) line=line" "$n;}; /blocks/ {total=$1; total_units="K"; if (total >= 1024*1024*1024) { total_units="T" ; total/= 1024*1024*1024;} else if (total >= 1024*1024) { total_units="G" ; total/= 1024*1024;} else if (total >= 1024) { total_units="M" ; total/= 1024;}; total_ident = total < 100 ? ( total < 10 ? "" : " " ) : ""; total_show = substr((total_ident total), 1, 5); printf "%s %s = %s %s =%s\n", $(NF-1), $NF, total_show, total_units"iB", line}' /proc/mdstat

пример вывода 4

md121: [1/1] [U] = 3.756 TiB = active raid1 sdj6[2]
md122: [2/2] [UU] = 1.456 TiB = active raid1 sdh5[2] sdi5[3]
md123: [2/2] [UU] = 543.2 GiB = active raid1 sdf4[0] sdg4[1]
md124: [2/2] [UU] =  23.4 GiB = active raid1 sdd3[0] sde3[1]
md125: [2/1] [_U] = 432.1 GiB = active raid1 sdc2[1]
md126: [2/1] [_U] =  69.7 GiB = active raid1 sdb1[1]
md127: [2/1] [_U] = 2.834 TiB = active raid1 sda[1]

и версия 5 является комбинацией версии 4 и версии 2

awk '/^md/ {printf "%s: ", $1; line=""; n=3; for (;n<=NF;n++) line=line" "$n;}; /blocks/ {total=$1; total_units="K"; if (total >= 1024*1024*1024) { total_units="T" ; total/= 1024*1024*1024;} else if (total >= 1024*1024) { total_units="G" ; total/= 1024*1024;} else if (total >= 1024) { total_units="M" ; total/= 1024;}; total_ident = total < 100 ? ( total < 10 ? "" : " " ) : ""; total_show = substr((total_ident total), 1, 5); printf "%s %s = %s %s =%s\n", $(NF-1), $NF, total_show, total_units"iB", line}' /proc/mdstat | awk '/\[U+\]/ {print "\033[32m" $0 "\033[0m"}; /\[.*_.*\]/ {print "\033[31m" $0 "\033[0m"}'

пример вывода 5 – такой же, как вывод 4, но с цветовой кодировкой

от Karl Peterson

Это выводит имя массива и статус участников зеленым цветом, если все участники включены. Если участник выходит из строя, статус выводится красным цветом.

Ответ или решение

Теория: Проверка RAID-массивов с использованием mdadm

Обслуживание RAID-массивов на вашем сервере — важная часть обеспечения надежности и доступности данных. Поскольку ваше текущее решение основано на mdadm для управления RAID-массивом, необходимо регулярно проверять состояние всех дисков в массиве. Это особенно важно, поскольку даже при использовании RAID могут возникнуть ситуации, когда повреждения данных на одном из дисков не обнаруживаются до тех пор, пока не происходит отказ другого диска. Таким образом, необходимость регулярной диагностики очевидна.

mdadm предлагает несколько способов мониторинга состояния массива, как через командную строку, так и через автоматизированные уведомления. Основные инструменты проверки включают команду mdadm --detail, просмотр файла /proc/mdstat, а также использование директории /sys/class/block/md*/md/* для запуска синхронизаций и проверок.

Пример: Как проверить состояние RAID-массива

  1. Мануальная проверка с помощью mdadm --detail:

    Используя команду mdadm -D /dev/md0, вы можете получить детальную информацию о состоянии вашего массива /dev/md0. Выход данной команды покажет состояние каждого диска, например, делает ли диск синхронизацию или находится в активном состоянии. Обратите внимание на возвращаемый код команды: ненулевой код указывает на наличие проблемы.

    mdadm -D /dev/md0
  2. Использование /proc/mdstat:

    Файл /proc/mdstat предоставляет краткое резюме статуса всех RAID-массивов. Этот метод особенно полезен для быстрого взгляда на состояние всех ваших массивов сразу:

    cat /proc/mdstat
  3. Инициирование проверки через /sys/class/block/md*/md/*:

    Вы можете инициировать проверку или синхронизацию массива в /dev/md0, используя следующую команду:

    echo check > /sys/class/block/md0/md/sync_action
  4. Автоматизированное оповещение об ошибках:

    Добавьте MAILADDR root в /etc/mdadm.conf, чтобы получать уведомления на почту в случае возникновения ошибок. Убедитесь, что почта для пользователя root перенаправляется на ваш актуальный рабочий адрес.

  5. Создание скриптов для регулярной проверки:

    Вы можете написать скрипт, который будет регистрировать состояние /proc/mdstat и отправлять уведомления в случае обнаружения проблем. Один из таких скриптов можно интегрировать в вашу оболочку, чтобы выводить состояние массива при каждом входе в систему:

    raid_prompt() {
     awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' /proc/mdstat |
     awk '/\[U+\]/ {print "\033[32m" $0 "\033[0m"}; /\[.*_.*\]/ {print "\033[31m" $0 "\033[0m"}'
    }

    И интегрируйте его в PS1, например, так:

    PS1='$(raid_prompt)\n[\u@\h \W]\$ '

Применение: Поддержание надежности RAID-массива

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

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

Капча загружается...