С zfs, если у вас есть copies=2
а затем вы теряете диск, содержащий некоторые из этих копий, как вы сообщите системе, что она должна создать новую копию блоков данных для затронутых файлов? Или zfs просто начинает добавлять блоки данных для дополнительных копий, как только узнает о плохих блоках данных?
Скраб сделает это?
(v0.6.0.56-rc8, пул ZFS версии 28, файловая система ZFS версии 5, Ubuntu 11.10)
«copy = 2» (или 3) больше предназначен для использования с пулами без избыточности (один диск или полосы). Цель состоит в том, чтобы восстановить незначительные повреждения диска, а не отказ всего устройства. В последнем случае пул является несмонтируемым, поэтому восстановление одинаковых блоков невозможно.
Если у вас есть избыточность (зеркалирование / raidz / raidz2 / raidz3), блоки ditto не отличаются от других, и очистка / переназначение создаст их заново.
Мне этот вопрос показался действительно интригующим, и, потратив час на изучение документации, я погрузился в код. Вот что я нашел.
Сначала немного терминологии. Блоки Ditto (которыми являются эти копии, а не зеркала) автоматически создаются при записи, но могут находиться или не находиться на том же виртуальном устройстве (vdev), что и исходная копия. С другой стороны, зеркальные блоки всегда отражаются на другом виртуальном устройстве.
Однако в коде оба типа блоков называются дочерними. Вот увидишь Вот эти блоки - просто дети с io_vd == NULL
(это в функции записи). Для зеркального блока io_vd
будет установлено на соответствующее виртуальное устройство (например, ваш второй диск).
Имея это в виду, когда дело доходит до прочитать часть, он рассматривает всех дочерних элементов (будь то зеркальные или аналогичные блоки) как потенциально небезопасные, если он не содержит ожидаемых good_copies
, и переписывает их по мере необходимости. Похоже, ответ на ваш вопрос - да, он перепишет их, когда у вас будет хотя бы одна хорошая копия и одно из следующих условий:
Фух! Может быть, кто-то сможет указать на недостатки, но мне понравилось изучать ZFS с помощью этого небольшого упражнения, и я надеюсь, что это поможет!
@jlliagre и другие, которые, похоже, думают, что весь zpool умирает, если умирает один из дисков (vdevs), но пул не является избыточным (зеркало / raidz). Это неправда; а многодисковый бассейн будет всегда пережить один полный отказ диска, даже если это не зеркало или raidz.
Метаданные ZFS всегда копируется как минимум 2 раза, поэтому полный отказ всего диска (или любой его части) не приведет к повреждению файловой системы. Кроме того, многие файлы, особенно небольшие, не будут распределены по всем дискам и, следовательно, не будут обязательно быть виноватым в отказе диска. ОП спрашивает о случае многодисковый пул с использованием блоков ditto (копий пользовательских данных> 1). Здесь единичный полный отказ диска должен никогда привести к потере данных. ZFS всегда будет пытаться разместить блоки ditto подальше от исходного блока, а для пулов с несколькими vdev это всегда означает на другом vdev (исключение может быть, когда один vdev составляет> 50% от пула, что было бы очень необычно) . Метаданные файловой системы также всегда копируются в +1 или +2 раза больше, чем уровень того же самого., поэтому он всегда переживет сбой диска. Более того, если у вас в пуле более трех дисков, вы можете потерять до половины из них без потери данных; ZFS сохраняет блоки того же самого на следующем диске, так что если вы никогда не потеряете два соседних диска, у вас никогда не будет потери данных. (отказ трех соседних дисков для ditto = 2).
Когда имеется достаточно копий данных для доступа к файлу (будь то копии из блоков ditto, зеркала или raidz), все недостающие копии данных восстанавливаются при доступе к файлу. В этом цель скраба; прочтите все данные и исправьте все плохие, используя дублирующие копии. Итак, чтобы напрямую ответить на вопрос OP, вам просто нужно выполнить очистку после замены неисправного диска, и все копии будут восстановлены.
Как всегда, вы можете легко поэкспериментировать с концепциями, создав пулы, vdev которых для резервного хранилища представляют собой обычные разреженные файлы. Удаляя или повреждая файлы vdev, вы можете имитировать любой тип сбоя и в процессе проверки проверять целостность пула, файловых систем и данных.
РЕДАКТИРОВАТЬ: после экспериментов похоже, что zfs выйдет из строя пул, если диск выходит из строя в многодисковом неизбыточном пуле с копиями> = 2. Частичное повреждение данных на одном или нескольких дисках должно оставаться живым и должно быть исправлено очисткой.