Основы RAID с mdadm
mdadm управляет программным RAID Linux. RAID 0 — stripe для скорости (без избыточности), RAID 1 — зеркало, RAID 5/6 используют чётность для допуска 1/2 отказов дисков, RAID 10 сочетает оба. RAID — не бэкап: он защищает от отказа железа, но не от потери данных.
Диск умирает в 2 ночи. Если данные живут на одном диске — восстанавливаешь из бэкапа и узнаёшь, насколько он свежий. Если на RAID-массиве — система продолжает работать, приходит уведомление, утром меняешь диск с нулевым простоем.
RAID — не магия. RAID 5 с четырьмя дисками не переживёт два одновременных отказа. RAID не защищает от случайного rm -rf, шифровальщика или бага файловой системы, который одинаково испортит все зеркала. Понимание того, от чего каждый уровень RAID реально защищает — и от чего нет — отличает ложное чувство безопасности от настоящего.
После этого урока ты сможешь объяснить, что торгует каждый распространённый уровень RAID, создать программный RAID-массив с mdadm, читать /proc/mdstat и аргументировать, почему RAID — не бэкап.
Уровни RAID: что на что меняется.
| Уровень | Минимум дисков | Используемая ёмкость | Отказоустойчивость | Применение |
|---|---|---|---|---|
| RAID 0 | 2 | 100% | Нет (один диск = потеря всех данных) | Временное, скорость |
| RAID 1 | 2 | 50% | 1 отказ диска | Загрузочные диски, малые критичные тома |
| RAID 5 | 3 | (N-1)/N | 1 отказ диска | Общее хранилище — хороший баланс |
| RAID 6 | 4 | (N-2)/N | 2 отказа дисков | Архивы, устойчивость к долгой перестройке |
| RAID 10 | 4 | 50% | 1 диск на пару зеркал | БД, высокий IOPS + избыточность |
# RAID 0: два диска по 1 ТБ → 2 ТБ, нулевая избыточность
# Один диск умирает: все 2 ТБ потеряны
# RAID 1: два диска по 1 ТБ → 1 ТБ, любой диск может умереть
# Чтение с любого диска (параллелизм); запись на оба
# RAID 5: четыре диска по 1 ТБ → 3 ТБ
# Чётность распределена: любой один диск может отказать
# Перестройка читает ВСЕ оставшиеся диски — риск в окне перестройки
# RAID 6: четыре диска по 1 ТБ → 2 ТБ
# Два слоя чётности: выживает при любых двух одновременных отказах
# Запись медленнее чем RAID 5 (двойной расчёт чётности)
# RAID 10: четыре диска по 1 ТБ → 2 ТБ
# Сначала зеркалирует (1+1, 1+1), затем страйпит пары зеркал
# Может пережить 2 отказа если они в разных зеркальных парахСоздание программного RAID-массива с mdadm.
# Сценарий: четыре диска по 1 ТБ (/dev/sdb, /dev/sdc, /dev/sdd, /dev/sde)
# Цель: RAID 5, 3 ТБ используемых + 1 диск чётности
# Установить mdadm если не установлен
sudo apt install mdadm
# Создать массив RAID 5
sudo mdadm --create /dev/md0 \
--level=5 \
--raid-devices=4 \
/dev/sdb /dev/sdc /dev/sdd /dev/sde
# mdadm: array /dev/md0 started.
# Массив начинает синхронизацию (построение чётности)
# Следим за прогрессом синхронизации (часы для больших массивов)
cat /proc/mdstat
# Personalities : [raid6] [raid5] [raid4]
# md0 : active raid5 sde[3] sdd[2] sdc[1] sdb[0]
# 3145728 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
# [===================>.] resync = 96.8% (...)
# finish=0.4min speed=144000K/sec
# Сохраняем конфигурацию массива для автосборки при загрузке
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u # включить конфиг mdadm в initramfs
# Форматируем и монтируем после завершения синхронизации
sudo mkfs.ext4 /dev/md0
sudo mkdir /mnt/raid
sudo mount /dev/md0 /mnt/raid
# Добавляем в /etc/fstab
# /dev/md0 /mnt/raid ext4 defaults,nofail 0 2Чтение /proc/mdstat и mdadm —detail.
/proc/mdstat — живое окно статуса RAID. Научись читать его быстро.
cat /proc/mdstat
# Personalities : [raid5]
# md0 : active raid5 sde[3] sdc[1] sdb[0]
# 3145728 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_]
# Расшифровка строки статуса:
# [4/3] = массив ожидает 4 диска, сейчас 3 (один отсутствует/упал)
# [UUU_] = состояние дисков: U=работает, _=отсутствует/упал; 4-я позиция — упавший диск
# sdd отсутствует в списке устройств — он упал
# Подробнее:
sudo mdadm --detail /dev/md0
# State : clean, degraded
# Active Devices : 3
# Failed Devices : 1
# Spare Devices : 0
#
# Number Major Minor RaidDevice State
# 0 8 16 0 active sync /dev/sdb
# 1 8 32 1 active sync /dev/sdc
# - 0 0 2 removed <-- упавший слот
# 3 8 80 3 active sync /dev/sdeLVM-RAID vs mdadm: когда что использовать.
Linux предлагает два пути к программному RAID: mdadm (классический слой md ядра) и встроенная поддержка RAID в LVM (с версии LVM 2.02.89).
# LVM RAID: создать зеркальный LV прямо в LVM
sudo lvcreate --type raid1 -m1 -L 100G -n dbdata myvg
# -m1 = 1 зеркало (2 копии всего, как RAID 1)
# LVM управляет RAID внутренне — нет устройства /dev/md*
# Статус LVM RAID
sudo lvs -a -o +devices,raid_sync_action myvg
# LV Attr LSize Devices Sync Action
# dbdata rwi-aor--- 100.00g dbdata_rimage_0(0),dbdata_rimage_1(0) idle
| Аспект | mdadm | LVM RAID |
|---|---|---|
| Зрелость | 20+ лет, очень стабильный | Надёжен с ~2013 |
| Видимость | /proc/mdstat + mdadm --detail | lvs -a + dmsetup |
| Интеграция с LVM | Стек LVM поверх /dev/md0 | Нативная — один инструмент |
| Документация | Шире | Меньше внешних руководств |
| Рекомендация | Существующие массивы mdadm | Новые LVM-конфигурации |
RAID — не бэкап. Понимай случаи отказа, от которых он не защищает.
# От чего RAID защищает:
# - Один физический диск умирает (RAID 1/5/6/10)
# - Два диска умирают одновременно (RAID 6, RAID 10 в некоторых конфигурациях)
# От чего RAID НЕ защищает:
# - Случайный rm -rf /mnt/raid/important-dir
# -> удалено со всех зеркал мгновенно
# - Шифровальщик-вымогатель
# -> зашифровано на всех дисках одновременно
# - Повреждение файловой системы (баг ядра, отключение питания в момент записи)
# -> записывается на все зеркала; повреждение зеркалируется
# - Тихое повреждение данных (bit rot)
# -> RAID 5/6 может обнаружить по чётности, но не всегда исправить;
# используй btrfs или ZFS с checksums для полной защиты от bit rot
# Ментальная модель:
# RAID = высокая доступность (переносить отказ железа)
# Бэкап = защита данных (восстанавливаться после потери данных)
# Нужны оба. Ни один не заменяет другой.Создание зеркала RAID 1 для тома данных рядом с загрузочным.
# Сценарий: два SSD по 500 ГБ (/dev/sdb, /dev/sdc) для тома WAL базы данных.
# Цель: RAID 1 — 500 ГБ используемых, любой диск может упасть.
# 1. Обнуляем суперблок во избежание путаницы со старыми метаданными
sudo mdadm --zero-superblock /dev/sdb /dev/sdc
# 2. Создаём массив
sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
# mdadm: array /dev/md1 started.
# 3. Ждём начальной синхронизации (зеркало должно быть в синхроне прежде чем защищать)
watch cat /proc/mdstat
# md1 : active raid1 sdc[1] sdb[0]
# 488386584 blocks super 1.2 [2/2] [UU]
# [===================>.] resync = 98.2% (...)
# Ждём пока появится [UU] без строки resync
# 4. Сохраняем конфигурацию
echo "DEVICE partitions" | sudo tee /etc/mdadm/mdadm.conf
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
# 5. Создаём LVM поверх RAID-устройства (лучшая практика для гибкости)
sudo pvcreate /dev/md1
sudo vgcreate walvg /dev/md1
sudo lvcreate -L 400G -n wal walvg
sudo mkfs.xfs /dev/walvg/wal
sudo mount /dev/walvg/wal /var/lib/postgresql/wal
# Теперь: отказ диска = RAID поглощает; LVM = гибкость для изменения размера▸Частая ошибка
Никогда не пропускай начальную синхронизацию RAID. Когда создаёшь массив RAID 5 или RAID 6 и немедленно пишешь данные до завершения расчёта чётности (initial resync), ты пишешь в массив с несогласованной чётностью. Если диск упадёт в этом окне, перестройка даст повреждённые данные — не те, что были, потому что чётность неверна. Массив не предупредит; повреждение будет тихим. Всегда жди, пока /proc/mdstat не покажет [UUUU] без строки resync, прежде чем считать новый RAID 5/6 массив production-safe.
▸Почему это работает
Почему у RAID 5 есть проблема “write hole”? В RAID 5 запись в страйп требует обновления блока данных и пересчёта блока чётности. Это два отдельных дисковых writes. Если система потеряет питание между ними, чётность теперь несогласована с данными. При следующей загрузке массив не знает, какой write был частичным. Bitmap намерений записи (флаг --bitmap=internal) отслеживает какие страйпы записывались и принудительно ресинхронизирует их при следующей загрузке, сужая зону риска с всего массива до только страйпов в полёте. ZFS и btrfs избегают этого благодаря copy-on-write дизайну.
У тебя есть массив RAID 5 из 4 дисков. /proc/mdstat показывает [4/3] [UUU_]. Коллега говорит 'всё нормально, RAID 5 допускает один отказ диска'. Он прав, и что нужно сделать немедленно?
mdadm управляет программным RAID Linux. Уровни RAID торгуют ёмкостью против избыточности: RAID 0 страйпит для полной ёмкости без отказоустойчивости; RAID 1 зеркалирует при 50% ёмкости с допуском одного отказа; RAID 5 использует распределённую чётность для (N-1)/N ёмкости с допуском одного отказа; RAID 6 двойная чётность для двух отказов; RAID 10 зеркала + страйп для 50% ёмкости с лучшим IOPS и попарной отказоустойчивостью. Создавай массивы с mdadm --create, следи с cat /proc/mdstat и mdadm --detail, сохраняй конфиг в /etc/mdadm/mdadm.conf. LVM-RAID — альтернатива для новых LVM-конфигураций. RAID — не бэкап: защищает от отказа железа, но не от удаления, шифровальщика или повреждения ФС, которые мгновенно распространяются на все зеркала.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.