Добавление диска в MDADM RAID 5/6 «на лету»

Сегодня хочу поделиться с вами краткой инструкцией, как добавить диск в существующий RAID 5/6 не пересобирая массив (зачастую это просто нереально - забэкапить 4-10Тб данных) и не останавливая работу сервера на сутки-другие. Данная инструкция написана для линуксовых софтрейдов через mdadm, с аппаратными контроллерами/виндой разговор особый и зачастую очень короткий (никак и все).

Итак, приступим (система - Ubuntu 10.04, но работать должно практически везде).

Первым делом, подключаем диск и день-другой (ну или хотя-бы один раз полная перезапись) гоняем его под нагрузкой, записываем/считываем файлы. Это необходимо чтобы сразу обнаружить проблемы с диском, контроллером, кабелем. Если этого не сделать, и добавить "сбойный" диск в массив, может быть довольно весело (собственно, это случилось со мной, SATA6 диск оказался не очень совместим с SATA1 контроллером. Но благодаря безопасности mdadm потери данных удалось избежать).

0. Проверяем версию mdadm – желательно иметь последнюю стабильную версию. (в часности, в процессе написания этого гайда был найден баг при продолжении работы после сбоя - не устанавливался stripe_cache_size - но это уже должно быть исправлено)

1. Отключаем write intent bitmap, если он у вас конечно был (используется для ускорения пересборки массива в случае сбоя):

mdadm --grow --bitmap=none /dev/md0
2. Добавляем диски в массив как горячая замена (hot spare) – на этом этапе пока на них ничего не начинает писаться, диски будут использоваться в случае сбоя или последующего изменения размера массива.

mdadm /dev/md0 -a /dev/sda1
mdadm /dev/md0 -a /dev/sdb1
Делаем cat /proc/mdstat, и видим что диски добавились как hot spare (S)

Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 sdb1[7](S) sda1[6](S) sdd1[2] sdc1[4] sdh1[0] sdg1[5] sdf1[1]
2929683456 blocks super 1.2 level 6, 1024k chunk, algorithm 2 [5/5] [UUUUU]

3. Проверяем UPS, выдергивая розетку из стены вилку из розетки (хотя розетку тоже можно). Аккумуляторы любят со временем сульфатироваться незаметно для упса, и могут неожиданно сдохнуть за пару секунд.

Несмотря на то, что наличие UPS-а необязательно для безопасного ресайза, с ним спокойнее. Драйвер рейд-массивов в ядре постоянно сохраняет прогресс ресайза, и при сбое в любом месте – может продолжить без проблем.

4. Самая главная команда:

mdadm --grow /dev/md0 --raid-disk=8 --backup-file=/var/backup
backup-file – необходим для сохранения резервной копии данных о массиве в случае сбоя на самом первом этапе изменения размера массива. Само собой файл не нужно ложить на сам рейд . Аналогично можно из RAID-5 сделать RAID-6 указав --level=6 (напомню, что RAID-6 выдерживает смерть 2-х любых дисков, что очень важно, т.к. восстановление большого RAID-5 занимает до 10-20 часов и что-то может произойти в это время...)

Операция изменения размера в среднем происходит со скоростью самого медленного диска. Т.е. если самый медленный диск жмет 60Мб/сек, то mdadm нужен будет один проход по массиву с такой скоростью. В случае терабайтных дисков это около 5 часов, если процессор будет успевать, и медленнее если не будет. Если скорость слишком маленькая – делаем

echo "200000" > /sys/block/md0/md/sync_speed_max
В процессе расширения массива данные остаются доступными, смотреть прогресс можно через /proc/mdstat.

5. После завершения ресайза – расширяем файловую систему. Сначала проверка

e2fsck -f /dev/md0
Затем собственно расширение:

resize2fs /dev/md0
6. Добавляем обратно write intent bitmap: mdadm -G /dev/md0 --force -b /var/md0_intent --bitmap-chunk=65536

7. Перегенерируем конфиг mdadm.conf. Выполняем

mdadm --detail --scan –verbose

И результат вставляем в /etc/mdadm/mdadm.conf

8. Перегенерируем ramfs, чтобы после перезагрузки использовался правильный конфиг mdadm:

update-initramfs -k all –u

Готово

Теперь у вас RAID-массив стал больше, и вам не пришлось платить безумные деньги для того чтобы получить эту возможность. Не забываем про мониторинг – чем больше дисков, тем выше риск один из них перегреть.

PP. С mdadm можно делать и другие веселые вещи – например если у вас маccив из 1Тб дисков, а вдруг нашлись 2 по 500 – их можно объеденить в RAID-0, и добавить в основной массив. А если на этих двух дисках останется по 100Мб свободного места – можно это сделать отдельным разделом, объеденить в RAID-1, и замонтировать туда /boot/ - и тогда можно будет систему полностью перенести на RAID, и грузится без вспомогательных средств (вроде флешек, старых веников и проч.).

PPS. Глядя на количество дисков справа со своего домашнего файлсервера, я начинаю думать, что у меня в детстве наверное был слишком маленький винчестер… Впрочем, могло быть хуже

Комментарии/вопросы – в студию.

RSS@BarsMonster3@14.by