Как ZFS справляется с онлайн-заменой в RAID-Z (теоретически)
Это несколько теоретический вопрос о ZFS и RAID-Z. Для ясности я буду использовать трехдисковый массив с одинарной четностью, но проблема может быть распространена на любое количество дисков и любую четность.
Предположим, у нас есть диски A, B и C в пуле, и что он чистый.
Предположим теперь, что мы физически добавляем диск D с намерением заменить диск C, а диск C по-прежнему функционирует правильно и заменяется только из-за профилактического обслуживания. Некоторые администраторы могут просто дернуть C и установить D, что немного более организовано, поскольку устройствам не нужно менять идентификаторы - однако это временно оставляет массив поврежденным, и поэтому в этом примере предположим, что мы устанавливаем D без отключения или удаления C. Документация Solaris указывает, что мы можем заменить диск, не отключая его, используя такую команду:
zpool replace pool C D
Это должно вызвать повторное переключение на D. Допустим, повторное переключение происходит "вниз" вдоль "курсора". (Я не знаю фактической терминологии, используемой во внутренней реализации.)
Предположим теперь, что на полпути сквозного перехода на диск А происходит сбой. Теоретически, это должно быть восстановимо, так как выше курсор B и D содержат достаточную четность, а ниже курсор B и C содержат достаточную четность. Однако то, является ли это действительно восстанавливаемым, зависит от внутренних проектных решений в ZFS, о которых я не знаю (и которые руководство не говорит в определенных терминах).
Если ZFS продолжает отправлять записи в C под курсором, то все в порядке. Однако, если ZFS внутренне обрабатывает C так, как если бы он ушел, перенастраивая D только из четности между A и B и записывая только A и B под курсором, то мы готовы.
Некоторые эксперименты могут ответить на этот вопрос, но я надеялся, что кто-то здесь уже знает, как ZFS справится с этой ситуацией. Заранее спасибо за любую информацию!
3 ответа
Тестирование с файловым пулом (v28 на FreeBSD 8.3 с использованием md-устройств с файловой поддержкой) предполагает, что оно должно работать. Мне удалось отключить один из оставшихся дисков, пока выполнялся перенос. В идеале, для этого нужно тестировать на реальных дисках и на самом деле получить один, чтобы быть на 100% уверенным, но ZFS была совершенно счастлива позволить мне отключить диск.
Прежде чем отключить md0, пул все еще был полностью ОНЛАЙН, поэтому мне кажется, что ZFS просто зеркально отображает замененный диск на новый диск, но все равно обрабатывает всю партию как доступную во время процесса.
NAME STATE READ WRITE CKSUM
test DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
8480467682579886773 OFFLINE 0 0 0 was /dev/md0
md1 ONLINE 0 0 0
replacing-2 ONLINE 0 0 0
md2 ONLINE 0 0 0
md3 ONLINE 0 0 0 (resilvering)
Диск C по-прежнему используется в RAIDZ точно так же, как и до извлечения из VDev. Как указывает Мэтт, ZFS заменяет диск, превращая заменяющий диск в зеркало заменяющего и восстанавливая заменяющий диск. RAIDZ VDev никогда не ухудшается и никогда не восстанавливается (пока не произойдет сбой A, который полностью отделен от операции замены).
Я не уверен, что это имеет значение.
В большинстве случаев вам не следует использовать RAIDZ, а не зеркала... Если вы это делаете, вы должны делать это с запасным.
Повторное переключение не будет выполнено, если один из дисков, с которых он читает, не работает или недоступен. То же, что и неисправимая ошибка чтения. К этому моменту диск C исчезнет...