Откат ZFS не включает все файлы

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

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

Если я исследую снимок напрямую через .zfs/snapshot/auto-2024-01-03_00-00, я вижу, что все файлы на месте. Если бы это были один или два файла, я бы просто скопировал их вручную, но файлов сотни.

Как мне вернуть эти файлы на место?

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

Проблема была и с пустыми каталогами. Я не мог их удалить или добавить в них новые файлы. Я не мог даже изменить права доступа к ним с помощью sudo.

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

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

При выполнении отката ZFS крайне важно остановить все процессы, использующие набор данных, перед тем, как продолжать. Файлы, которые сейчас используются — такие как JavaScript-файлы, читаемые веб-сервером, или файлы журналов, такие как access.log — могут предотвратить завершение отката. Вместо этого эти файлы восстанавливаются только после размонтирования и повторного монтирования тома.

Лучшей практикой является остановка всех процессов, взаимодействующих с томом, размонтирование тома, выполнение отката, повторное монтирование, а затем перезапуск процессов. Вот полная последовательность:

# Остановить процессы, использующие набор данных
systemctl stop php-fpm
systemctl stop nginx

# Размонтировать ZFS-том
umount volume/example

# Выполнить откат
zfs rollback volume/example@test

# Повторно смонтировать ZFS-том
zfs mount volume/example

# Перезапустить остановленные процессы
systemctl start nginx
systemctl start php-fpm

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

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

Решение проблемы с ZFS Rollback и отсутствующими файлами

Когда происходит случайное удаление файлов в наборе данных ZFS, особенно в многоуровневых структурах каталогов, основным решением становится использование снимков (snapshot). Вы правильно поступили, сделав откат к последнему снимку. Однако, если после отката вы столкнулись с отсутствием файлов в некоторых каталогах, это может вызвать беспокойство и вопросы.

Природа проблемы

Во-первых, важно понимать, что ZFS использует механизм копирования при записи (Copy-On-Write), который может создавать проблемы, если файлы или каталоги находятся в использовании. Если в момент отката ZFS какие-либо файлы или каталоги использовались активными процессами, это может привести к тому, что изменения не будут отражены корректно. Конечно, если вы видите все файлы в директории /.zfs/snapshot/, это говорит о том, что они на самом деле существуют в снимке, но не были правильно восстановлены из-за состояний блокировки.

Необходимость перезагрузки

Как вы заметили, перезагрузка системы восстановила доступ к файлам. Это связано с тем, что перезагрузка освобождает все блокировки и запускает процессы заново, что позволяет ZFS корректно осуществить откат. Однако важно отметить, что перезагрузка не всегда является лучшим решением, особенно в производственной среде. Она может вызвать незапланированные простои и затруднения.

Рекомендации по предотвращению проблем

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

  1. Остановка процессов: Прежде чем делать откат, убедитесь, что все процессы, работающие с набором данных, остановлены. Это поможет избежать блокировок и ошибок.

  2. Размещение и размонтирование:

    • Перед откатом выполните размонтирование объема.
    • Выполните откат к нужному снимку.
    • Затем смонтируйте объем обратно.
  3. Применение последовательных команд:
    Ниже приведена последовательность команд, которая поможет задать нужный порядок выполнения операций:

    # Остановка процессов
    systemctl stop php-fpm
    systemctl stop nginx
    
    # Размонтирование ZFS объема
    umount volume/example
    
    # Выполнение отката
    zfs rollback volume/example@test
    
    # Снова монтируем ZFS объем
    zfs mount volume/example
    
    # Запуск остановленных процессов
    systemctl start nginx
    systemctl start php-fpm

Заключение

Следуя вышеописанным рекомендациям, вы сможете минимизировать риски, связанные с откатами ZFS. Правильная практика управления процессами и состоянием системного окружения обеспечит надежное восстановление данных без необходимости прибегать к перезагрузке сервера. Помните, что регулярное создание и управление снимками является мощным инструментом для обеспечения стабильности и восстановления данных в критических ситуациях.

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

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