Версионирование объектов в бакете
Версионирование (управление версиями) — механизм, который позволяет хранить в бакете историю изменения объекта в виде набора его версий. Версионирование включается на уровне бакета и применяется ко всем объектам внутри него.
В бакетах с включенным версионированием сервис 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, в котором указан идентификатор версии этого маркера удаления.
Создание маркера удаления не зависит от блокировки объектов (object lock): маркер добавляется, даже если текущая версия объекта защищена, так как сама защищенная версия при этом не удаляется и не изменяется.
Результат добавления объекта в бакет в зависимости от статуса версионирования бакета:
- Версионирование включено: будет создана новая версия объекта, которая отличается от предыдущей идентификатором версии и более поздним временем создания.
- Версионирование приостановлено: будет создана новая версия объекта с идентификатором версии
null. Если уже есть версия с идентификаторомnull, она будет перезаписана. - Без версионирования: новому объекту будет присвоен идентификатор версии
null. Если объект уже есть в бакете, он будет перезаписан.
Результат удаления зависит от статуса версионирования бакета и указания идентификатора версии в запросе на удаление.
Версионирование включено:
-
Не указан идентификатор версии: будет создан маркер удаления, который станет текущей версией объекта. Существующие версии не изменятся. Это происходит, даже если на текущую версию объекта установлена блокировка объектов (object lock), поскольку фактически версия не удаляется.
-
Указан идентификатор версии и не включена блокировка объектов (object lock): будет удалена версия объекта или маркер удаления с указанным идентификатором. Если это единственная версия, ее удаление приведет к безвозвратному удалению объекта из бакета.
-
Указан идентификатор версии и включена блокировка объектов (object lock): удаление недоступно до истечения срока временной блокировки или снятия бессрочной блокировки.
Пользователи с правами на запись (
WRITE) могут обойти временную блокировку в управляемом режиме (GOVERNANCE).
Версионирование приостановлено:
- Не указан идентификатор версии: будет удалена версия объекта с идентификатором
null, если она есть, и создан маркер удаления, который станет текущей версией объекта. - Указан идентификатор версии: будет удалена версия объекта или маркер удаления с указанным идентификатором. Если это единственная версия, ее удаление приведет к безвозвратному удалению объекта из бакета.
Бакет без версионирования:
- Не указан идентификатор версии: объект будет удален из бакета безвозвратно.
- Указан идентификатор версии: будет возвращен ответ
204, поскольку такой версии объекта не существует.