Программный RAID на Linux с mdadm: создание, мониторинг, замена диска
Диски умирают. Не вопрос «если», а вопрос «когда», и обычно это случается в пятницу вечером. Программный RAID не отменяет резервные копии, но позволяет пережить отказ одного диска без остановки сервиса и без восстановления из бэкапа. В Linux за это отвечает подсистема md и утилита mdadm. Никакого дорогого контроллера не нужно: подойдут обычные диски и пара команд. В этой статье мы соберём зеркало RAID1 на srv-db01 из домена itpages.lab.local, затем RAID5 для файлового хранилища на srv-linux01, настроим уведомления и пройдём весь сценарий замены отказавшего диска.
Коротко об уровнях, которые встречаются чаще всего. RAID0 — чередование без избыточности: быстро, но отказ любого диска убивает всё. RAID1 — зеркало: данные пишутся на два диска, полезная ёмкость равна одному диску. RAID5 — чередование с распределённой чётностью: нужно минимум три диска, ёмкость n-1, переживается отказ одного диска. RAID6 похож на RAID5, но с двумя блоками чётности, нужно минимум четыре диска, переживается отказ двух. RAID10 — зеркала, объединённые в чередование: быстро и надёжно, но половина места уходит на избыточность. Для баз данных на srv-db01 обычно берут RAID1 или RAID10, для объёмных хранилищ — RAID5 или RAID6.
Шаг 1. Установка и подготовка дисков
Ставим mdadm и смотрим, какие диски доступны:
sudo apt install mdadm # Debian/Ubuntu
sudo dnf install mdadm # RHEL/Rocky
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
NAME SIZE TYPE MOUNTPOINT
sda 40G disk
├─sda1 1G part /boot
└─sda2 39G part /
sdb 20G disk
sdc 20G disk
sdd 20G disk
sde 20G disk
Диски sdb и sdc пойдут под зеркало, sdd и sde вместе с ещё одним позже станут частью массива RAID5. Если на дисках раньше были данные или чужие метаданные RAID, очисти их, иначе mdadm начнёт задавать вопросы:
sudo mdadm --zero-superblock /dev/sdb /dev/sdc
sudo wipefs -a /dev/sdb /dev/sdc
Опытные администраторы советуют не использовать диски целиком, а создавать на каждом один раздел чуть меньшего размера. Причина проста: диски одной модели иногда отличаются на несколько секторов, и при замене может оказаться, что новый диск чуть меньше старого. Раздел с запасом в пару сотен мегабайт решает эту проблему. В нашем лабораторном примере мы для краткости берём диски целиком, но в продакшене лучше сделать разделы.
Шаг 2. Создание зеркала RAID1
Создаём массив /dev/md0 из двух дисков:
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device.
Continue creating array? y
mdadm: array /dev/md0 started.
Сразу после создания начинается первичная синхронизация. Следить за ней можно через /proc/mdstat:
cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdc[1] sdb[0]
20954112 blocks super 1.2 [2/2] [UU]
[=====>...............] resync = 28.4% (5958272/20954112) finish=3.1min speed=80412K/sec
Самое важное здесь — запись [UU]. Каждая буква U означает работающий диск. Если вместо одной появится подчёркивание, например [U_], значит один из дисков выпал, и массив работает в деградированном режиме. Пользоваться массивом можно уже во время синхронизации, но нагрузка в этот период замедлит и синхронизацию, и приложения.
Теперь файловая система и монтирование. Для базы данных на srv-db01 подойдёт XFS или ext4:
sudo mkfs.ext4 /dev/md0
sudo mkdir -p /var/lib/pgdata
sudo mount /dev/md0 /var/lib/pgdata
sudo blkid /dev/md0
/dev/md0: UUID=7c1e5b42-9a0d-4f3c-8a77-0b6a2d1e9f10 TYPE=ext4
В fstab записывай UUID, а не имя /dev/md0: при перезагрузке система иногда называет массивы по-другому, например md127.
echo 'UUID=7c1e5b42-9a0d-4f3c-8a77-0b6a2d1e9f10 /var/lib/pgdata ext4 defaults,nofail 0 2' | sudo tee -a /etc/fstab
Шаг 3. Сохранение конфигурации массива
Чтобы массив собирался при загрузке под тем же именем, сохрани его описание в конфигурацию mdadm и обнови initramfs:
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=srv-db01:0 UUID=a1b2c3d4:e5f60718:293a4b5c:6d7e8f90
sudo update-initramfs -u # Debian/Ubuntu
sudo dracut -f # RHEL/Rocky
На RHEL-подобных системах путь к файлу — /etc/mdadm.conf. Если этот шаг пропустить, массив, скорее всего, соберётся и так (автосборка по метаданным работает), но имя может оказаться неожиданным, и твой fstab перестанет совпадать с реальностью. Лучше сделать это сразу.
Шаг 4. RAID5 для файлового хранилища
На srv-linux01 понадобится ёмкое хранилище с защитой от отказа диска. Добавим три диска sdb, sdc и sdd, а один горячий запасной sde. Запасной диск автоматически включится в массив, как только основной откажет:
sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 --spare-devices=1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
sudo mdadm --detail /dev/md1
/dev/md1:
Version : 1.2
Creation Time : Tue Oct 13 10:12:41 2026
Raid Level : raid5
Array Size : 41908224 (39.97 GiB 42.91 GB)
Raid Devices : 3
Total Devices : 4
State : clean
Active Devices : 3
Working Devices : 4
Spare Devices : 1
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
3 8 64 - spare /dev/sde
Три диска по 20 ГБ дают около 40 ГБ полезного места, один диск уходит на чётность. Обрати внимание на строку State: clean означает, что всё в порядке. Статус clean, degraded или resyncing — первое, на что нужно смотреть при любой диагностике. Так же полезно знать, что для RAID5 на больших дисках восстановление занимает часы, и всё это время массив уязвим к отказу второго диска. Для дисков от нескольких терабайт обдумай RAID6.
Шаг 5. Мониторинг и уведомления
RAID без мониторинга — самая частая причина потери данных: один диск умер, никто не заметил, через месяц умер второй. mdadm умеет следить за массивами сам и отправлять письма. Укажи адрес в mdadm.conf:
echo 'MAILADDR admin@itpages.lab.local' | sudo tee -a /etc/mdadm/mdadm.conf
sudo systemctl enable --now mdmonitor # RHEL: mdmonitor, Debian: mdadm
# проверка доставки: тестовое сообщение по всем массивам
sudo mdadm --monitor --scan --test --oneshot
Если почта на сервере не настроена, письма никуда не уйдут, поэтому проверь исходящую почту отдельно (например, через релей на 192.168.10.5). Кроме писем, добавь в систему мониторинга проверку строки в /proc/mdstat: наличие символа подчёркивания внутри квадратных скобок означает проблему. Простейший вариант для cron или агента мониторинга:
grep -E '\[[U_]*_[U_]*\]' /proc/mdstat && echo DEGRADED || echo OK
Раз в месяц запускай плановую проверку целостности. Она читает все блоки и находит скрытые ошибки на дисках, пока они не превратились в проблему при восстановлении. В Debian и Ubuntu такая задача уже есть в cron (checkarray), в RHEL её нужно включить таймером. Вручную проверка запускается так:
echo check | sudo tee /sys/block/md1/md/sync_action
cat /sys/block/md1/md/mismatch_cnt
0
Ненулевое значение mismatch_cnt — повод насторожиться и посмотреть SMART-показатели дисков командой smartctl -a /dev/sdX.
Шаг 6. Замена отказавшего диска
Теперь главный сценарий. Приходит письмо, что на srv-db01 в массиве md0 вышел из строя диск. Смотрим состояние:
cat /proc/mdstat
md0 : active raid1 sdc[1] sdb[0](F)
20954112 blocks super 1.2 [2/1] [_U]
Флаг (F) рядом с sdb означает failed. Порядок действий такой. Сначала, если диск ещё числится рабочим, помечаем его сбойным вручную, затем извлекаем из массива:
sudo mdadm /dev/md0 --fail /dev/sdb
sudo mdadm /dev/md0 --remove /dev/sdb
Затем физически (или в гипервизоре) меняем диск. Убедись, что ты вынимаешь именно тот диск: сверь серийный номер через smartctl -i /dev/sdb или lsblk -o NAME,SERIAL. Перепутать диски в такой момент — классическая ошибка, которая превращает деградированный массив в потерянный. Когда новый диск появился как /dev/sdb, копируем таблицу разделов (если использовали разделы) и добавляем диск в массив:
sudo sfdisk -d /dev/sdc | sudo sfdisk /dev/sdb # только если используются разделы
sudo mdadm /dev/md0 --add /dev/sdb
mdadm: added /dev/sdb
cat /proc/mdstat
md0 : active raid1 sdb[2] sdc[1]
20954112 blocks super 1.2 [2/1] [_U]
[==>..................] recovery = 12.3% (2577408/20954112) finish=4.5min speed=68000K/sec
Пока идёт восстановление, база продолжает работать. После завершения вернётся состояние [UU]. Если в массиве было загрузочное зеркало, не забудь переустановить загрузчик на новый диск (grub-install /dev/sdb), иначе при отказе второго диска сервер не загрузится.
Шаг 7. Расширение массива и сценарии восстановления
Массив можно наращивать. Допустим, места на RAID5 из трёх дисков не хватает, и в srv-linux01 добавили четвёртый диск. Его сначала добавляют как запасной, а затем увеличивают число активных устройств; mdadm перестроит данные в фоне:
sudo mdadm /dev/md1 --add /dev/sdf
sudo mdadm --grow /dev/md1 --raid-devices=4
mdadm: Need to backup 3072K of critical section..
cat /proc/mdstat
md1 : active raid5 sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
[>....................] reshape = 2.1% (440320/20954112) finish=48.2min
Реорганизация (reshape) длится долго и сильно нагружает диски, поэтому проводи её в тихое время и обязательно после свежей резервной копии. Когда она закончится, останется увеличить файловую систему: resize2fs /dev/md1 для ext4 или xfs_growfs для XFS. Если поверх массива работает LVM, сначала выполни pvresize /dev/md1, затем расширяй тома обычным образом.
Теперь о неприятном: массив не собирается после сбоя. Не паникуй и не пересоздавай его командой —create поверх старого, потому что это самый верный способ потерять данные. Сначала посмотри метаданные дисков командой mdadm —examine /dev/sd[b-e]: счётчик событий (Events) у дисков покажет, кто отстал. Затем попробуй обычную сборку mdadm —assemble —scan, а если один диск слегка отстал, добавь —force. Только после успешной сборки и проверки данных разбирайся, почему диск выпал.
Если диск выходит из строя не сразу, а периодически, проверь кабели, питание и SMART. Команда smartctl -a покажет счётчики Reallocated_Sector_Ct и Current_Pending_Sector: рост этих значений говорит, что диск скоро откажет, и его лучше заменить заранее, не дожидаясь аварии. Хорошо работает такая практика: раз в неделю собирать краткую сводку по всем дискам и массивам в один отчёт и отправлять её в почту команды, чтобы тревожные признаки не терялись.
Частые ошибки и как их избежать
- Считать RAID резервной копией. RAID защищает от отказа диска, но не от удаления файлов, шифровальщика или ошибки администратора: ошибочное удаление мгновенно реплицируется на все диски. Параллельно с RAID настрой отдельное резервное копирование на другой хост, например на srv-linux01.
- Не настроить мониторинг. Деградированный массив молча работает неделями, пока не выйдет из строя второй диск. Проверь MAILADDR, проверь отправку тестовым письмом и добавь проверку /proc/mdstat в мониторинг.
- Брать диски одной партии и не держать запас. Диски одной серии часто умирают с интервалом в недели, а долгое восстановление RAID5 нагружает оставшиеся диски. Старайся смешивать партии, держи горячий запасной диск и проверяй SMART-показатели заранее.
Что дальше
Администрирование Linux — это набор связанных навыков, вот соседние темы серии: