Предистория. Отдел дизайна обслуживается файловым сервером под управлением 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".
ссылка на оригинал статьи http://habrahabr.ru/post/185030/
Добавить комментарий