Замена хотсвопом диска в зеркале gmirror под FreeBSD

Ситуация: есть 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.

  1. Определяем, какой диск физически нужно заменить.
  2. Не выключая сервер, вытаскиваем диск.
  3. Сервер несколько секунд ничего не понимает, а потом на полминуты впадает в кому. Нужно немного подождать.
  4. После этого команды
    # geom disk list
    # gmirror list

    помогут обнаружить, что одного диска нет (самое время убедиться в том, что вытащили правильный диск :).

  5. Просим gmirror забыть обо всех дисках, которые сейчас неактивны в зеркале:
    # gmirror forget gm0
  6. gmirror обнаруживает, что da0 нет и забывает про него.
  7. Вставляем новый диск (желательно идентичный тому, с которым в паре он будет работать, вплоть до модели).
  8. Сканируем шину, чтобы система обнаружила новый подключённый диск:
    # : что имеем сейчас?
    # camcontrol devlist 
    
    # : сканируем
    # camcontrol rescan all
    
    # : что получилось?
    # camcontrol devlist
  9. Добавляем в массив новый da0:
    # gmirror insert gm0 da0
  10. gmirror обнаружит новый диск и начнёт синхронизацию данных. Смотрим состав массива:
    # gmirror list
  11. Не пугаемся, если нам кажется, что синхронизация идёт не в том направлении 🙂 Если заменялся da0, то теперь он в списке ПОСЛЕ da1, а не ДО, как был раньше.
  12. Испытываем счастье.

Добавить комментарий