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