Как безопасно заменить еще не вышедший из строя диск в массиве RAID5 Linux?

26

У меня программный массив RAID5 (Linux md) на 4 диска.

Я хотел бы заменить один из дисков на новый, не переводя массив в ухудшенное состояние и, если возможно, в оперативный режим . Как это было бы возможно?

Это важно, потому что я не хочу:

  • рискуйте нагрузкой на другие диски, чтобы при сбое произошел сбой,
  • рискнуть оказаться в состоянии "без паритета", чтобы у меня не было страховки в течение некоторого времени.

Я полагаю, что делать это онлайн - слишком много, и мне нужно просто скопировать ( dd) данные старого диска на новый в автономном режиме, а затем заменить его, но я думаю, что это теоретически возможно ...

Некоторый контекст : все эти диски вращались почти непрерывно в течение более 5,5 лет. Они все еще работают отлично на данный момент, и все они проходят (длинный) самотестирование SMART. Тем не менее, у меня есть основания полагать, что один из этих четырех дисков не будет работать намного дольше (предполагаемый прогностический сбой).

Totor
источник

Ответы:

36

Использование mdadm 3.3

Начиная с mdadmверсии 3.3 (выпущено в 2013 году, 3 сентября), если у вас ядро версии 3.2+ , вы можете действовать следующим образом:

# mdadm /dev/md0 --add /dev/sdc1
# mdadm /dev/md0 --replace /dev/sdd1 --with /dev/sdc1

sdd1является устройством, которое вы хотите заменить, sdc1является предпочтительным устройством для этого и должно быть объявлено как запасное в вашем массиве.

--withВариант не является обязательным, если не указано, будет использоваться любой доступный запасной.

Старая версия mdadm

Примечание: вам все еще нужно ядро 3.2+ .

Сначала добавьте новый диск в качестве запасного (замените его md0и соответственно sdc1на RAID и дисковое устройство):

# mdadm /dev/md0 --add /dev/sdc1

Затем инициируйте операцию копирования-замены, например, такую ​​как ( sdd1неисправное устройство):

# echo want_replacement > /sys/block/md0/md/dev-sdd1/state 

Результат

Система скопирует все читаемые блоки из sdd1в sdc1. Если речь идет о нечитаемом блоке, он реконструирует его из паритета. После завершения операции первый резервный (здесь sdc1:) станет активным, а неисправный диск будет помечен как неисправный (F), чтобы вы могли удалить его.

Примечание: заслуга Фросшуца и Ансгара Эстерманна, которые нашли оригинальное решение (см. Дублирующий вопрос ).

Старые ядра

Другие ответы предполагают:

  • Джонни «s подход : новообращенный массив RAID6,„заменить“диск, а затем обратно в RAID5,
  • Hauke Laging «s подход : кратко удалить диск из массива RAID5, сделать его частью RAID1 (зеркало) с новым диском и добавить , что зеркало привода обратно в массив RAID5 (теоретического) ...
Totor
источник
2
mdadm --addеще нужно, прежде чем --replaceбудет работать. ( mdadm3.3, Ubuntu 15.10). Если вы выполните --addпосле этого --replace, копирование начнется, как только будет добавлен запасной. (Устройство остается помеченным как «желающий замены»).
Питер Кордес
3

Это может быть возможным, отвечая требованиям

  1. онлайн
  2. не напрягайте диск, за исключением того, который должен быть заменен

Но даже если следующее может сработать, вы, вероятно, не найдете рекомендации такого рода "в книгах" ...

Идея:

  1. Извлеките диск OLD из массива (на короткое время): mdadm --manage /dev/raid5 --fail /dev/OLD
  2. Создайте новое устройство md (RAID-1) из дисков OLD и NEW: mdadm --build /dev/md42 --level=mirror --raid-devices=2 /dev/OLD /dev/NEW
  3. Поместите RAID-1 обратно в массив (вместо / dev / OLD): mdadm --manage /dev/raid5 --re-add /dev/md42

Что должно произойти :-)

  1. RAID-5 синхронизируется с / dev / md42. Это не должно занять много времени.
  2. RAID-5 снова работает нормально (но медленнее).
  3. / dev / NEW синхронизируется с / dev / OLD.

Наблюдайте за ходом синхронизации ( cat /proc/mdstatили mdadm --monitor). Если синхронизация завершена, извлеките RAID-1 из RAID-5, остановите RAID-1, снова добавьте / dev / NEW к RAID-5. Если все в порядке, переписайте суперблоки mdraid в / dev / OLD, чтобы избежать проблем:mdadm --zero-superblock

Предупреждение . Быстрая синхронизация RAID-5 может работать только при использовании растрового изображения. Если у вас его нет, лучше сначала выполнить тест с фиктивным RAID-5 (без растрового изображения). Или добавить один. По крайней мере, добавление внешнего должно быть возможным. В противном случае может потребоваться остановить RAID-5 перед сменой устройств. Если вы загрузитесь с RAID-5, это будет немного сложнее.

Хауке Лагинг
источник
3

Если вы не возражаете против запуска RAID-6 (2 диска с четностью, а не 1), и если вы используете mdadmin 3.1.x или выше, вы можете преобразовать массив RAID-5 в RAID-6, чтобы добавить дополнительный диск с проверкой четности. , Это будет подвергать массив нагрузке во время перестройки, однако. И это имеет некоторые последствия для производительности, так как существует больше дисков четности для обновления во время записи.

Но если он завершится успешно, вы сможете сохранить неисправный диск на месте, а когда он в конечном итоге выйдет из строя, вы все равно получите защиту четности массива. Я думаю, что вы можете преобразовать массив из RAID6 обратно в RAID5, если вы не ждете, чтобы сохранить его как RAID6.

Я не знаю, как в режиме онлайн сохранить массив как RAID-5 и заменить диск, не переводя массив в ухудшенный режим, так как я думаю, что вы должны пометить его как неспособный заменить. Ваша идея с копией dd может быть способом сделать это.

Джонни
источник
@haukelaging FYI теперь возможно начиная с ядра 3.2, смотрите мой ответ .
Тотор