Отчет о том как мы мигрировали с 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
Тесты завершены успешно.
Фактическая миграция
- Собрали mdadm-raid0 [md4] из двух 3TB винчестеров.
- В Windows скопировали на mdadm-raid0 данные с windows-raid0.
- Сохранили образ второго винчестера из windows-raid0 на соседнем сервере (2TB).
- Преобразовали mdadm-raid0 в mdadm-raid5.
- Собрали mdadm-raid0 [md3] из диска 1TB и второго диска из windows-raid0.
- Добавили в 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".
Автор: StepanTomsk