Версионирование — инструмент для хранения нескольких версий объекта. Управление версионированием происходит на уровне бакета: настройки применяются ко всем его объектам.
К версиям объектов применяются стандартные правила тарификации.
Версионирование защищает данные от случайного удаления и перезаписи. Если версионирование в бакете включено:
Все версии объектов сохраняются в виде отдельных копий: если загрузить в бакет объект с ключом (названием), присвоенным уже существующему объекту, для объекта будет сохранена новая версия. Исходная версия не перезапишется и ее можно будет восстановить.
Стандартный запрос на удаление объекта не удаляет данные безвозвратно, а помечает объект как удаленный с помощью delete-маркера. При этом любую версию объекта можно восстановить или удалить безвозвратно.
Object Storage позволяет автоматизировать удаление ненужных версий с помощью политик жизненного цикла объекта.
Версионирование бакета может быть в одном из следующих состояний:
выключено;
включено;
приостановлено.
По умолчанию версионирование в бакете выключено. После включения версионирование нельзя выключить, но можно приостановить, если в бакете нет объектов с включенной блокировкой.
При сохранении объекта в бакет каждой версии объекта присваиваются служебные параметры versionId и isLatest. Управлять этими параметрами вручную нельзя.
Параметр isLatest позволяет маркировать текущую версию объекта и принимает значения:
true — для текущей версии объекта;
false — для всех остальных версий.
Параметр versionId служит уникальным идентификатором версии. Значение параметра зависит от состояния версионирования бакета:
Если версионирование выключено или приостановлено, новые объекты или новые версии существующих объектов сохраняются с параметром versionId, равным null.
Если версионирование включено, каждой версии присваивается уникальный versionId, не равный null.
Object Storage позволяет просматривать параметры всех версий объектов в бакете.
Delete-маркер позволяет пометить объект как удаленный и скрыть его, но не удалять данные физически. Delete-маркер автоматически создается для объекта при следующих условиях:
версионирование в бакете включено или приостановлено;
в запросе на удаление объекта не указана версия объекта.
Delete-маркер хранится в Object Storage как особый тип объекта. Аналогично версиям объекта ему присваиваются параметры isLatest и versionId.
Если текущая версия объекта — delete-маркер, объект не будет отображаться при выполнении операций ListObjectsV2, GetObject, HeadObject и пр. При этом не блокируются:
запросы PutObject с существующим ключом объекта;
повторные запросы DeleteObject к объекту.
Такие запросы будут завершаться без ошибки. Результат их выполнения зависит от состояния версионирования бакета.
Объект с delete-маркером можно восстановить. Для этого нужно удалить delete-маркер. Чтобы восстановить объект, для которого сохранено несколько delete-маркеров подряд, нужно удалить все его delete-маркеры.
В таблице ниже описано поведение хранилища при разных состояниях версионирования.
Действие с хранилищем | Версионирование выключено | Версионирование включено | Версионирование приостановлено |
|---|---|---|---|
Загрузка объекта с ключом, присвоенным существующему объекту | Существующий объект перезаписывается, восстановить его невозможно. Единственная копия объекта отображается как текущая. versionId объекта равен null. | Сохраняется новая версия объекта с уникальным versionId, не равным null. Новая версия становится текущей. Существующие версии объекта и delete-маркеры не изменяются и доступны в истории версий. |
|
Удаление объекта без указания версии | Объект удаляется безвозвратно. | Для объекта создается delete-маркер с уникальным versionId, не равным null. Delete-маркер становится текущей версией. Существующие версии объекта и delete-маркеры не изменяются и доступны в истории версий. |
|
Удаление объекта с указанием версии | Единственная версия объекта удаляется безвозвратно. | Версия или delete-маркер удаляется безвозвратно. Другие версии объекта и delete-маркеры не изменяются и доступны в истории версий. | Версия или delete-маркер удаляется безвозвратно. Другие версии объекта и delete-маркеры не изменяются и доступны в истории версий. |
Блокировка недоступна. | Можно использовать блокировку. | Уже существующие блокировки продолжают действовать. К новым объектам нельзя применить блокировку. |