open atlas
↑ К треку
Linux: операционная система LIN · 07 · 03

Основы RAID с mdadm

mdadm управляет программным RAID Linux. RAID 0 — stripe для скорости (без избыточности), RAID 1 — зеркало, RAID 5/6 используют чётность для допуска 1/2 отказов дисков, RAID 10 сочетает оба. RAID — не бэкап: он защищает от отказа железа, но не от потери данных.

LIN Senior ◷ 22 min
Уровень
ОсновыJuniorMiddleSenior

Диск умирает в 2 ночи. Если данные живут на одном диске — восстанавливаешь из бэкапа и узнаёшь, насколько он свежий. Если на RAID-массиве — система продолжает работать, приходит уведомление, утром меняешь диск с нулевым простоем.

RAID — не магия. RAID 5 с четырьмя дисками не переживёт два одновременных отказа. RAID не защищает от случайного rm -rf, шифровальщика или бага файловой системы, который одинаково испортит все зеркала. Понимание того, от чего каждый уровень RAID реально защищает — и от чего нет — отличает ложное чувство безопасности от настоящего.

Цель

После этого урока ты сможешь объяснить, что торгует каждый распространённый уровень RAID, создать программный RAID-массив с mdadm, читать /proc/mdstat и аргументировать, почему RAID — не бэкап.

1

Уровни RAID: что на что меняется.

УровеньМинимум дисковИспользуемая ёмкостьОтказоустойчивостьПрименение
RAID 02100%Нет (один диск = потеря всех данных)Временное, скорость
RAID 1250%1 отказ дискаЗагрузочные диски, малые критичные тома
RAID 53(N-1)/N1 отказ дискаОбщее хранилище — хороший баланс
RAID 64(N-2)/N2 отказа дисковАрхивы, устойчивость к долгой перестройке
RAID 10450%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 отказа если они в разных зеркальных парах
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
3

Чтение /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/sde
4

LVM-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
АспектmdadmLVM RAID
Зрелость20+ лет, очень стабильныйНадёжен с ~2013
Видимость/proc/mdstat + mdadm --detaillvs -a + dmsetup
Интеграция с LVMСтек LVM поверх /dev/md0Нативная — один инструмент
ДокументацияШиреМеньше внешних руководств
РекомендацияСуществующие массивы mdadmНовые LVM-конфигурации
5

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-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.