Ситуация: есть RAID-массив из двух SATA-дисков в зеркале, созданном с помощью gmirror под FreeBSD.
Необходимо заменить один диск, не останавливая работы сервера.
Капля теории
На тему собственно создания зеркала на GEOM есть много
статей.
При создании зеркала gmirror синхронизирует все данные, включая MBR, гласит
http://people.freebsd.org/~rse/mirror/ (раздел Summary -> GEOM mirror on whole disk). Если при отказе диска сервер умер, можно загрузиться с оставшегося диска, вне зависимости от того, какой диск вышел из строя. Важно только при загрузке правильно выбрать, с какого диска грузиться.
При работе массива команда
# gmirror list
практически постоянно показывает Flags: DIRTY.
Это нормально: флаг выставляется, когда на диск записывается информация, и в этот момент состояние данных на дисках массива не совпадает. Если на диск постоянно ведётся запись, флаг DIRTY постоянно будет выставлен.
Процедура замены
Предположим, в массиве gm0 присутствуют два диска: da0 и da1. Заменить нужно da0.
В описываемой ситуации использовался camcontrol. В зависимости от контроллера, через который подключены винты, вместо него может понадобиться atacontrol.
- Выводим диск из зеркала:
# gmirror remove gm0 da0
- Определяем, какой диск физически нужно заменить — у выведенного из зеркала диска не будет работать индикатор активности.
- Не выключая сервер, вытаскиваем диск.
- Здесь возможно следующее: сервер несколько секунд ничего не понимает, а потом на полминуты впадает в кому. Нужно немного подождать.
- После этого команды
# geom disk list
# gmirror list
помогут обнаружить, что одного диска нет.
- Если не был выполнен пункт №1, просим gmirror забыть обо всех дисках, которые сейчас неактивны в зеркале:
# gmirror forget gm0
gmirror обнаруживает, что da0 нет и забывает про него.
- Вставляем новый диск (желательно идентичный тому, с которым в паре он будет работать, вплоть до модели).
- Сканируем шину, чтобы система обнаружила новый подключённый диск:
# camcontrol devlist # что имеем сейчас?
# camcontrol rescan all # сканируем
# camcontrol devlist # что получилось?
- Добавляем в массив новый da0:
# gmirror insert gm0 da0
- gmirror обнаружит новый диск и начнёт синхронизацию данных. Смотрим состав массива:
# gmirror list
- Не пугаемся, если нам кажется, что синхронизация идёт не в том направлении :) Если заменялся da0, то теперь он в списке ПОСЛЕ da1, а не ДО, как был раньше.
- Испытываем счастье.