Как стать автором
Обновить

Программные рейды: миграция с Windows raid0 на Linux mdadm raid5

Время на прочтение 4 мин
Количество просмотров 14K
Отчет о том как мы мигрировали с Windows raid0 на Linux raid5, какие подводные камни встретили и как их преодолевали.

Предистория. Отдел дизайна обслуживается файловым сервером под управлением Windows 2003. Изначально он проектировался для обмена данными, но со временем его стали использовать для долговременного хранения файлов, несмотря на то что у него программный raid0. Наступило время очередного обновления оборудования. После закупки «неожиданно» выяснилось что на новой материнской плате Windows 2003 не стартует, производитель драйвера не выпускает и рекомендует использовать более новую версию Windows, что неприемлемо по лицензионным соображениям.

В итоге было принято два решения:
  • Перенести сервер в виртуальную машину под KVM
  • Использовать для хранения данных raid5

Вопросов по виртуализации нет — делалось не раз. Основная проблема это нулевой рейд, организованный средствами Windows. Было потрачено время на попытку примонтировать windows-raid0 в linux — не удалось, несмотря на описания в интернете того что это возможно.

Вторая проблема: на Windows сервере винчестеров для raid0 два, по 2TB каждый, весь массив заполнен данными и скопировать их некуда. Новых винчестеров купили тоже два но уже по 3TB. Руководство отдела изначально хотело их присоединить к имеющемуся нулевому рейду и получить виртуальный диск для хранения данных в 10TB.

Путем объяснения удалось убедить в неправильности такого подхода, но убедить докупить третий винчестер на 3TB не удалось, поэтому решили действовать в последовательности:

1) Собрать raid5 с одним отсутствующим винчестером

mdtest# mdadm --create /dev/md4 -l 5 -n 3 /dev/sda1 /dev/sdb1 missing

2) Передать raid5 в Windows и его средствами скопировать данные

3) По завершению копирования из оставшихся дисков собрать raid0 и передать его в качестве третьего блочного устройства в raid5

mdtest# mdadm --create /dev/md3 -l 0 -n 2 /dev/sdc1 /dev/sdd1
mdtest# mdadm --add /dev/md4 /dev/md3

Оттестировали данный вариант в виртуальной машине с меньшим объемом данных — все получается замечательно, по завершению теста имеем raid5, проводим несколько жестких перезагрузок, отключаем-включаем виртуальные винчестеры — рейд живет как и положено — самовосстанавливается и потерь данных нет.

Очень смущает то что, после того как скопированы данные, имеется деградированный массив и он восстанавливается за счёт двух винчестеров с которых они были скопированы, в случае сбоя на этом этапе — полная потеря всей информации. Значит нужно данные где-то предварительно забэкапить. Но все осложняется тем что из свободных винчестеров есть только два по 1TB. Обстановка накаляется, утром данные на сервере должны быть как минимум в доступе на чтение.

Ревизия других серверов показала что у нас есть сервер с 2TB свободного места, это спасает ситуацию, мы можем сохранить образ одного из двух 2TB винчестеров и на этапе восстановление raid5 использовать его в страйпе с винчестером на 1TB, в случае сбоя все данные в сохранности. Итоговая схема:

/dev/md3 - raid0: 1TB + 2TB
/dev/md4 - raid5: 2x3TB + /dev/md3

Приступаем к действиям над реальными данными

Собираем raid5 без одного винчестера, запускаем Windows 2003 под Linux в KVM, начинаем копирование и видим что скорость записи очень низкая 3-6МB/s, при этом запись из-под Linux на тот же деградированный raid5 (утроенного объема данных от оперативной памяти) прошло на средней скорости в 80MB/s, но из-за того что исходные данные можно скопировать только из под Windows это никак не помогает. Да мы знаем что скорость записи на деградированный raid5 снижается, но откуда такая разница между Linux и Windows.

Для теста попробовали из-под Windows копировать данные на одиночный диск — 100MB/s. Может реализация mdadm такова что Windows плохо себя чувствует в операциях на запись в raid? Маловероятно — у нас несколько Windows работают поверх raid1 собранных в mdadm. Эксперимента ради собрали raid1, скорость копирования из под Windows в тех же пределах что и на одиночный диск — примерно 100MB/s.

Наши ошибки в том что мы поверили статье где из контекста утверждалось: «изначально собранный в mdadm raid5 из двух винчестеров и одного отсутствующего является по реализации нулевым рейдом», а также то что тестирование мы проводили только под Linux, начни мы копирование во время тестов из-под Windows проблема была известна раньше.

Тестовая среда должна полностью повторять продуктивную.

Возвращаемся к тестам

Принимается решение собрать из двух 3TB винчестеров raid0, скопировать данные, а затем пересобрать этот массив в raid5.

1) Создаем raid0

mdtest# mdadm --create /dev/md4 -l 0 -n 2 /dev/sda1 /dev/sdb1

2) Копируем данные, на этот раз из-под Windows, скорость записи 60-100MB/s

3) Преобразуем raid0 в raid1

mdtest# mdadm /dev/md4 --grow --level=5
mdadm: level of /dev/md4 changed to raid5

Данная операция производится мгновенно mdadm -D /dev/md4 рапортует о том что у нас raid5

mdtest# mdadm -D /dev/md4
/dev/md4:
     Raid Level : raid5
   Raid Devices : 3
  Total Devices : 2
          State : clean, degraded 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0
    Number   Major   Minor   RaidDevice State
       0     252        0        0      active sync   /dev/dm-0
       1     252        1        1      active sync   /dev/dm-1
       2       0        0        2      removed

4) Добавляем третье блочное устройство

mstest# mdadm --add /dev/md4 /dev/md3
mdadm: added /dev/md3

Смотрим статус:
mdtest# mdadm -D /dev/md4
/dev/md4:
     Raid Level : raid5
   Raid Devices : 3
  Total Devices : 3
          State : clean, degraded, recovering
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1
 Rebuild Status : 2% complete
    Number   Major   Minor   RaidDevice State
       0     252        0        0      active sync   /dev/dm-0
       1     252        1        1      active sync   /dev/dm-1
       3     252        2        2      spare rebuilding   /dev/dm-2

Тесты завершены успешно.

Фактическая миграция

  1. Собрали mdadm-raid0 [md4] из двух 3TB винчестеров.
  2. В Windows скопировали на mdadm-raid0 данные с windows-raid0.
  3. Сохранили образ второго винчестера из windows-raid0 на соседнем сервере (2TB).
  4. Преобразовали mdadm-raid0 в mdadm-raid5.
  5. Собрали mdadm-raid0 [md3] из диска 1TB и второго диска из windows-raid0.
  6. Добавили в mdadm-raid5 третьим блочным устройством mdadm-raid0 [md3].


Примечания

Во время пересборки raid5, для ускорения проводилась оптимизация, stripe_cache_size был увеличен на максимум до 32768: echo 32768 > /sys/block/md4/md/stripe_cache_size. Write Intent Bitmap был отключен: mdadm --grow --bitmap=none /dev/md4.

Если windows-raid0 заполнен до предела, то на нем сильная фрагментация данных, проводить дефрагментацию на 4TB долго, мы вышли из положения копируя в несколько потоков программой Microsoft Richcopy

Очень толковое руководства по командам mdadm "Программный RAID в Linux".
Теги:
Хабы:
+13
Комментарии 18
Комментарии Комментарии 18

Публикации

Истории

Работа

DevOps инженер
39 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн