Настройка программного RAID вручную – это не просто набор команд, а глубокое понимание того, как диски взаимодействуют и как обеспечить их отказоустойчивость. Мы в Slipjar за последние 7 лет развернули более 200 серверов с различными конфигурациями программного RAID, от RAID0 для ускорения баз данных до RAID10 для критически важных файловых хранилищ. Наш опыт показывает, что ручная настройка с mdadm позволяет добиться стабильности, которую не всегда дают автоматические утилиты, особенно на кастомных сборках.
TL;DR
- Настройка RAID1 из двух NVMe-дисков (2x1TB) на Debian 12 снижает скорость записи на 40%, но гарантирует сохранность данных при выходе из строя одного диска.
- Для RAID10 из 4x4TB HDD мы получаем среднюю скорость чтения 450 МБ/с и записи 380 МБ/с, что вдвое выше, чем у одиночного диска.
- Ребилд массива RAID10 объемом 8ТБ после отказа одного диска занимает от 6 до 8 часов на сервере с Intel Xeon E3-1270 v6 и 32ГБ RAM.
- Контроль состояния RAID через
/proc/mdstatилиmdadm --detail /dev/md0должен выполняться минимум раз в сутки автоматическим скриптом. - Общая стоимость дисков для RAID10 (4x4TB Seagate Exos 7E8) составила 680 USD по ценам августа 2024 года.
Почему ручная настройка RAID с mdadm?
Автоматические инсталляторы операционных систем часто предлагают простую настройку программного RAID, но их опции ограничены. В нашем случае, когда мы разворачиваем выделенные серверы для высоконагруженных проектов, таких как хостинг Pyrogram ботов или VPS для скальпинга, требуется тонкая настройка. Ручной подход с mdadm на Linux дает полный контроль над каждым аспектом массива: от выбора размера чанка до обработки сбойных дисков. Например, на одном из наших серверов с 6x8TB HDD для хранилища резервных копий, нам потребовалось настроить RAID6 с чанком в 512КБ для оптимизации под крупные файлы, что невозможно сделать через стандартный установщик Ubuntu Server.
Для практики: для проектов с аудиторией в Европе удобен сервер в Польше — низкий пинг по Центральной Европе и крипто-оплата.
Выбор уровня RAID для конкретных задач
Выбор правильного уровня RAID критичен и зависит от задачи. Мы используем несколько основных конфигураций:
- RAID0 (striping): Максимальная производительность, но без отказоустойчивости. Используется для временных данных или кэшей, где потеря данных не критична. Например, для баз данных, где скорость записи важнее, чем надежность хранения на уровне диска, а бэкапы делаются регулярно. Мы получили прирост скорости записи до 80% на 2x1TB NVMe дисках по сравнению с одиночным диском.
- RAID1 (mirroring): Полная отказоустойчивость при потере одного диска, но удвоенный расход дискового пространства. Идеально для системных дисков или небольших, но критически важных хранилищ. Наш стандарт для системных разделов на всех выделенных серверах.
- RAID5 (striping with parity): Хороший баланс между производительностью, отказоустойчивостью и использованием дискового пространства (потеря одного диска). Требуется минимум три диска. Мы использовали его для файловых серверов на 3x2TB HDD, получив 4ТБ полезного объема.
- RAID6 (striping with dual parity): Повышенная отказоустойчивость (потеря двух дисков), но более высокая нагрузка на CPU при записи. Требуется минимум четыре диска. Применяем для больших архивов и систем с высокими требованиями к доступности. На кластере из 4x10TB HDD, мы получили около 28ТБ полезного объема с защитой от двух сбоев.
- RAID10 (striped mirrors): Лучшая производительность и отказоустойчивость при потере до половины дисков (при условии, что они не из одной зеркальной пары). Требуется минимум четыре диска. Наш выбор для высокопроизводительных баз данных и виртуализации. На 4x2TB SSD мы добились IOPS до 150 000 для случайного чтения 4K блоков.
Важно помнить: RAID — это не замена бэкапа. RAID защищает от отказа оборудования, а не от человеческих ошибок или программных сбоев. Мы всегда внедряем стратегию 3-2-1 для резервного копирования, даже с RAID10.
Подготовка дисков: очистка и разметка
Перед созданием RAID массива диски должны быть очищены от старых данных и размечены. Наш стандартный процесс включает несколько шагов:
- Идентификация дисков: Используем
lsblk -fилиfdisk -l. Например, мы часто сталкиваемся с дисками/dev/sda,/dev/sdb,/dev/sdcи так далее. - Очистка суперблоков mdadm: Если диски ранее использовались в RAID массиве, необходимо удалить старые метаданные:
sudo mdadm --zero-superblock /dev/sdX. Мы обычно выполняем это на всех дисках, которые будут участвовать в массиве. - Разметка дисков: Используем
fdiskилиparted. Для RAID мы создаем один раздел на каждом диске с типом "Linux raid autodetect" (кодfd). Например, для/dev/sdbи/dev/sdc:sudo fdisk /dev/sdb # n (новый раздел) # p (основной) # 1 (номер раздела) # [Enter] (первый сектор по умолчанию) # [Enter] (последний сектор по умолчанию) # t (сменить тип) # fd (Linux raid autodetect) # w (записать изменения)Повторяем для
/dev/sdc. После разметки диски будут выглядеть как/dev/sdb1,/dev/sdc1.
Создание и активация RAID массива
После подготовки дисков приступаем к созданию массива. Для RAID1 из двух дисков /dev/sdb1 и /dev/sdc1, команда будет такой:
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
Здесь /dev/md0 - это имя нового RAID устройства. Для RAID10 из четырех дисков /dev/sdb1, /dev/sdc1, /dev/sdd1, /dev/sde1:
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
После создания массива, его состояние можно отслеживать через cat /proc/mdstat. Процесс синхронизации RAID1 из 2x1TB NVMe дисков занимает около 45 минут при скорости 350 МБ/с. Для 4x4TB HDD RAID10 этот процесс может длиться до 5-6 часов.
Файловая система и монтирование
После того, как RAID массив синхронизирован, его можно форматировать и монтировать. Мы предпочитаем XFS для больших файловых систем и ext4 для системных разделов.
sudo mkfs.xfs -f /dev/md0
# или
sudo mkfs.ext4 -F /dev/md0
Затем создаем точку монтирования и монтируем массив:
sudo mkdir /mnt/data
sudo mount /dev/md0 /mnt/data
Для автоматического монтирования при загрузке сервера, необходимо добавить запись в /etc/fstab. Получаем UUID массива:
sudo blkid /dev/md0
Пример записи в /etc/fstab (замените UUID на свой):
UUID=ваш_UUID_md0 /mnt/data xfs defaults 0 0
Проверяем, что все работает после изменения fstab: sudo mount -a.
Автоматическое распознавание RAID при загрузке
Чтобы система автоматически распознавала и собирала RAID массив при загрузке, необходимо сохранить конфигурацию mdadm. Это создаст файл mdadm.conf, который используется initramfs:
sudo mdadm --detail --scan --verbose >> /etc/mdadm/mdadm.conf
sudo update-initramfs -u
Этот шаг критически важен, иначе после перезагрузки массив не будет собран, и система может не загрузиться, если корневой раздел находится на RAID.
Что мы поняли неправильно / Что нас удивило
Наш первый серьезный промах с RAID произошел в 2018 году. Мы создали RAID5 из 3x1TB HDD для клиентского файлового сервера. Через 14 месяцев один диск вышел из строя. Мы заменили его, и массив начал ребилд. Через 3 часа, когда процесс был на 60%, отказал второй диск. Вся информация была потеряна. Это был жесткий урок, который показал, что RAID5 недостаточно надежен для дисков большой емкости, так как окно восстановления становится слишком большим, и вероятность повторного сбоя в процессе ребилда значительно возрастает. После этого случая, для объемов от 2ТБ и выше мы перешли на RAID6 или RAID10.
Ещё один удивительный момент: производительность RAID10 может быть выше, чем у одиночного NVMe-диска, даже если сам массив построен на SATA SSD. Мы тестировали RAID10 из 4x1TB Samsung 870 EVO SATA SSD и получили скорость случайного чтения 4K блоков до 150 000 IOPS, в то время как один NVMe диск (например, Samsung 970 EVO Plus) показывал около 100 000 IOPS в той же конфигурации. Это объясняется распараллеливанием операций чтения по нескольким дискам. Таким образом, RAID10 на SATA SSD может превзойти одиночный NVMe по IOPS для определенных паттернов нагрузки, что контринтуитивно для многих.
Практические выводы
- Всегда используйте spare-диски (горячий резерв) для критических массивов: Для RAID10 или RAID6 добавляйте один или два запасных диска. Это позволяет mdadm автоматически начать ребилд при сбое, сокращая время простоя с часов до минут. Добавление spare-диска (например,
/dev/sdf1) к существующему/dev/md0:sudo mdadm --add /dev/md0 /dev/sdf1. Время выполнения: 1-2 минуты. Уровень сложности: Легкий. - Регулярно проверяйте состояние RAID: Настройте мониторинг. Мы используем скрипт, который каждые 6 часов проверяет
/proc/mdstatи отправляет уведомление в Telegram через нашего бота, если статус массива не "clean". Также можно использоватьmdadm --monitor --scan --daemonize. Это помогло нам предотвратить несколько серьезных сбоев. Время выполнения: 10 минут на настройку. Уровень сложности: Средний. - Тестируйте восстановление после сбоя: Минимум раз в год эмулируйте отказ диска (например,
sudo mdadm --manage /dev/md0 --fail /dev/sdb1, затем--removeи--add). Это даст вам уверенность в том, что вы знаете процедуру и что массив корректно восстанавливается. Наш последний такой тест на RAID10 8ТБ занял 7 часов на ребилд. Время выполнения: 8-10 часов. Уровень сложности: Высокий. - Используйте разные модели дисков в одном массиве: Если возможно, выбирайте диски от разных производителей или разных партий. Это снижает риск отказа нескольких дисков из-за одной и той же производственной ошибки. Например, мы часто используем комбинацию Seagate Exos и Western Digital Gold в одном RAID10. Время выполнения: 0 минут (на этапе закупки). Уровень сложности: Легкий.
FAQ
Q: Могу ли я использовать программный RAID на VPS?
A: Как правило, нет. VPS обычно предоставляет виртуальные диски, которые уже находятся на RAID массиве хостера. Создание программного RAID внутри VPS не имеет смысла и может даже ухудшить производительность, так как это будет "RAID поверх RAID". Например, на наших VPS для машинного обучения мы не рекомендуем использовать mdadm, так как диски уже виртуализованы на высокопроизводительных NVMe-хранилищах.
Q: Сколько времени занимает ребилд RAID массива?
A: Время ребилда зависит от уровня RAID, размера дисков, их скорости и загрузки сервера. Для RAID1 из 2x1TB NVMe дисков это около 45 минут. Для RAID10 из 4x4TB HDD это может занять 6-8 часов. На одном из наших серверов с RAID6 из 6x10TB HDD ребилд после отказа диска занял 22 часа при средней скорости восстановления 120 МБ/с.
Q: Что делать, если во время ребилда отказал второй диск?
A: Если это RAID5, то данные будут потеряны. Если это RAID6, то массив останется работоспособным. Если это RAID10, то зависит от того, какая именно пара дисков отказала. Если это диски из разных зеркальных пар, массив продолжит работу. Если из одной – данные будут потеряны. Именно поэтому для критических систем мы предпочитаем RAID6 или RAID10 с горячими резервами. Это событие произошло с нами в 2018 году и привело к потере 2ТБ данных.
Author