Zfs и Solaris 10: “приятная” ситуация с отказоустойчивыми клонами и снимками.

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

У меня сейчас такая ситуация

zfs list -t snapshot|grep prova
provapool/fs2@oggi               1K      -    31K  -
provapool/fs3@domani            19K      -    32K  -
provapool/fs5@domani             1K      -  32.5K  -

Я хочу удалить “fs2@oggi”

zfs destroy provapool/fs2@oggi
cannot destroy 'provapool/fs2@oggi': snapshot has dependent clones
use '-R' to destroy the following datasets:
provapool/fs1
provapool/fs4
provapool/fs5@domani
provapool/fs5
provapool/fs3@domani
provapool/fs3

Я хочу сохранить fs3 fs4 fs5, поэтому я продвигаю их до независимых fs

zfs promote provapool/fs1
zfs promote provapool/fs4
zfs promote provapool/fs5

Я хочу удалить “fs2@oggi” и…

zfs destroy provapool/fs2@oggi  
cannot destroy 'provapool/fs2@oggi': snapshot has dependent clones
use '-R' to destroy the following datasets:
provapool/fs1
provapool/fs4
provapool/fs5@domani
provapool/fs5
provapool/fs3@domani
provapool/fs3

Как выйти из этой странной ситуации?

Я знаю быстрый способ: сделать резервную копию всего, удалить с опцией -R и заново создать три fs, кто-нибудь знает более хорошее решение?

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

У вас возникла ситуация с ZFS в Solaris 10, когда при попытке удалить снапшот вы сталкиваетесь с проблемой зависимостей, которые препятствуют этому действию. Рассмотрим подробнее вашу ситуацию и предложим решения.

Теория

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

Пример

В вашем случае у вас есть три снапшота:

  • provapool/fs2@oggi
  • provapool/fs3@domani
  • provapool/fs5@domani

Вы пытаетесь удалить снапшот provapool/fs2@oggi, но столкнулись с сообщением об ошибке:

cannot destroy 'provapool/fs2@oggi': snapshot has dependent clones
use '-R' to destroy the following datasets:
provapool/fs1
provapool/fs4
provapool/fs5@domani
provapool/fs5
provapool/fs3@domani
provapool/fs3

Это указывает на зависимость многократно клонированной файловой системы от снапшота fs2@oggi.

Применение

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

Проблемы с зависимостями

Проблема, с которой вы столкнулись, заключается в том, что ваши промоуции (promote) файловых систем не разрешили проблему зависимостей. Давайте разберём возможные подходы:

  1. Промоция клона: Если определённая файловая система (fs1, fs4, fs5) была клонирована от @oggi, промоция этой системы может снизить зависимость, но это не обязательно удалит все зависимости. Промоция делает клон более независимым, перемещая его как бы вверх по иерархии снапшотов – он становится новым родителем.

  2. Удаление клонов: Удалите каждый клон, зависимый от снапшота, который вам не нужен, а затем удалите сам снапшот. Это радикальная мера и требует детальных проверок, чтобы убедиться, что нужные данные не будут потеряны.

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

  4. Сомбинированный подход: Перемещение данных с последующим удалением и рекурсивной девитацией (использование -R) может помочь в очистке всех ненужных зависимостей. Это менее эффективно, но служит решением, особенно если у вас есть ранее сделанная резервная копия.

Вот более аккуратный пример действия:

# Сделайте резервную копию fs1, fs4, fs5
zfs send provapool/fs1@latest | zfs receive backup_pool/fs1
zfs send provapool/fs4@latest | zfs receive backup_pool/fs4
zfs send provapool/fs5@latest | zfs receive backup_pool/fs5

# Удалить клоны или переместить их в другие местоположения
zfs clone provapool/fs2@oggi backup_pool/temp/clone_fs2
zfs destroy -R provapool/fs2

# Восстановление из резервной копии
zfs send backup_pool/fs1@latest | zfs receive provapool/fs1
zfs send backup_pool/fs4@latest | zfs receive provapool/fs4
zfs send backup_pool/fs5@latest | zfs receive provapool/fs5

Заключение

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

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

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