Может ли BTRFS восстанавливаться/продолжать работу после отказа диска в режиме “single”?

Вопрос или проблема

Тестирую btrfs впервые, чтобы посмотреть, смогу ли я использовать его для конкретного проекта.

Работаю в виртуальной машине.

Создал том с этими 3 маленькими и случайно выбранными дисками разного размера.

mkfs.btrfs -d single /dev/sdb /dev/sdc /dev/sdd
mount /dev/sdb /mnt/data

Добавил еще одно устройство для теста

btrfs device add /dev/sde /mnt/data

Создал несколько файлов размером 1 ГБ, чтобы заполнить диски

dd if=/dev/urandom of=1GB_07.bin bs=64M count=16 iflag=fullblock

Я удалил один из дисков из виртуальной машины и перезагрузился. Мне удалось принудительно смонтировать в режиме только для чтения

mount -ro degraded /dev/sdb /mnt/data

Я могу видеть все файлы. Я попытался скопировать их с помощью rsync в другую директорию и не смог скопировать один из созданных мной файлов размером 1 ГБ. Логично, он на отсутствующем диске!

Отсюда, есть ли способ просто “удалить” отсутствующий диск и файлы, которые на нем были, и вернуть возможность работы в режиме чтения/записи? Я просто пытаюсь собрать бокс с набором дисков разного размера. Избыточность не важна для меня здесь, и я не хочу иметь накладные расходы на зеркалирование данных на этом боксе.

Если я потеряю диск с некоторыми данными, я хочу просто заменить/удалить его и заново скопировать данные с источника, чтобы получить новые копии отсутствующих файлов на машине BTRFS.

Это имеет смысл?
Это возможно?

С учетом вашего точного описания, нет, это невозможно, потому что вы также потеряете часть метаданных дерева (и если вам действительно не повезло, вы потеряете также chunk tree (системные сегменты в выводе btrfs fi df), что эквивалентно уничтожению суперблоков и части таблиц inode на файловой системе ext4). Эти отсутствующие метаданные – часть причины, по которой вы были вынуждены монтировать в режиме только для чтения.

По умолчанию BTRFS использует dup mode для метаданных. Это означает, что он хранит 2 копии каждого блока метаданных, но обе сохраняются на одном устройстве (даже если у вас больше одного устройства). В результате этого, если вы потеряете одно устройство из многодискового тома BTRFS, использующего этот профиль метаданных, вы, вероятно, потеряете часть ваших метаданных. Если дерево метаданных так сильно повреждено, скорее всего, большая часть файловой системы будет отсутствовать, и вы, вероятно, вообще не сможете смонтировать файловую систему.

Что вам нужно сделать, это использовать режим raid1 для метаданных. Серьезно, это не так существенно влияет на производительность, как вы думаете, особенно если вы не записываете на файловую систему регулярно, и это предотвратит уничтожение всей файловой системы при сбое одного устройства.

С этим, если устройство выйдет из строя:

Используйте mount -o remount,rw,degraded, чтобы заставить файловую систему снова быть доступной для записи. НЕ ОСТАВЛЯЙТЕ ФАЙЛОВУЮ СИСТЕМУ В ТАКОМ СОСТОЯНИИ, ЕСЛИ ВЫ НЕ ИСПРАВЛЯЕТЕ ЕЕ! Серьезно, могут произойти очень плохие вещи, если оставить файловую систему поврежденной, но доступной для записи.
Удалите каждый файл, затронутый сбоем. Выяснение того, что именно затронуто, в данный момент нетривиально, особенно если у вас есть некоторая степень фрагментации.
После удаления этих файлов и каталогов используйте btrfs device delete для удаления неисправного устройства (если устройство полностью отсутствует, вы можете использовать btrfs device delete missing, чтобы избавиться от него). Использование btrfs replace в этом сценарии, вероятно, потерпит неудачу и не даст вам лучшей производительности. Использование btrfs device delete также исключает требование, чтобы новое устройство было не менее большим, чем старое (и, следовательно, облегчает вашу жизнь, поскольку вы не работаете с устройствами одинакового размера).
Используйте btrfs device add для добавления нового устройства, а затем btrfs balance start -musage=100, чтобы сбалансировать сегменты метаданных (сегменты данных естественным образом сбалансируются по мере копирования потерянных файлов).
Используйте rsync или аналогичный инструмент для копирования обратно данных, которые теперь отсутствуют.

Чтобы более прямо ответить на ваш вопрос, я провел некоторые тесты здесь: https://gist.github.com/chapmanjacobd/bc6e31c8bc3647e0bcb0c43bc0464a9c. И была полезная дискуссия здесь: https://news.ycombinator.com/item?id=34477899. Вкратце, Btrfs в single mode может восстановить некоторые данные, если у него есть достаточно метаданных (-m raid1). Но вы потеряете больше файлов, чем только файлы, которые находились на сбойном диске. Чем больше файлы, тем более вероятно, что их части хранятся в разных блоках (которые могли быть выделены на любом диске).

В Btrfs в режиме raid0 можно восстановить только встроенные экстенты (маленькие файлы, встроенные внутри блоков метаданных).

Чтобы заменить неисправное устройство рабочим, используйте btrfs replace, например

btrfs replace start -r /dev/failed-dev /dev/new-dev /mountpoint

Для мониторинга

btrfs replace status /mountpoint

Ответ или решение

Вопрос, который вы задали, касается возможности восстановления файловой системы Btrfs после сбоя диска в режиме "single". Чтобы предложить наиболее подходящее решение, необходимо детально рассмотреть специфику использования Btrfs, что позволит глубже понять её работу и ограничения в контексте наращивания гибридных систем хранения данных.

Теория

Btrfs (B-Tree Filesystem) — это современная файловая система, спроектированная для улучшенной надежности, масштабируемости и контроля над данными. В отличие от традиционных файловых систем, Btrfs поддерживает такие функции, как мгновенные снимки, сжатие, прозрачная дубликация данных и управление несколькими устройствами. Однако она накладывает определенные ограничения на режимы работы с устройствами из-за своей структуры.

В режиме "single" Btrfs распределяет данные по всем подключённым устройствам, но без каких-либо механизмов избыточности. Это сделано для более эффективного использования пространства, однако такое распределение не защищает данные от потери в случае отказа одного из дисков.

Пример

Воспользовавшись предложенным сценарием, вы создали Btrfs файловую систему в режиме "single" с использованием нескольких небольших и случайно выбранных дисков. После создания и заполнения тома были проведены тесты, которые выявили проблему: один из дисков был удалён, и система перезапущена, в результате чего появилась невозможность записи и частичная потеря данных.

Такой результат объясняется отсутствием избыточности метаданных и данных. По умолчанию Btrfs использует "dup" режим для метаданных, который создает дубли только на том же устройстве, что в случае отказа сильно затрудняет восстановление.

Применение

Для восстановления доступности данных и обеспечения работоспособности файловой системы в случае сбоя следует изменить подход:

  1. Правильная настройка профилей метаданных: Использование режима "raid1" для метаданных может минимизировать риск потери всей файловой системы при сбое одного устройства. Это обеспечит хранение второй копии метаданных на другом устройстве.

  2. Управление поврежденными данными: После отказа устройства можно использовать mount -o remount,rw,degraded, чтобы сделать файловую систему снова доступной для записи. Однако это лишь временное решение; необходимо удалить все файлы, пострадавшие из-за отсутствующего диска.

  3. Удаление отсутствующего диска: Для удаления вышедшего из строя устройства можно воспользоваться командой btrfs device delete missing. Это позволит файловой системе перестраивать свои метаданные.

  4. Замена устройства: Новое устройство можно добавить с помощью btrfs device add, после чего резонно выполнить btrfs balance start -musage=100, чтобы сбалансировать использование метаданных.

  5. Восстановление утерянных данных: После выполнения вышеуказанных шагов можно использовать rsync или аналогичный инструмент для копирования файлов с основного источника на восстановленную файловую систему.

Заключение

Ваш проект по созданию системы хранения данных на основе Btrfs в режиме "single" вполне достижим, однако он требует внимательного подхода к выбору конфигурации и управления системой. Использование режима "single" с минимальной избыточностью может работать в сценариях, где допустима потеря данных, однако в других случаях стоит рассмотреть использование профилей RAID, подходящих для ваших целей.

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

Оцените материал
Добавить комментарий

Капча загружается...