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

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

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

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

zfs
12 голосов | спросил James Moore 9 PMpMon, 09 Apr 2012 22:22:59 +040022Monday 2012, 22:22:59

3 ответа


10

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

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

ответил jlliagre 10 PMpTue, 10 Apr 2012 15:32:34 +040032Tuesday 2012, 15:32:34
9

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

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

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

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

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

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

ответил Andrew M. 10 AMpTue, 10 Apr 2012 10:29:00 +040029Tuesday 2012, 10:29:00
2

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

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

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

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

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

ответил Aaron B 28 J000000Tuesday15 2015, 18:39:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132