Я выполняю резервное копирование данных, хранящихся в zpool, состоящем из одного raidz vdev с двумя жесткими дисками. Во время этой операции у меня были ошибки контрольной суммы, и теперь статус выглядит следующим образом:
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 блока по 128К из 1,6Т.
Статус ответа: В настоящее время я не нахожу исчерпывающего ответа на этот вопрос. Если кто-то хочет написать или отредактировать существующий, обратитесь по следующему адресу:
Для 1 теории и их проблемы выглядят так:
Выбор raidz1
над raidz2
. Проблема: нужно как минимум 4 диска для raidz2
. Хотя необходимость в избыточности очевидна, бесполезно постоянно предлагать лекарство от сбоя избыточности в большей избыточности. Было бы гораздо полезнее понять, как наилучшим образом использовать имеющуюся у вас избыточность.
Выбор raidz1
над mirror
. Проблема: На первый взгляд, разница между ними заключается в эффективности, а не в избыточности. Однако это может быть неправильно. Почему: zfs сохраняет контрольную сумму для каждого блока на каждом диске, но ни один из дисков не сообщил об отдельных ошибках контрольной суммы. Похоже, это говорит о том, что для каждого плохого блока 2 диска содержали разные полезные данные блока, каждый с совпадающей контрольной суммой, и zfs не мог определить, какой из них правильный. Это говорит о том, что было 2 различных вычисления контрольной суммы, и что полезная нагрузка каким-то образом изменилась между ними. Это можно объяснить повреждением ОЗУ и, возможно, (требуется подтверждение) с выбором mirror
над raidz1
, потребовалась бы только одна контрольная сумма.
Повреждение RAM во время записи, а не чтения. Как объяснялось выше, это кажется правдоподобным. Проблема: почему это не было обнаружено как ошибка во время записи? Неужели zfs не проверяет, что пишет? Или, скорее, что полезные данные блока, записанные на разные диски, одинаковы?
Для 2:
Для 3:
Ясно, что mirror
над raidz1
предотвратил бы эту ситуацию?
Я предполагаю, что очистка этого zpool обнаружила проблему. В моем случае я перемещал некоторые данные, и я уничтожил исходные данные, прежде чем я действительно прочитал этот zpool, думая, что у меня есть резервирование на 2 диска. Будет ли здесь мораль чистить zpool, прежде чем доверять его содержимому? Конечно, чистка полезна, но нужна ли она? Например, потребуется ли скраб с 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
файл.