Продвинутый RAID

Рейтинг: 75.8% · 12 голосов
Специализация LPIC-3 306 (v3.0): кластеры HA (Pacemaker/Corosync), балансировка (LVS, keepalived, HAProxy), DRBD, кластерные и распределённые ФС (GFS2, OCFS2, GlusterFS, Ceph), iSCSI/multipath, advanced RAID/LVM.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Продвинутый RAID

Сообщение Sergey_Sysadmin »

Оглавление курса (14)
  1. Введение в LPIC-3 306: высокая доступность и хранилища
  2. Концепции и теория высокой доступности [361.1]
  3. Кластеры с балансировкой нагрузки [361.2]
  4. Failover-кластеры: Corosync и Pacemaker [361.3, часть 1]
  5. Pacemaker: ресурсы, ограничения, fencing [361.3, часть 2]
  6. DRBD [362.1]
  7. Доступ к кластерному хранилищу [362.2]
  8. Кластерные файловые системы [362.3]
  9. Распределённое хранилище GlusterFS [363.1]
  10. Ceph: архитектура [363.2, часть 1]
  11. Ceph: использование и эксплуатация [363.2, часть 2]
  12. Отказоустойчивость узла: железо и сервисы [364.1]
  13. Продвинутый RAID (вы здесь)
  14. Продвинутый LVM и сетевая отказоустойчивость [364.3 + 364.4]
Урок 12. Продвинутый RAID [364.2]

В прошлом уроке мы собрали базовый массив. Теперь задача администратора другая: держать массив живым годами под реальной нагрузкой. Сюда входит выбор уровня под профиль чтения и записи, замена сдохшего диска без остановки сервиса, горячий резерв, расширение массива на ходу, связка с LVM и, главное, чтобы вы узнали о деградации раньше, чем пользователи. Разберём mdadm на экспертном уровне: что происходит внутри, какие ключи важны и где можно потерять данные одной неосторожной командой.

Изображение

Как это работает

RAID на mdadm - это программный слой между блочными устройствами и файловой системой. Ядро (модуль md) держит суперблок метаданных (версия 1.2, по умолчанию в 4 КБ от начала каждого члена) и из них при загрузке собирает массив. Выбор уровня - это всегда компромисс между ёмкостью, отказоустойчивостью и скоростью. RAID10 (не путать с вложенным 1+0 вручную) даёт лучшую случайную запись и переживает потерю нескольких дисков из разных зеркал, но платит половиной ёмкости. RAID5 хорош на чтение и экономен по дискам, но любая запись - это read-modify-write по чётности, отсюда write penalty и риск в окне ребилда на больших дисках. RAID6 держит двойную чётность и потому стал стандартом для массивов из крупных HDD, где ребилд идёт сутками.

Деградация - это состояние, когда массив потерял избыточность, но ещё отдаёт данные. Тут вступает hot spare: заранее добавленный диск в статусе spare, который md автоматически вводит в строй при выпадении члена и запускает recovery. Чётность пересчитывается на лету, и пока идёт ребилд, массив уязвим - вторая поломка убьёт RAID5. Поэтому скорость ребилда - это не косметика, а время вашего риска.

Рост массива (grow) бывает двух видов. Первый - добавить диски и увеличить число активных устройств с reshape: md переписывает раскладку страйпов по всему массиву, операция долгая и пишет состояние в critical section, чтобы пережить перезагрузку. Второй - заменить все диски на более крупные по очереди, дождаться ребилда каждого, а потом раздвинуть размер. После любого роста надо ещё расширить то, что лежит сверху - LVM PV или файловую систему.

Команды и примеры

Установка отличается по семействам. Debian 13 / Ubuntu 24.04:

Код: Выделить всё

apt install mdadm
RHEL 10 / Fedora 41+:

Код: Выделить всё

dnf install mdadm
Сборка RAID6 из пяти дисков с одним горячим резервом:

Код: Выделить всё

mdadm --create /dev/md0 --level=6 --raid-devices=5 \
  /dev/sd[b-f] --spare-devices=1 /dev/sdg
mdadm --detail /dev/md0
Состояние в реальном времени читаем из ядра, а не из логов:

Код: Выделить всё

cat /proc/mdstat
Строка [U_UUU] показывает, что вторая позиция выпала (нижнее подчёркивание). Имитируем отказ и горячую замену:

Код: Выделить всё

mdadm --manage /dev/md0 --fail /dev/sdc
mdadm --manage /dev/md0 --remove /dev/sdc
mdadm --manage /dev/md0 --add /dev/sdh
Если был spare, md сам начнёт recovery ещё до remove. Скорость ребилда регулируется лимитами ядра (значения в КБ/с) - поднимаем нижний порог, чтобы ребилд не тормозили фоновые проверки:

Код: Выделить всё

sysctl -w dev.raid.speed_limit_min=100000
sysctl -w dev.raid.speed_limit_max=500000
Постоянно - через файл в /etc/sysctl.d/. Рост массива добавлением диска:

Код: Выделить всё

mdadm --add /dev/md0 /dev/sdi
mdadm --grow /dev/md0 --raid-devices=6 \
  --backup-file=/root/md0-reshape.bak
backup-file спасает critical section при сбое питания во время reshape. После reshape растим LVM и ФС. Если RAID отдан под PV:

Код: Выделить всё

pvresize /dev/md0
lvextend -l +100%FREE /dev/vg0/data
# XFS - только онлайн-рост, уменьшать нельзя:
xfs_growfs /mnt/data
# либо для ext4:
resize2fs /dev/vg0/data
Мониторинг и оповещения - это демон mdadm в режиме monitor (через юнит systemd, не cron):

Код: Выделить всё

systemctl enable --now mdmonitor.service
Адрес для писем о деградации задаётся в конфиге. Debian/Ubuntu - /etc/mdadm/mdadm.conf, RHEL/Fedora - /etc/mdadm.conf:

Код: Выделить всё

MAILADDR ops@example.org
PROGRAM /usr/local/sbin/md-alert.sh
Проверка целостности (scrub) запускается записью в sysfs и должна идти по расписанию systemd-таймера:

Код: Выделить всё

echo check > /sys/block/md0/md/sync_action
cat /sys/block/md0/md/mismatch_cnt
Частые грабли
  • Забыли mdadm --detail --scan >> mdadm.conf и обновить initramfs (update-initramfs -u в Debian, dracut -f в RHEL) - после смены имён дисков массив собирается как /dev/md127 и не монтируется по fstab.
  • Запустили reshape без backup-file и поймали отключение питания в critical section - массив может не собраться, данные под угрозой.
  • RAID5 на дисках 8 ТБ+: ребилд идёт так долго, что вероятность второго отказа в окне реальна. Для крупных HDD берите RAID6.
  • Спутали --fail диск с физическим выдёргиванием не того диска. Всегда сверяйте серийник по ls -l /dev/disk/by-id перед заменой.
  • Демон mdmonitor выключен или MAILADDR пустой - деградацию замечают по упавшей производительности через неделю.
  • После grow забыли pvresize/growfs - место в массиве есть, а файловая система его не видит.
  • mismatch_cnt стабильно не ноль на RAID1/10 со свопом - часто ложная тревога, но на data-массиве это сигнал к расследованию.
Мини-лаба
  • Создайте на стенде 6 loop-устройств по 1 ГБ (losetup) и соберите из пяти RAID6 с одним spare.
  • Положите сверху LVM: pvcreate /dev/md0, vgcreate, lvcreate, отформатируйте в XFS и смонтируйте.
  • Запишите тестовый файл с контрольной суммой. Сделайте --fail одного диска и наблюдайте автозамену spare в /proc/mdstat.
  • Поднимите speed_limit_min и засеките, как изменилось время ребилда.
  • Добавьте новый диск и расширьте массив через --grow с backup-file, затем pvresize и xfs_growfs.
  • Настройте mdmonitor с MAILADDR (можно на локальный sendmail) и проверьте письмо, повторно уронив диск.
  • Сверьте контрольную сумму файла - данные должны пережить все манипуляции.
Контрольные вопросы
  • Почему для массива из дисков по 12 ТБ предпочтительнее RAID6, а не RAID5, и при чём тут окно ребилда?
  • Что хранит backup-file при reshape и в каком сценарии его отсутствие приведёт к потере массива?
  • Чем отличается поведение hot spare от ручной замены через --add, и когда recovery стартует автоматически?
  • Какие два параметра ядра ограничивают скорость ребилда и почему опасно задирать только верхний предел?
  • Какие шаги нужны после --grow, чтобы прирост ёмкости стал доступен приложению на XFS поверх LVM?
  • Что означает mismatch_cnt, отличный от нуля, после scrub, и в каких случаях это не повод для паники?
👍3 ❤️1 🔥3 😄 🤔2
Аватара пользователя
pandassmith
Сообщения: 1
Зарегистрирован: 14 май 2026, 18:35

Re: Продвинутый RAID

Сообщение pandassmith »

А если spare один на два массива сразу прописать через spare-group в конфиге - он реально перекинется на тот, где диск сдох? Или это только в теории работает?
👍1 ❤️1 🔥1 😄 🤔1
Аватара пользователя
mevery
Сообщения: 1
Зарегистрирован: 13 май 2026, 05:48

Re: Продвинутый RAID

Сообщение mevery »

Поймал на стенде: после grow место в vg появилось, а lvextend забыл - потом полчаса гадал куда делись гигабайты. xfs_growfs без lvextend вообще молчит, это и сбивает.
👍2 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Отказоустойчивость узла: железо и сервисы [364.1]
Следующая глава →
Продвинутый LVM и сетевая отказоустойчивость [364.3 + 364.4]

Все главы курса «LPIC-3 306: высокая доступность и хранилища»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-3 306: высокая доступность и хранилища»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей