ZFS: Как восстановить правильное количество копий после потери диска?


12

С zfs, если у вас есть, copies=2а затем вы теряете диск, содержащий некоторые из этих копий, как вы говорите системе, что она должна сделать новую копию блоков данных для затронутых файлов? Или zfs просто начинает добавлять блоки данных для дополнительных копий, как только обнаруживает плохие блоки данных?

Будет ли это делать скраб?

(v0.6.0.56-rc8, пул ZFS версии 28, файловая система ZFS версии 5, Ubuntu 11.10)

Ответы:


10

«копии = 2» (или 3) больше предназначены для использования с пулами без избыточности (один диск или полосы). Цель состоит в том, чтобы иметь возможность восстановить незначительное повреждение диска, а не весь сбой устройства. В последнем случае пул не монтируется, поэтому восстановление блоков не может произойти.

Если у вас есть избыточность (зеркальное отображение / raidz / raidz2 / raidz3), то блоки ditto ничем не отличаются от других, и их очистка / восстановление будет воссоздавать их.


Это напрямую противоречит тому, что говорит @Redmumba - и Redmumba предоставляет ссылки на код. Можете ли вы привести некоторые источники того, что вы говорите? В частности, я хотел бы увидеть хорошие цитаты о том, почему вы думаете, что copy = N не справится с полным отказом устройства - это не совпадает с тем, что я прочитал.
Джеймс Мур

1
@James Moore После полного отказа устройства на этом диске не будет записываться никаких блоков. На уровне пула нет избыточности, поэтому невозможно заменить неисправный диск на новый. Единственный метод для правильного восстановления этой ситуации - создание полной резервной копии пула, воссоздание его с исправными устройствами и восстановление из резервной копии, не допуская непреднамеренной перезагрузки перед выполнением первой резервной копии. В противном случае пул может не импортироваться и его данные будут потеряны. Это довольно обременительно по сравнению с резервными пулами, где восстановление поврежденного диска выполняется в режиме онлайн и переживает перезагрузки.
Jlliagre

1
Вот ссылка: docs.oracle.com/cd/E19082-01/817-2271/gbbvf/… For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state). Я предполагаю, что копии = 2 или 3 не считаются избыточной конфигурацией.
jlliagre

1
Однако следует помнить одну вещь: если у вас изначально была copies=1такая возможность и вы ее повысили copies=2, то вы, вероятно, захотите потом выполнить повторную загрузку / повторную очистку - что создаст эти экземпляры. Но @jilliagre правильно: то же самое, блоки не являются избыточной конфигурацией. НЕТ гарантии, что блоки установлены на другом устройстве, даже если в пуле несколько устройств.
Андрей М.

1
функция «copy = N, где N> 1» не предназначена для добавления избыточности. он предназначен для устранения повреждения данных. все, что написано в zfs, проверено или хэшировано. при обратном чтении проверяется контрольная сумма / хэш. если N = 1, то ошибка проверки контрольной суммы / хэша приводит к ошибке обратно в приложение. если N> 1, то к одной из других копий можно обратиться и использовать для ремонта всех других копий.
Longneck

9

Я нашел этот вопрос действительно интригующим, и, потратив час на изучение документации, я погрузился в код. Вот что я нашел.

Сначала немного терминологии. Блоки Ditto (которые являются этими копиями, а не зеркалами) автоматически создаются при записи, но могут находиться или не находиться в том же виртуальном устройстве (vdev), что и оригинальная копия. С другой стороны, зеркальные блоки всегда отражаются на другом виртуальном устройстве.

Однако код ссылается на оба типа блоков как дочерние. Вы увидите здесь , что Дитто блоки просто дети с io_vd == NULL(это в функции записи). Для зеркального блока io_vdбудет установлено соответствующее виртуальное устройство (например, ваш второй диск).

Имея это в виду, когда он попадает в часть чтения , он рассматривает все дочерние элементы (будь то зеркальные или такие же блоки) как потенциально небезопасные, если он не содержит ожидаемого good_copies, и перезаписывает их по мере необходимости . Похоже, ответ на ваш вопрос - да, он перепишет их, когда у вас будет хотя бы одна хорошая копия, и одно из следующих:

  • Неожиданные ошибки при попытке прочитать данные,
  • Вы переходите на новую версию или
  • Вы чистите.

Уф! Может быть, кто-то может указать на недостатки, но мне понравилось изучать ZFS с помощью этого небольшого упражнения, и я надеюсь, что это поможет!


1
Проблема в ответе @ jlliagre - пул мертв, если он потеряет какое-либо устройство. Тот факт, что в пуле все еще достаточно блоков, кажется, не имеет значения. Любой способ обойти это?
Джеймс Мур

4
@JamesMoore, вы можете принудительно подключить массив к работе в ухудшенном состоянии, если у вас возникли первые 1 МБ неисправного устройства. Предположительно, вам просто нужны метаданные с неисправного устройства. Я проверил это с помощью zpool в стиле jbod, и оно работает: восстановление поврежденных меток raidz . Я сделал md5sum до и после того, как сломал zpool, и после импорта была сломана только файловая система копий = 1. Копии = 2 и копии = 3 файловые системы идеально согласованы.
Джоди С

2

@jlliagre и другие, которые, кажется, думают, что весь zpool умирает, если умирает один из дисков (vdevs), но пул не является избыточным (mirror / raidz). Это неправда; многодисковый бассейн будет всегда выжить один полный отказ диска , даже если он не является зеркальным или RAIDZ.

Метаданные ZFS всегда копируются как минимум 2 раза, поэтому полный отказ всего диска (или любой его части) не приведет к сбою файловой системы. Кроме того, многие файлы, особенно меньшие, не будут распространяться по всем дискам и, следовательно, не обязательно будут повреждены из-за сбоя диска. ОП задает вопрос о случае использования многодискового пула с такими же блоками (копии пользовательских данных> 1). Здесь, один полный отказ диска никогда не должен приводить к потере данных.ZFS всегда будет пытаться поместить блоки ditto далеко от исходного блока, а для пулов с несколькими vdevs это всегда означает для другого vdev (исключение может быть, когда один vdev составляет> 50% пула, что было бы очень необычно) , Метаданные файловой системы также всегда копируются в +1 или +2 раза больше, чем уровень того же уровня , поэтому они всегда сохраняются при сбое диска. Кроме того, если у вас в пуле более трех дисков, вы сможете потерять до половины из них без потери данных; ZFS сохраняет такие же блоки на следующем диске, так что, если вы никогда не потеряете два соседних диска, вы никогда не потеряете данные. (три приличных сбоя диска для того же самого = 2).

Когда имеется достаточно копий данных для доступа к файлу (независимо от того, являются ли они копиями из блоков ditto, mirror или raidz), все недостающие копии данных восстанавливаются при доступе к файлу. Это цель скраба; читать все данные и исправлять все, что плохо, используя избыточные копии. Таким образом, чтобы ответить на вопрос OP напрямую, вам нужно просто почистить после замены неисправного диска, и все копии будут восстановлены.

Как всегда, вы можете легко экспериментировать с концепциями, создавая пулы, чьи vdevs для резервного копирования являются обычными разреженными файлами. Удаляя или повреждая файлы vdev, вы можете смоделировать любой тип сбоя, а также можете проверить целостность пула, файловых систем и данных на этом пути.

РЕДАКТИРОВАТЬ: после эксперимента, похоже, что zfs выйдет из строя пул, если диск выходит из строя в многодисковом резервном пуле с копиями> = 2. Повреждение четных данных на одном или нескольких дисках должно оставаться живучим и исправляться с помощью очистки.


Страшная вещь в подобных экспериментах заключается в том, что они отлично подходят для того, чтобы сообщить мне, что установка не удастся немедленно или, по крайней мере, быстро. Они не настолько хороши для того, чтобы говорить мне, что установка иногда не удалась. В любом случае непонятно, как вернуть пул с ошибкой; Я попытался создать такой пул с тремя разреженными файлами, и удаление одного из разреженных файлов оказалось фатальным для всего пула. zpool replace не заменит сбойный файл, zpool scrub останавливается на 5% (а это очень маленькие пулы), а страница с ошибкой по адресу illumos.org/msg/ZFS-8000-5E не оптимистична.
Джеймс Мур

У меня был такой же результат, что и мои эксперименты, сделанные только после моего ответа. Обычно я использую только raidz, и отвечаю, основываясь на информации из надежных источников (блоги оракулов). Я больше не верю, что многодисковый пул типа JBOD с копиями> 1 может пережить сбой диска.
Аарон Б,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.