mdadm ремонт одного куска / сектора

362
user10186803

Я хочу создать NAS, используя mdadm для RAID и btrfs для обнаружения битров. У меня довольно простая настройка, объединяющая 3 диска по 1 ТБ с mdadm в RAID5, чем btrfs.

Я знаю, что mdadm не может восстановить bitrot. Он может только сказать мне, когда есть несоответствия, но не знает, какие данные верны, а какие нет. Когда я говорю mdadm восстановить мой md0 после того, как я симулирую bitrot, он всегда восстанавливает четность. Btrfs использует контрольные суммы, поэтому он знает, какие данные являются ошибочными, но он не может восстановить данные, так как он не может видеть четность.

Однако я могу запустить скраб btrfs и прочитать системный журнал, чтобы получить смещение данных, не соответствующих его контрольной сумме. Затем я могу перевести это смещение на диск и смещение на этом диске, потому что я знаю, что начальное смещение данных равно md0 (2048 * 512), размеру куска (512K) и макету (симметрично слева). Расположение означает, что в моем первом слое четность находится на третьем диске, во втором слое на втором диске и в третьем слое на первом диске.

Объединяя все эти данные и еще несколько btrfs на основе знаний о формате диска, я могу точно рассчитать, какой кусок какого диска является неисправным. Однако я не могу найти способ заставить mdadm исправить этот конкретный кусок.

Я уже написал сценарий, который меняет четность и дефектный чанк с помощью команды dd, затем запускает восстановление с помощью mdadm и затем меняет их обратно, но это не очень хорошее решение, и я бы очень хотел, чтобы mdadm пометил этот сектор как плохой и не используйте это снова. Так как это начало гнить, шансы высоки, он сделает это снова.

Мой вопрос: есть ли способ сказать mdadm, чтобы он восстановил один чанк (который не является четным) и, возможно, даже пометил сектор диска как плохой? Может быть, создание ошибки чтения IO?

(И я знаю, что ZFS может делать все это самостоятельно, но я не хочу использовать память ECC)

Изменить: этот вопрос / ответ о том, как btrfs RAID6 нестабилен и как ZFS намного более стабильна / полезна. Это не относится к моему вопросу о том, как восстановить один известный дефектный кусок с помощью mdadm.

0
Вам не нужна память ECC для использования ZFS .... Я бы порекомендовал вам использовать ZFS. Attie 5 лет назад 1
«_... Затем я могу перевести это смещение на диск, а смещение на этом диске ..._» - вы планируете быть _far_ слишком практичным с хранилищем ... Это, вероятно, пойдет не так. Attie 5 лет назад 1
Если бы я использовал ZFS без ECC, я бы также не беспокоился о защите битрейта. Оба предотвращают очень редкие ошибки, но я хочу сделать это правильно. Что касается того, что ты слишком занят, ты прав. Но я не вижу лучшего пути. Я знаю, что это возможно, ReadyNas и Synology от Netgear сочетают mdadm и btrfs и сохраняют защиту от битрейта. user10186803 5 лет назад 0
Вы защищаете не только от гниения, но и от других вещей, таких как ошибки чтения / записи (например, высокая запись). Проблема ZFS / ECC была сильно преувеличена и неправильно понята - да, работающая машина может извлечь выгоду из ECC, но для переноса данных в ряд редких проблем придется возникать только правильным способом. Было бы лучше использовать ZFS для описанной вами ситуации ... Как использование BTRFS + MDADM + Scripts без ECC будет менее проблемным, чем ZFS без ECC? Attie 5 лет назад 1
"ReadyNas и Synology _Netgear объединяют mdadm и btrfs и сохраняют защиту bitrot_" Attie 5 лет назад 0
Даже если заданный вопрос не совпадает с [Btrfs over mdadm raid6?] (Https://superuser.com/q/1131701/83694), это [проблема XY] (http://xyproblem.info/) это полностью решается другим вопросом и [ответом] (https://superuser.com/a/1131710/83694). Deltik 5 лет назад 1
Возможный дубликат [Btrfs over mdadm raid6?] (Https://superuser.com/questions/1131701/btrfs-over-mdadm-raid6) Attie 5 лет назад 0
@ Atttie Спасибо за ваш вклад, но я не согласен с утверждением, что память ECC для ZFS - это всего лишь небольшой бонус, а не требование. И да, они делают: [ссылка] (https://community.netgear.com/t5/Using-your-ReadyNAS/Bit-Rot-Protection-explained/td-p/1132146) user10186803 5 лет назад 0
И я не вижу, как это дубликат. Мой оригинальный вопрос - как пометить сектор как плохой и заставить mdadm восстановить этот сектор. Я также не думаю, что это проблема XY, так как я знаю все данные и смещения, мне нужно только указать одной программе использовать данные, полученные из другой программы. Может быть, это невозможно в этой ситуации? user10186803 5 лет назад 0
"_Спасибо за ваш вклад, но я не согласен_" ... достаточно справедливо. Все, что я скажу, это то, что кажется, что вы планируете запускать массив производственных хранилищ с повседневным менталитетом, который следует учитывать только в том случае, если вы находитесь в процессе восстановления "_oh sh * t ... now what_" Режим. Attie 5 лет назад 0
Также это: http://jrs-s.net/2015/02/03/will-zfs-and-non-ecc-ram-kill-your-data/ Attie 5 лет назад 0

2 ответа на вопрос

1
Deltik

Я не могу найти способ сказать mdadm исправить этот конкретный кусок.

Это происходит потому, что когда происходит молчаливое повреждение данных, у md недостаточно информации, чтобы узнать, какой блок молча поврежден.

Я предлагаю вам прочитать мой ответ на вопрос № 4 («Почему по- mdпрежнему используется устройство с недействительными данными?»), Который объясняет это более подробно.

Что еще хуже для предложенного макета, если блок контроля четности страдает от повреждения данных без вывода сообщений, слой Btrfs выше не может его увидеть! Если диск с соответствующим блоком данных выходит из строя и вы пытаетесь заменить его, md будет использовать поврежденную четность и необратимо испортить ваши данные. Только когда этот диск выйдет из строя, Btrfs распознает повреждение, но вы уже потеряли данные.

Это потому, что md не читает из блоков четности, если массив не ухудшен.


Так есть ли способ заставить mdadm восстановить один чанк (который не является четным) и, возможно, даже пометить сектор диска как плохой? Может быть, создание ошибки чтения IO?

Для плохих секторов, которые сам жесткий диск определил, md может легко справиться с этим, потому что плохой сектор идентифицирован для md.

С технической точки зрения вы можете создать плохой сектор hdparm --make-bad-sector, но как узнать, на каком диске находится блок, на который повлияло тихое повреждение данных?

Рассмотрим этот упрощенный пример:

Формула паритета: PARITY = DATA_1 + DATA_2

+--------+--------+--------+ | DATA_1 | DATA_2 | PARITY | +--------+--------+--------+ | 1 | 1 | 2 | # OK +--------+--------+--------+ 

Теперь давайте молча испортим каждый из блоков со значением 3:

+--------+--------+--------+ | DATA_1 | DATA_2 | PARITY | +--------+--------+--------+ | 3 | 1 | 2 | # Integrity failed – Expected: PARITY = 4 | 1 | 3 | 2 | # Integrity failed – Expected: PARITY = 4 | 1 | 1 | 3 | # Integrity failed – Expected: PARITY = 2 +--------+--------+--------+ 

Если бы у вас не было первой таблицы для просмотра, как бы вы узнали, какой блок был поврежден?
Вы не можете знать наверняка.

Вот почему Btrfs и ZFS блокируют контрольную сумму. Это занимает немного больше места на диске, но эта дополнительная информация позволяет системе хранения определить, какой блок лежит.

Из статьи Джеффа Бонвика в блоге «RAID-Z» :

Всякий раз, когда вы читаете блок RAID-Z, ZFS сравнивает его с контрольной суммой. Если диски с данными не вернули правильный ответ, ZFS считывает четность, а затем выполняет комбинаторную реконструкцию, чтобы выяснить, какой диск вернул неверные данные.

Чтобы сделать это с Btrfs на md, вам нужно будет попытаться пересчитать каждый блок до совпадения контрольной суммы в Btrfs, трудоемкий процесс без простого интерфейса, предоставляемого пользователю / скрипту.


Я знаю, что ZFS может делать все это самостоятельно, но я не хочу использовать память ECC

Ни ZFS, ни Btrfs над md не зависят и даже не знают о памяти ECC. Память ECC обнаруживает только незаметное повреждение данных в памяти, поэтому она не зависит от системы хранения.

Я рекомендовал ZFS поверх Btrfs для RAID-5 и RAID-6 (аналог ZFS RAID-Z и RAID-Z2 соответственно), прежде чем в Btrfs over mdadm raid6? и сбой устройства в md RAID, когда ATA перестает отвечать на запросы, но я хотел бы воспользоваться этой возможностью, чтобы наметить еще несколько преимуществ ZFS:

  • Когда ZFS обнаруживает молчаливое повреждение данных, оно автоматически и немедленно исправляется на месте без какого-либо вмешательства человека.
  • Если вам нужно перестроить весь диск, ZFS будет только «восстанавливать» фактические данные, а не работать без необходимости на всем блочном устройстве.
  • ZFS - это комплексное решение для логических томов и файловых систем, что делает его менее сложным в управлении, чем Btrfs поверх md.
  • RAID-Z и RAID-Z2 надежны и стабильны, в отличие от
    • Btrfs на md RAID-5 / RAID-6, который предлагает обнаружение ошибок только в незаметно поврежденных блоках данных (плюс незаметно поврежденные блоки четности могут остаться незамеченными, пока не станет слишком поздно), и нет простого способа исправления ошибок, и
    • Btrfs RAID-5 / RAID-6, в котором « имеется множество серьезных ошибок потери данных ».
  • Если бы я молча повредил весь диск с помощью ZFS RAID-Z2, я бы вообще не потерял данные, тогда как на md RAID-6 я фактически потерял 455 681 inode .
-1
user10186803

Я нашел способ создать ошибку чтения для mdadm.

С помощью dmsetup вы можете создавать логические устройства из таблиц.

Устройства создаются путем загрузки таблицы, в которой указана цель для каждого сектора (512 байт).

От: manpage

В этих таблицах вы можете указать смещения, которые должны возвращать ошибку ввода-вывода, например:

0 4096 linear /dev/sdb 0 4096 1 error 4097 2093055 linear /dev/sdb 4097 

Это создает устройство (1 ГБ) с ошибкой по смещению 4096 * 512.

С какой стати ты это сделал? Создание md-устройства с преднамеренными нефиксированными ошибками препятствует успешному перестроению массива, и, в целом, фиксация таких взломов идет против потока целостности данных, а туннельное зрение ведет к авариям. Вы упомянули: «[Я хочу сделать это правильно] (https://superuser.com/questions/1346523/mdadm-repair-single-chunk-sector/1346547#comment2017223_1346523)», так что вам действительно следует использовать декаду давно установленное решение, ZFS. Deltik 5 лет назад 0