С чего начать Первые шаги трек · 15 ступеней
Linux Labs

RAID: зеркало, чётность и degraded

8 мин Linux · md (mdadm 4.3)

RAID собирает диски в одно устройство, которое продолжает работать после отказа одного из них (кроме RAID 0).

Шпаргалка

4 команды Версия для печати
  • cat /proc/mdstat все массивы: [UU] или [U_]
  • sudo mdadm --detail /dev/md0 State: clean, degraded, recovering
  • lsblk диски и массив над ними (raid1)
  • sudo dmesg | grep md/raid когда и какой диск выпал

Обзор

RAID (redundant array of independent disks) собирает несколько дисков в одно блочное устройство. Данные раскладываются по дискам так, что отказ одного не останавливает работу: система читает и пишет через оставшиеся. Исключение — RAID 0: у него нет запасных копий.

В Linux массив собирает ядро (драйвер md), управляет им mdadm. Массив виден как /dev/md0, на нём создают файловую систему (filesystems) или том LVM — так же, как на обычном диске. Аппаратный RAID-контроллер делает то же внутри себя и показывает системе один готовый диск; тогда /proc/mdstat пуст, а состояние смотрят утилитой контроллера.

Уровни

N — число дисков в массиве, все одного размера.

Уровень Дисков минимум Переживает отказ Полезный объём Как устроен
RAID 0 2 ни одного диска N дисков полоса: блоки по очереди на каждый диск
RAID 1 2 N − 1 дисков 1 диск зеркало: на каждом диске полная копия
RAID 5 3 1 диск N − 1 дисков полоса и чётность, по которой восстанавливается любой один диск
RAID 6 4 2 диска N − 2 дисков полоса и две чётности
RAID 10 4 1 диск в каждой паре N / 2 дисков полоса из зеркальных пар

RAID 10 из четырёх дисков переживает отказ двух, если они из разных пар, и теряет данные, если отказали оба диска одной пары. RAID 5 пишет медленнее зеркала: каждая запись пересчитывает чётность.

Зеркало

RAID 1 пишет каждый блок на все диски массива и читает с любого. Из двух дисков по 256 МиБ получается массив на 255 МиБ: часть места занимает суперблок — служебная запись mdadm о составе массива в начале каждого диска.

text
$ lsblk /dev/loop11 /dev/loop12
NAME   MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
loop11   7:11   0  256M  0 loop
└─md0    9:0    0  255M  0 raid1
loop12   7:12   0  256M  0 loop
└─md0    9:0    0  255M  0 raid1

Degraded

Массив degraded (деградированный) работает, но потерял часть избыточности: один или несколько дисков выпали. Данные целы и доступны, запись идёт на оставшиеся диски. Следующий отказ сверх того, что переживает уровень, — потеря данных: у RAID 1 из двух дисков это отказ последнего.

text
$ cat /proc/mdstat
md0 : active raid1 loop12[1](F) loop11[0]
      261120 blocks super 1.2 [2/1] [U_]

[2/1] — дисков в массиве должно быть два, работает один. [U_] — то же по местам: первое место занято (U, up), второе пусто. (F) — диск помечен отказавшим (faulty). В журнале ядра в этот момент:

text
md/raid1:md0: Disk failure on loop12, disabling device.
md/raid1:md0: Operation continuing on 1 devices.

mdadm --detail пишет State : clean, degraded или active, degraded (active — в массив недавно писали). Как читать каждое поле — mdadm.

Пересборка

После замены диска ядро копирует на новый диск всё, что на нём должно быть, — пересборка (rebuild). В /proc/mdstat она видна строкой recovery = N% с прогнозом finish= и скоростью speed=. Сверка копий сразу после создания массива называется resync и выглядит так же; массив в это время уже работает.

Пересборка читает каждый блок уцелевших дисков. На учебной машине массив из образов по 256 МиБ пересобирается за секунды, диск в несколько терабайт — часами, и всё это время массив degraded. Скорость ограничивают /proc/sys/dev/raid/speed_limit_min и speed_limit_max (КиБ/с, на учебной машине 1000 и 200000).

Горячий резерв

Горячий резерв (hot spare, запасной диск) — диск в массиве без своего места: в /proc/mdstat он помечен (S), в mdadm --detail — spare. Когда рабочий диск отказывает, ядро само берёт резерв и начинает пересборку, не дожидаясь человека. Диск, добавленный в исправный массив, становится резервом.

RAID — не резервная копия

RAID защищает от одного: отказа диска. Удалённый файл, mkfs не на том устройстве, испорченная приложением база, шифровальщик — всё это массив сразу записывает на все копии. От этого спасает только копия в другом месте: restic, rsync, tar.

Рецепты

2

Проверить, здоров ли массив

bash
cat /proc/mdstat                         # [UU] — всё на месте
sudo mdadm --detail /dev/md0 | grep -E 'State :|Devices :'

Здоровый массив — State : clean и Failed Devices : 0. Любое degraded, (F) или _ в квадратных скобках — диск надо менять: mdadm.

Потренироваться без дисков

Массив собирается из любых блочных устройств, в том числе из loop-устройств — файлов, подключённых как диск:

bash
truncate -s 256M r1.img r2.img
sudo losetup /dev/loop11 r1.img; sudo losetup /dev/loop12 r2.img
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 \
     --run /dev/loop11 /dev/loop12
sudo mdadm /dev/md0 --fail /dev/loop12   # «сломать» диск
cat /proc/mdstat                         # [2/1] [U_]

После перезагрузки loop-устройства сами не подключаются, а массив из них сам не собирается: это делает служба, которая подключает образы, или ты вручную — mdadm.

Неполадки

3

В /proc/mdstat [U_]

Массив degraded, данные пока целы. Найди выпавший диск ((F) в /proc/mdstat, faulty или removed в mdadm --detail), убери его из массива и добавь исправный — mdadm. Пока пересборка не закончилась, массив беззащитен.

Пересборка идёт часами

На больших дисках так и должно быть: ядро читает уцелевшие диски целиком. Прогноз — finish= в /proc/mdstat. Под нагрузкой пересборка замедляется, но не ниже speed_limit_min. Не выключай машину, пока она идёт.

Диск выпал, а письма не было

Об отказе сообщает mdmonitor — служба mdadm, которая пишет на адрес из MAILADDR в /etc/mdadm/mdadm.conf. Без почтовой службы письмо не уйдёт: на учебной машине в журнале остаётся DegradedArray и sendmail: not found. Поэтому проверку /proc/mdstat добавляют в мониторинг. Подробнее — mdadm.

Опасно

2

Второй отказ во время пересборки

Пока массив degraded или пересобирается, избыточности нет. Диски одной партии и возраста часто отказывают подряд, а пересборка нагружает уцелевший диск сильнее обычного. Меняй диск сразу и держи свежую копию данных вне массива.

RAID 0

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

Термины

3
массив degraded degraded array
RAID, в котором выпал диск: данные целы и доступны, но запаса больше нет — следующий отказ теряет данные. В /proc/mdstat — [2/1] [U_].
пересборка массива (rebuild) array rebuild
Копирование данных на новый диск RAID после замены отказавшего; в /proc/mdstat — recovery = N%. Пока она идёт, массив остаётся degraded. Ещё встречается в: mdadm
горячий резерв (hot spare)
Диск в массиве RAID без своего места, в /proc/mdstat помечен (S): при отказе рабочего диска ядро само начинает пересборку на него. Ещё встречается в: mdadm

См. также

  • mdadm — создание массива, замена диска, mdadm.conf.
  • lvm — тома поверх массива.
  • loop-device — файл вместо диска для опытов.
  • filesystems — файловая система на /dev/md0.
  • lsblk — дерево дисков и массивов.
  • restic — резервные копии, которых RAID не заменяет.
Загрузка…