На этой странице
- RAID 1 или RAID 10
- Проверьте, что создал установщик
- Создайте массив
- Мониторинг массива
- mdadm --monitor
- Плановые проверки и метрики
- Замена вышедшего из строя NVMe-накопителя
- 1. Определите накопитель по серийному номеру
- 2. Удалите его из всех массивов
- 3. Запросите замену
- 4. Скопируйте таблицу разделов на новый накопитель
- 5. Верните накопитель в массив и запустите перестроение
- 6. Сделайте новый накопитель загрузочным
- Загрузка с обоих накопителей
- TRIM на md RAID
- Запуск на FlexDedi
Программный 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 |
|---|---|---|---|---|
| 2 | RAID 1 | Один накопитель | Один отказ | Core 16, Core 16X, Pro 32, Pro 48, GPU-серверы |
| 4 | RAID 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 в процессе установки. Прежде чем что-либо менять, выясните, что уже есть:
cat /proc/mdstat
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
mdadm --detail /dev/md0Исправное зеркало выглядит так:
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:
lsblk -o NAME,SIZE,PARTTYPENAME,MOUNTPOINTS
efibootmgr -vЕсли заполненный ESP и загрузочная запись есть только на одном накопителе, при его отказе сервер не загрузится. Как это исправить, описано в разделе о загрузке с обоих накопителей.
Создайте массив
На новом сервере проще всего поручить создание RAID 1 установщику. Если вы создаёте массив сами, например массив для данных на двух свободных накопителях сервера с четырьмя дисками, используйте разделы типа Linux RAID, а не диски целиком, и оставьте немного места в конце, чтобы массив поместился и на сменный накопитель с чуть меньшим числом секторов:
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 и запишите массив в конфигурацию, чтобы при загрузке он собирался под тем же именем:
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 передаёт ему имя события, массив и, если применимо, устройство-участника — этого достаточно, чтобы отправить сообщение в чат или в вебхук системы оповещения дежурных.
MAILADDR root
PROGRAM /usr/local/sbin/md-alertПосле редактирования файла перезапустите службу и убедитесь, что оповещение действительно приходит. Вторая команда отправляет событие TestMessage для каждого массива:
systemctl restart mdmonitor && systemctl status mdmonitor
mdadm --monitor --scan --test --oneshotПлановые проверки и метрики
Кроме того, в Debian и Ubuntu по расписанию выполняется периодическая проверка согласованности массивов md. Такую проверку можно запустить вручную и посмотреть результат после её завершения:
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, назначаются при загрузке и могут меняться, поэтому определяйте вышедший из строя накопитель по серийному номеру, а не только по имени:
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 device2. Удалите его из всех массивов
Если разделы накопителя входят в несколько массивов, например в корневой и в массив подкачки (swap), пометьте каждый из них как сбойный и удалите:
mdadm --manage /dev/md0 --fail /dev/nvme1n1p2 --remove /dev/nvme1n1p2Если устройство уже пропало из системы, команда mdadm /dev/md0 --remove detached удалит устаревшую запись.
3. Запросите замену
Откройте тикет в поддержку и укажите серийные номера вышедшего из строя и исправного накопителей, чтобы не было сомнений, какой из них менять. FlexDedi держит запасные комплектующие на площадке в каждой локации. Запланируйте окно обслуживания на случай, если для замены потребуется выключить и снова включить питание.
4. Скопируйте таблицу разделов на новый накопитель
После замены с помощью lsblk и nvme list проверьте, какое устройство новое и пустое. Затем скопируйте разметку с исправного накопителя:
sgdisk --replicate=/dev/nvme1n1 /dev/nvme0n1 # new drive first, healthy drive last
sgdisk --randomize-guids /dev/nvme1n15. Верните накопитель в массив и запустите перестроение
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-накопители способны работать гораздо быстрее, поэтому, подняв верхний предел, вы сократите период уязвимости — ценой некоторого снижения скорости ввода-вывода для работающих нагрузок:
sysctl -w dev.raid.speed_limit_max=20000006. Сделайте новый накопитель загрузочным
ESP на новом накопителе пуст. Создайте его заново, как описано в следующем разделе, предварительно удалив из /etc/fstab все записи, которые ссылаются на UUID старого ESP.
Загрузка с обоих накопителей
Зеркалирования корневой файловой системы недостаточно: если откажет накопитель с активным ESP, прошивка должна найти загрузчик на другом. В режиме UEFI отформатируйте второй ESP, скопируйте файлы и зарегистрируйте загрузочную запись. Сначала проверьте имя каталога в /boot/efi/EFI/, например debian или ubuntu:
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 делает это автоматически:
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 при каждом удалении:
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), а сменные накопители берутся из запаса комплектующих на площадке.