Я создаю резервную копию данных, хранивших в шпульке, состоящей из сингла набеги vdev с 2 жесткими дисками. Во время этой операции я получил ошибки контрольной суммы и теперь взгляды состояния следующим образом:
pool: tmp_zpool
state: ONLINE
status: One or more devices has experienced an error resulting in data
corruption. Applications may be affected.
action: Restore the file in question if possible. Otherwise restore the
entire pool from backup.
see: http://zfsonlinux.org/msg/ZFS-8000-8A
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tmp_zpool ONLINE 0 0 2
raidz1-0 ONLINE 0 0 4
tmp_cont_0 ONLINE 0 0 0
tmp_cont_1 ONLINE 0 0 0
errors: Permanent errors have been detected in the following files:
/some/file
То, что я нахожу сбивающими с толку, - то, что ошибка контрольной суммы появляется на vdev уровне, но не на уровне диска. Возможно, я должен отметить, один из жестких дисков является внутренним, и другой является внешним (это - временная ситуация). Это может быть проблемой с контроллерами жесткого диска?
Есть ли что-нибудь, что я мог попытаться сделать для возвращения затронутого файла? Как очистка ошибки и импорт vdev ухудшаются с только одним из дисков? Я даже не пытался считать файл снова для наблюдения то, что происходит. (Не уверенный, если это влияло бы на что-нибудь.)
Обновление: Я бросил ожидать объяснения того, что могло бы пойти не так, как надо, если я очищаю ошибки и повторную попытку, таким образом, я шел вперед и попробовал это. Я сначала сделал zpool clear
, затем zpool status
не показал ошибок. Затем я пытался считать файлы с ошибками (2 из них в конце), но о соответствующих блоках все еще сообщали как плохих/нечитабельных. На этот раз, zpool status
больше не показывал увеличение ошибок контрольной суммы. Затем, я попробовал к офлайн одному из дисков в raidz1 vdev, и повторите процесс, но результаты не изменились. Всего, я потерял 2 128K блока из 1.6T.
Состояние ответа: В настоящее время я нахожу, что нет никакого всестороннего ответа на этот вопрос. Если кто-то хочет описать один или отредактировать существующего, обратитесь к следующему:
Для 1, теории и их проблемы, кажется:
Выбор raidz1
raidz2
. Проблема: каждому нужен минимум 4 дисков для raidz2
. В то время как потребность в дублировании ясна, не полезно неоднократно предположить, что средство исправления для провального дублирования является большим дублированием. Было бы намного более полезно понять, как лучше всего использовать дублирование, которое Вы имеете.
Выбор raidz1
mirror
. Проблема: На первый взгляд различие между ними, кажется, эффективность, не дублирование. Это могло бы быть неправильно, все же. Почему: zfs сохраняет контрольную сумму с каждым блоком на каждом диске, но никакой диск не сообщил об отдельных ошибках контрольной суммы. Это, кажется, предполагает, что для каждого сбойного блока, эти 2 диска содержали различные полезные нагрузки блока, каждого с контрольной суммой соответствия, и zfs не мог сказать, который корректен. Это предполагает, что было 2 различных вычисления контрольной суммы, и что полезная нагрузка, так или иначе измененная между ними. Это могло быть объяснено повреждением RAM, и возможно (подтверждение потребности) с выбором mirror
raidz1
, только одна контрольная сумма была бы необходима.
Повреждение RAM во время записи, не чтения. Как объяснено выше, это кажется вероятным. Проблема: почему это было не быть обнаруженным как ошибка во время записи? Может случиться так, что zfs не проверяет то, что это пишет? Или скорее что полезные нагрузки блока, записанные в различные диски, являются тем же?
Для 2:
Для 3:
Это ясно это mirror
raidz1
предотвратил бы эту ситуацию?
Я предполагаю, что куст этой шпульки обнаружил проблему. В моем случае я перемещал некоторые данные, и я уничтожил исходные данные, прежде чем я на самом деле считал эту шпульку, думая, что у меня есть 2 дисковых дублирования. Мораль должна была бы здесь вычистить шпульку прежде, чем доверять ее содержанию? Конечно, вычищение полезно, но действительно ли это необходимо? Например, был бы куст быть необходимым с mirror
вместо raidz1
?
Это проблема raidz1 (а также RAID5). Если данные на диске изменяются, но сбоя диска не происходит, чтобы ZFS или RAID-контроллер знал, какой диск вызвал ошибку, он не может узнать, какой диск правильный. С raidz2 (и выше) или RAID6 вы получаете кворум дисков, которые могут решить, какой диск игнорировать для восстановления.
Единственное решение здесь - перезаписать файл, либо путем восстановления резервной копии, либо путем записи / dev / null
в файл.
У меня возникла аналогичная проблема. Я не уверен, что это полезно, но я нашел этот соответствующий пост об ошибках контрольной суммы на уровне vdev от разработчика FreeBSD.
https://lists.freebsd.org/pipermail/freebsd-hackers/2014-October/046330 .html
Ошибки контрольной суммы будут отображаться в raidz vdev вместо листа, если vdev_raidz.c не может определить, какой лист vdev был ответственным. Это могло произойти, если два или более конечных vdev возвращают неверные данные для одного и того же блока, что также может привести к неисправимым ошибкам данных. Я вижу, что у вас есть неустранимые ошибки данных, так что, возможно, это и произошло
Незначительные ошибки проектирования в ZFS также могут привести к тому, что vdev_raidz.c не сможет определить, какой дочерний элемент был ответственен за ошибку контрольной суммы. Однако я видел это только тогда, когда у raidz vdev был зеркальный ребенок. Это может произойти только в том случае, если дочерний элемент является запасным или заменяющим vdev. Активировали ли вы какие-либо запасные части или заменили vdev вручную?
Я сам рассматриваю возможность удаления моего файла zpool.cache
и импорта моего пула для регенерации этого файла zpool.cache
.