На всех серверах Безлимитный трафик, защита от DDoS и IPMI включены. Без платы за подключение и контракта. Безлимитный трафик на всех серверах Смотреть цены

Руководство · Хранение данных

Программный RAID 1 на NVMe с помощью mdadm

Проверка, создание, мониторинг и восстановление mdadm RAID 1 и RAID 10 на серверах с NVMe, пошаговая замена сбойного диска и загрузка с обоих дисков через UEFI.

  • 7 мин чтения
  • Обновлено
  • Инженерная команда FlexDedi

Для этого руководства

Storage 264

  • AMD EPYC 4565P · 16 ядер
  • 128 ГБ DDR5 ECC
  • 12 × 22 ТБ HDD + 3,84 ТБ NVMe
  • 25 Гбит/с, безлимитный трафик
На этой странице

Программный RAID в Linux — драйвер ядра md, которым управляют с помощью mdadm, — стандартный способ зеркалировать NVMe-накопители на выделенном сервере. Он входит в основную ветку ядра, загружается без специальных драйверов и вместо RAID-контроллера расходует немного процессорного времени. В этом руководстве разберём, когда использовать RAID 1, а когда RAID 10, как проверять и создавать массивы, как их мониторить и как заменить вышедший из строя NVMe-накопитель, не потеряв возможность загрузки.

Команды приведены для Ubuntu 24.04 и Debian 12/13 и выполняются от root. В AlmaLinux и Rocky Linux файл конфигурации — /etc/mdadm.conf, а initramfs пересобирается командой dracut -f.

RAID 1 или RAID 10

НакопителиУровеньПолезная ёмкостьВыдерживаетПримеры у FlexDedi
2RAID 1Один накопительОдин отказCore 16, Core 16X, Pro 32, Pro 48, GPU-серверы
4RAID 10Два накопителяОдин отказ в каждой зеркальной пареPro 64, Max 96, Max 192

RAID 1 записывает каждый блок на оба накопителя и может читать с любого из них, что ускоряет параллельное чтение; скорость записи такая же, как у одного накопителя. RAID 10 распределяет данные (striping) по двум зеркалам, поэтому четыре накопителя дают вдвое больше полезной ёмкости, чем зеркало из двух, и более высокую скорость записи. RAID с чётностью (5 или 6) даёт больше ёмкости, но увеличивает накладные расходы на запись и время перестроения, поэтому для баз данных и ВМ на четырёх NVMe-накопителях обычно выбирают RAID 10.

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

Если у вас Proxmox VE, применяйте вместо этого его зеркало ZFS, поскольку Proxmox не поддерживает mdadm; подробнее — в руководстве «Установка Proxmox VE на выделенный сервер».

Проверьте, что создал установщик

Установщики, в том числе установщики Debian и Ubuntu, могут создавать массивы md в процессе установки. Прежде чем что-либо менять, выясните, что уже есть:

bash
cat /proc/mdstat
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
mdadm --detail /dev/md0

Исправное зеркало выглядит так:

text
Personalities : [raid1]
md0 : active raid1 nvme1n1p2[1] nvme0n1p2[0]
      3749557248 blocks super 1.2 [2/2] [UU]
      bitmap: 1/28 pages [4KB], 65536KB chunk

[2/2] [UU] означает, что в массиве два участника и оба работают. [2/1] с [U_] или [_U] означает, что массив деградировал, а участник с пометкой (F) вышел из строя. Во время перестроения строка recovery = показывает прогресс и расчётное время завершения.

Затем проверьте, как загружается сервер. Прошивка UEFI не может прочитать массив md с форматом метаданных по умолчанию, поэтому системный раздел EFI (ESP) находится вне RAID. Установщики часто создают ESP на каждом накопителе, но монтируют и заполняют только один — в /boot/efi:

bash
lsblk -o NAME,SIZE,PARTTYPENAME,MOUNTPOINTS
efibootmgr -v

Если заполненный ESP и загрузочная запись есть только на одном накопителе, при его отказе сервер не загрузится. Как это исправить, описано в разделе о загрузке с обоих накопителей.

Создайте массив

На новом сервере проще всего поручить создание RAID 1 установщику. Если вы создаёте массив сами, например массив для данных на двух свободных накопителях сервера с четырьмя дисками, используйте разделы типа Linux RAID, а не диски целиком, и оставьте немного места в конце, чтобы массив поместился и на сменный накопитель с чуть меньшим числом секторов:

bash
sgdisk --zap-all /dev/nvme2n1
sgdisk -n 1:0:-100M -t 1:FD00 /dev/nvme2n1
sgdisk --replicate=/dev/nvme3n1 /dev/nvme2n1
sgdisk --randomize-guids /dev/nvme3n1

mdadm --create /dev/md1 --level=1 --raid-devices=2 --bitmap=internal \
  /dev/nvme2n1p1 /dev/nvme3n1p1

Для RAID 10 так же разметьте четыре накопителя и используйте --level=10 --raid-devices=4 с четырьмя разделами. Битовая карта намерений записи (write-intent bitmap) позволяет после сбоя или кратковременного выпадения участника синхронизировать заново только изменившиеся области.

Создайте файловую систему, смонтируйте её по UUID и запишите массив в конфигурацию, чтобы при загрузке он собирался под тем же именем:

bash
mkfs.ext4 /dev/md1
mkdir -p /srv/data
echo "UUID=$(blkid -s UUID -o value /dev/md1) /srv/data ext4 defaults,nofail 0 2" >> /etc/fstab
systemctl daemon-reload && mount /srv/data

mdadm --detail --scan | grep /dev/md1 >> /etc/mdadm/mdadm.conf
update-initramfs -u

Массивом можно пользоваться сразу, пока в фоне идёт начальная синхронизация; следить за ней можно командой watch -n 5 cat /proc/mdstat.

Мониторинг массива

Зеркало, которое деградировало незаметно, — это одиночный накопитель, который рано или поздно откажет, поэтому позаботьтесь о том, чтобы вас об этом уведомили.

mdadm --monitor

В Debian и Ubuntu mdadm --monitor работает как служба mdmonitor. Она сообщает о событиях, таких как Fail и DegradedArray, на адрес MAILADDR, заданный в /etc/mdadm/mdadm.conf, — для этого на сервере нужен работающий почтовый агент (MTA). Если сервер не может отправлять почту, строка PROGRAM вместо этого запускает исполняемый файл на ваш выбор. mdadm передаёт ему имя события, массив и, если применимо, устройство-участника — этого достаточно, чтобы отправить сообщение в чат или в вебхук системы оповещения дежурных.

text
MAILADDR root
PROGRAM /usr/local/sbin/md-alert

После редактирования файла перезапустите службу и убедитесь, что оповещение действительно приходит. Вторая команда отправляет событие TestMessage для каждого массива:

bash
systemctl restart mdmonitor && systemctl status mdmonitor
mdadm --monitor --scan --test --oneshot

Плановые проверки и метрики

Кроме того, в Debian и Ubuntu по расписанию выполняется периодическая проверка согласованности массивов md. Такую проверку можно запустить вручную и посмотреть результат после её завершения:

bash
echo check > /sys/block/md0/md/sync_action
cat /sys/block/md0/md/mismatch_cnt

Если вы используете Prometheus, коллектор mdadm в node exporter отдаёт метрику node_md_disks{state="failed"}; настройте оповещение на любое значение больше нуля. Следите и за самими накопителями: smartd и nvme smart-log часто предупреждают о проблемах ещё до отказа. Оба инструмента описаны в базовой конфигурации безопасности Linux.

Замена вышедшего из строя NVMe-накопителя

Когда накопитель выходит из строя, массив продолжает работать на оставшемся. Замените его как можно скорее: пока перестроение не завершено, ещё один отказ приведёт к потере данных.

1. Определите накопитель по серийному номеру

Имена NVMe-устройств, такие как nvme0 и nvme1, назначаются при загрузке и могут меняться, поэтому определяйте вышедший из строя накопитель по серийному номеру, а не только по имени:

bash
mdadm --detail /dev/md0             # which member is faulty or removed
nvme list                           # device, model and serial number
ls -l /dev/disk/by-id/ | grep nvme  # serial-based names for each device

2. Удалите его из всех массивов

Если разделы накопителя входят в несколько массивов, например в корневой и в массив подкачки (swap), пометьте каждый из них как сбойный и удалите:

bash
mdadm --manage /dev/md0 --fail /dev/nvme1n1p2 --remove /dev/nvme1n1p2

Если устройство уже пропало из системы, команда mdadm /dev/md0 --remove detached удалит устаревшую запись.

3. Запросите замену

Откройте тикет в поддержку и укажите серийные номера вышедшего из строя и исправного накопителей, чтобы не было сомнений, какой из них менять. FlexDedi держит запасные комплектующие на площадке в каждой локации. Запланируйте окно обслуживания на случай, если для замены потребуется выключить и снова включить питание.

4. Скопируйте таблицу разделов на новый накопитель

После замены с помощью lsblk и nvme list проверьте, какое устройство новое и пустое. Затем скопируйте разметку с исправного накопителя:

bash
sgdisk --replicate=/dev/nvme1n1 /dev/nvme0n1   # new drive first, healthy drive last
sgdisk --randomize-guids /dev/nvme1n1

5. Верните накопитель в массив и запустите перестроение

bash
mdadm --manage /dev/md0 --add /dev/nvme1n1p2
watch -n 5 cat /proc/mdstat

Скорость перестроения ограничивается параметрами dev.raid.speed_limit_min и dev.raid.speed_limit_max — обычно 1 000 и 200 000 КБ/с; проверьте свои значения командой sysctl dev.raid. При скорости около 200 МБ/с перестроение зеркала на 3,84 ТБ занимает примерно пять часов (оценка: 3 840 000 МБ ÷ 200 МБ/с ≈ 5,3 часа). NVMe-накопители способны работать гораздо быстрее, поэтому, подняв верхний предел, вы сократите период уязвимости — ценой некоторого снижения скорости ввода-вывода для работающих нагрузок:

bash
sysctl -w dev.raid.speed_limit_max=2000000

6. Сделайте новый накопитель загрузочным

ESP на новом накопителе пуст. Создайте его заново, как описано в следующем разделе, предварительно удалив из /etc/fstab все записи, которые ссылаются на UUID старого ESP.

Загрузка с обоих накопителей

Зеркалирования корневой файловой системы недостаточно: если откажет накопитель с активным ESP, прошивка должна найти загрузчик на другом. В режиме UEFI отформатируйте второй ESP, скопируйте файлы и зарегистрируйте загрузочную запись. Сначала проверьте имя каталога в /boot/efi/EFI/, например debian или ubuntu:

bash
mkfs.vfat -F 32 /dev/nvme1n1p1
mkdir -p /boot/efi2
echo "UUID=$(blkid -s UUID -o value /dev/nvme1n1p1) /boot/efi2 vfat umask=0077,nofail 0 1" >> /etc/fstab
systemctl daemon-reload && mount /boot/efi2
cp -r /boot/efi/. /boot/efi2/
efibootmgr --create --disk /dev/nvme1n1 --part 1 --label "debian disk 2" --loader '\EFI\debian\shimx64.efi'

Обновления GRUB и shim затрагивают только первый ESP, поэтому после них файлы нужно копировать заново. Хук APT делает это автоматически:

bash
cat > /etc/apt/apt.conf.d/99-sync-esp <<'EOF'
DPkg::Post-Invoke { "if mountpoint -q /boot/efi2; then cp -r /boot/efi/. /boot/efi2/; fi"; };
EOF

В Ubuntu вместо этого можно зарегистрировать несколько ESP через dpkg-reconfigure grub-efi-amd64, чтобы GRUB устанавливался на все. В системах с устаревшим режимом BIOS команда dpkg-reconfigure grub-pc позволяет выбрать оба накопителя. Проверьте результат во время окна обслуживания: через консоль KVM выберите второй накопитель в загрузочном меню прошивки.

TRIM на md RAID

RAID 1 и RAID 10 передают запросы discard (TRIM) накопителям-участникам, что помогает NVMe сохранять скорость записи и сдерживать износ. Убедитесь, что discard доходит до массива, а затем используйте периодический таймер fstrim вместо параметра монтирования discard, который отправляет TRIM при каждом удалении:

bash
lsblk --discard /dev/md0   # non-zero DISC-GRAN and DISC-MAX mean TRIM works
systemctl enable --now fstrim.timer
fstrim -av

Есть побочный эффект: если накопитель не возвращает нули для блоков, очищенных командой TRIM, последующая проверка согласованности может показать ненулевой mismatch_cnt для пространства, которое не использует ни одна файловая система. Как накопитель читает освобождённые блоки, показывает nvme id-ns -H /dev/nvme0n1. Небольшое стабильное число расхождений после TRIM само по себе не признак повреждения данных, а вот постоянно растущее значение на нагруженном массиве стоит расследовать.

Запуск на FlexDedi

В каждом сервере FlexDedi есть как минимум два NVMe-накопителя для RAID 1, например в Core 16 ($299/мес.) — 2 × 1,92 ТБ Gen4, а в Pro 32 ($749/мес.) — 2 × 3,84 ТБ Gen5. Для RAID 10 у Pro 64 ($1 349/мес.) есть 4 × 3,84 ТБ Gen5 (7,68 ТБ полезной ёмкости), а у Max 96 ($1 899/мес.) — 4 × 7,68 ТБ (15,36 ТБ полезной ёмкости). Если после замены диска сервер не загружается, его можно восстановить через консоль KVM и режим восстановления (rescue), а сменные накопители берутся из запаса комплектующих на площадке.

Другие руководства

Ваш следующий сервер — через несколько минут.

Закажите Core 16 за $299/мес. или доверьте нашим инженерам подбор парка серверов под ваши задачи.

  • Без платы за подключение
  • Безлимитный трафик
  • Отмена в любой момент