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


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

Скраб сделает это?

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


12
2018-04-09 18:22


Источник




Ответы:


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

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


10
2018-04-10 11:32



Это напрямую противоречит тому, что говорит @Redmumba - и Redmumba предоставляет ссылки на код. Можете ли вы привести некоторые источники за то, что вы говорите? В частности, мне бы хотелось увидеть хорошие цитаты из-за того, почему вы думаете, что копии = N не будут справляться со сбоем всего устройства - это не соответствует чему-либо, что я читал. - James Moore
@James Moore После сбоя всего устройства на этом диске не будет записано никаких блоков. На уровне пула нет избыточности, поэтому нет возможности заменить неисправный диск на новый. Единственный способ правильно восстановить эту ситуацию - сделать полную резервную копию пула, воссоздать его со здоровыми устройствами и восстановить из резервной копии, при этом не допустить повторной перезагрузки перед первой резервной копией. В противном случае пул может не быть импортируемым и его данные потеряны. Это довольно тяжелое бремя по сравнению с избыточными пулами, где восстановление плохого диска выполняется в режиме онлайн и выживает перезагрузка. - jlliagre
Вот ссылка: 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
Однако нужно иметь в виду, что если вы изначально copies=1и вы повысили его до copies=2, то вы, вероятно, захотите снова создать resilver / rescrub, который создаст эти экземпляры. Но @jilliagre верна: некоторые блоки не представляют собой избыточную конфигурацию. Нет никаких гарантий, что блоки установлены на другом устройстве, даже если у вас несколько пулов в пуле. - Andrew M.
функция «копии = N, где N> 1» не предназначена для добавления избыточности. он предназначен для устранения искажения данных. все, записанное в zfs, проверяется или хешируется. когда он читается, контрольная сумма / хэш проверяется. если N = 1, то ошибка проверки контрольной суммы / хеша приведет к ошибке в приложении. если N> 1, то можно проконсультироваться с одной из других копий и использовать для восстановления всех других копий. - longneck


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

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

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

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

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

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


9
2018-04-10 06:29



Проблема заключается в ответе @ jlliagre - пул мертв, если он теряет любое устройство. Тот факт, что у пула все еще есть достаточное количество блоков, кажется, не имеет значения. В любом случае? - James Moore
@JamesMoore вы можете заставить массив в режиме онлайн в деградированном состоянии, если у вас есть первый 1MB устройства, которое не удалось. Предположительно вам просто нужны метаданные с неисправного устройства. Я тестировал это с помощью jpool-стиля zpool, и он работает: восстановление raidz сломанных ярлыков, Я сделал md5sum до и после того, как я сломал zpool, и после импорта была повреждена только файловая система copy = 1. Копии = 2 и копии = 3 файловых систем идеально подобраны. - Jodie C


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

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

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

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

EDIT: после экспериментов, похоже, что zfs выйдет из строя пула, если диск выходит из строя в многодисковом резервном пуле с копиями> = 2. Повреждение данных Parital на одном или нескольких дисках должно оставаться в силе и должно быть исправлено скрабом.


1
2017-07-28 15:39



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