Версионирование объектов в бакете

Версионирование (управление версиями) — механизм, который позволяет хранить в бакете историю изменения объекта в виде набора его версий. Версионирование включается на уровне бакета и применяется ко всем объектам внутри него.

В бакетах с включенным версионированием сервис VK Object Storage работает следующим образом:

  • Если вы попытаетесь перезаписать объект, в бакете появится новая версия объекта, но предыдущая не будет удалена.
  • Если VK Object Storage получит одновременно несколько запросов на запись одного и того же объекта, он сохранит в бакет все полученные версии объекта.
  • Если вы попытаетесь удалить объект из бакета, VK Object Storage добавит в бакет маркер удаления и назначит его текущей версией объекта. Предыдущие версии останутся в бакете, но будут недоступны по запросу GET к объекту.

Таким образом, никакие изменения объектов в бакете не будут потеряны. Это упрощает восстановление данных, удаленных или поврежденных из-за непреднамеренных действий пользователей или ошибок в работе приложений.

Статусы версионирования бакета

  • Без статуса (unversioned).

    Статуса версионирования нет у новых бакетов, созданных без включения версионирования, а также у бакетов, созданных до того, как в VK Object Storage был реализован механизм версионирования. У всех объектов в этих бакетах идентификатор версии равен null.

  • Включено (versioning-enabled).

    Версионирование включается либо при создании бакета, либо после его создания в личном кабинете или через AWS CLI. При включении версионирования имеющиеся в бакете объекты не изменяются и сохраняют идентификатор версии null. После включения каждый загружаемый в бакет новый объект или новая версия существующего объекта получают уникальный идентификатор версии.

    После включения версионирования отключить его невозможно, можно только приостановить.

  • Приостановлено (versioning-suspended).

    Приостановка версионирования позволяет прекратить создание новых версий объектов. Когда версионирование приостанавливается:

    • Имеющиеся в бакете версии объектов не изменяются.
    • При загрузке в бакет новых объектов или новых версий существующих объектов, они получают идентификатор версии null.
    • Если в бакете уже есть версия объекта с идентификатором null и вы добавляете в бакет объект с тем же самым ключом, он перезапишет имеющуюся null-версию.

Идентификатор версии

Идентификатор версии (version ID) — строка символов, которая автоматически генерируется сервисом VK Object Storage при загрузке объекта в бакет.

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

Идентификатор версии можно использовать в URL, так как он содержит только незарезервированные символы: латинские буквы, цифры и символы -, ., _, ~.

Маркер удаления

Маркер удаления (delete marker) — специальная версия объекта, которую сервис VK Object Storage добавляет в бакет с версионированием, когда вы удаляете из него объект. Как и у любого другого объекта, у маркера удаления есть ключ и идентификатор версии, но нет содержимого. Ключ объекта, который вы удаляете, становится ключом маркера удаления, а сам маркер удаления — текущей версией объекта. Остальные версии объекта при этом не изменяются.

Хотя на самом деле объект остается в бакете, VK Object Storage будет вести себя так, как будто он удален. Например, при запросе GET к объекту, сервис будет возвращать ошибку 404 (Not Found).

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

Маркер удаления можно удалить из истории версий объекта с помощью запроса DELETE, в котором указан идентификатор версии этого маркера удаления.

Влияние версионирования на операции с объектами

Добавление объекта

Результат добавления объекта в бакет в зависимости от статуса версионирования бакета:

  • Версионирование включено: будет создана новая версия объекта, которая отличается от предыдущей идентификатором версии и более поздним временем создания.
  • Версионирование приостановлено: будет создана новая версия объекта с идентификатором версии null. Если уже есть версия с идентификатором null, она будет перезаписана.
  • Без версионирования: новому объекту будет присвоен идентификатор версии null. Если объект уже есть в бакете, он будет перезаписан.

Удаление объекта или его версии

Результат удаления зависит от статуса версионирования бакета и указания идентификатора версии в запросе на удаление.

Версионирование включено:

  • Не указан идентификатор версии: будет создан маркер удаления, который станет текущей версией объекта. Существующие версии не изменятся.
  • Указан идентификатор версии: будет удалена версия объекта или маркер удаления с указанным идентификатором. Если это единственная версия, ее удаление приведет к безвозвратному удалению объекта из бакета.

Версионирование приостановлено:

  • Не указан идентификатор версии: будет удалена версия объекта с идентификатором null, если она есть, и создан маркер удаления, который станет текущей версией объекта.
  • Указан идентификатор версии: будет удалена версия объекта или маркер удаления с указанным идентификатором. Если это единственная версия, ее удаление приведет к безвозвратному удалению объекта из бакета.

Бакет без версионирования:

  • Не указан идентификатор версии: объект будет удален из бакета безвозвратно.
  • Указан идентификатор версии: будет возвращен ответ 204, поскольку такой версии объекта не существует.