Pull to refresh

shared hotspare для mdadm

Reading time 4 min
Views 14K
(сомневался сюда писать или в системное администрирование)

Я обнаружил, что в интернете очень мало (и не очень внятно) объяснено, как mdadm работает с общими (глобальными) дисками горячей подмены. В заметке я опишу, что это такое, и объясню, почему shared hotspare не отмечены в /proc/mdstat как общие, а вместо этого выглядят как вполне себе локальные.

Что такое hot-spare?


(Я пишу не для новичков, так что галопом по европам)
Если массив обладает избыточностью и один из его дисков вышел из строя, то существует возможность восстановить избыточную информацию на резервный диск. Если диск добавляется в массив руками (админу пришло письмо о сбое, он прочитал письмо, проснулся/оделся, приехал на работу, вынул сбойный диск, вставил запасной, добавил его в массив, дал команду на восстановление избыточности), то такой диск называется cold-spare. Просто «запасной диск».

Если же в сервере есть простаивающий диск, на который осуществляется восстановление избыточности сразу после сбоя любого из дисков массива, то такой диск называется hot-spare. Главное достоинство — оно отребилдится (восстановит избыточность) даже если админ письмо прозевал или не успел вовремя приехать.

Локальные hot-spare

Обычно запасной диск добавляется для массива, то есть если в массиве сбой, то его резервный диск и используется. Если сбой происходит в соседнем массиве, то hot-spare из «чужого» массива не используется.

Это на самом деле логично — если у нас стоит выбор — использовать hot-spare для восстановления избыточности системного раздела или раздела с данными, то надо восстанавливать избыточность раздела с данными. А если системный раздел уже «занял» hot-spare, то будет бяка. Более того, некоторые производители предлагают 1EE hotspare, в которой резервный диск используется и для хранения данных (пустое место «размазано» между дисками массива, обеспечивая возможность быстрого ребилда и увеличивая производительность в нормальном режиме).

Глобальные (общие) hot-spare

Однако, бывает так, что массивов с данными много. И им всем нужны hot-spare диски. Но дисков жалко. И тогда возникает желание иметь «общий» диск, который может быть использован для любого из массивов (а ещё лучше 2-3 таких диска).

Это было вступление. Теперь переходим к сути вопроса.

linux md

mdadm (ядерный модуль в DM-стеке) не поддерживает shared hot-spare. Диск может быть добавлен как hot-spare только в конкретный массив.

Но mdadm поддерживает!

Именно так. mdadm поддерживает, ядерный модуль — нет. Mdadm реализует общий hot-spare методом «перекинуть hotspare с одного массива на другой, повреждённый».

Другими словами, для того, чтобы это сработало, должен быть запущен mdadm в режиме -F (follow). Он же обычно присылает сообщения на почту о проблемах рейда. Большинство современных дистрибутивов его запускают (если есть массивы), но, важно понимать, что он обслуживает только те массивы, которые были собраны из mdadm.conf, а не собранные ручками. (Да-да, тут нас ждёт подстава).

spare-group

Для возможности распределять диски между разными массивами есть понятие spare-group, то есть группа, в пределах которой возможно перекидывание дисков. Таких групп может быть много — и hot-spare переносятся только между ними.

Как легко понять из вышенаписанного про mdadm/linux md, в /proc/mdstat нет и не может быть ничего про spare-group. Потому что это личные мысли и соображения mdadm'а, а ядро про это ни сном, ни духом (файлы-то в /proc создаются модулями ядра...).

Таким образом, обеспечивать shared hot-spare можно только с с помощью mdadm. Тут два варианта: если группа указана для массива, собирающегося при загрузке (/etc/mdadm/mdadm.conf), то там можно указать hot-spare, примерно так:

ARRAY /dev/md1 level=raid1 num-devices=2 metadata=1.2 spares=1 spare-group=myhostparegroupname name=server:1 UUID=18219495:03fda335:3f1ad1ee:a5f5cd44
devices=/dev/sda,/dev/sdb,/dev/sdc
ARRAY /dev/md2 level=raid1 num-devices=2 metadata=1.2 spare-group=myhostparegroupname name=server:2 UUID=18219495:03fda335:3f1ad1ee:a5f5cd45
devices=/dev/sdd,/dev/sde

(сразу отвечаю на вопрос, где столько умных слов взять — mdadm --detail --scan --verbose)

Дописано по сравнению с выводом mdadm тут только spare-group. Обратите внимание — во втором массиве НЕТ hot-spare, однако, т.к. группа указана, то в случае сбоя будет использоваться диск из другого массива с той же самой группой. В нашем случае это будет /dev/md1.

Разумеется, всё это произойдёт, только если у нас есть запущенный в режиме -F mdadm. В debian он в выводе ps выглядит так:
/sbin/mdadm --monitor --pid-file /var/run/mdadm/monitor.pid --daemonise --scan --syslog


Самих групп при этом на одной системе может быть несколько.

Кстати, тут есть мелкая гадость: при вызове mdadm с --detail упоминания о spare-groups не будет, их нужно будет дописывать самим.

Local && global hotspare


А вот тут, увы, йок. Насколько я знаю, mdadm не поддерживает одновременно и локальные (которые будут принадлежать только одному массиву) и общие hotspare. Если есть два массива с одним spare-group, то все hot-spare из одного массива могут быть использованы на благо другого.

Сценарий не такой редкий, как кажется. Вот простенькая топология:

SYS_ARRAY
DATA_ARRAY
2 hot-spare

Логично было бы один hot-spare сделать принадлежащим только DATA_ARRAY, а второй сделать общим, чтобы использовался и как резерв для SYS_ARRAY, и как «второй уровень резерва» для DATA_ARRAY.

Увы, увы, увы, этого нет (если меня разубедят в комментариях, я буду очень рад).
Tags:
Hubs:
+63
Comments 28
Comments Comments 28

Articles