Объектное хранилище и S3 API: buckets, objects, keys, метаданные

↑ 4.2 Объектное хранилище: MinIO и S3 · → Следующая

Желательно~3 мин чтенияУровень: middle

Зачем это на собесе

Хранение файлов — типовая задача; нужно понимать, чем объектное хранилище отличается от файловой системы и БД.

Что это

Объектное хранилище — плоское хранилище объектов (данные + метаданные) с доступом по HTTP API. Не файловая система и не блочное устройство.

Файловая системаБлочноеОбъектное
Доступпути, POSIXблокиHTTP: PUT/GET по ключу
Структураиерархия каталоговтомаплоское пространство ключей
Масштабограниченограниченпрактически неограниченный
Изменениечастичноечастичноеобъект неизменяем (перезапись целиком)
Применениеприложения, общие папкидиски ВМ, БДфайлы, бэкапы, медиа, логи, data lake

Модель S3

  • Bucket — контейнер верхнего уровня (уникальное имя, политики, версии, настройки);
  • Object — данные (до 5 ТБ) + метаданные;
  • Key — имя объекта внутри бакета (users/42/avatar.png); «папки» — префиксы, не реальные каталоги;
  • Метаданные: системные (Content-Type, Content-Length, ETag, Last-Modified) и пользовательские (x-amz-meta-*);
  • ETag — хэш (MD5 для простой загрузки, составной для multipart);
  • Версии, теги (ключ–значение), классы хранения (Standard, IA, Glacier).

Основные операции API

ОперацияМетод
PutObjectPUT /bucket/key
GetObjectGET /bucket/key (поддержка Range)
HeadObjectHEAD — метаданные без тела
DeleteObject, DeleteObjectsDELETE
CopyObjectкопирование на стороне сервера
ListObjectsV2GET /bucket?prefix=users/42/&delimiter=/ (постраничный)
Multipart uploadдля больших файлов
Presigned URLвременный доступ без ключей

S3 API стал стандартом: совместимы MinIO, Ceph RGW, Cloudflare R2, Wasabi, Yandex Object Storage, VK Cloud.

Консистентность

Amazon S3 с 2020 года обеспечивает сильную консистентность чтения после записи и листинга. У других реализаций нужно проверять.

Ключи и производительность

  • удобные ключи: tenant/{id}/yyyy/mm/{uuid}.ext; не используйте имя файла пользователя как единственный ключ (коллизии, спецсимволы);
  • ListObjects дорог на больших бакетах: храните список в БД, а не полагайтесь на листинг;
  • распределение нагрузки по префиксам для больших RPS (у S3 лимиты на префикс);
  • не переименовывайте: нет операции rename (copy + delete).

Безопасность

  • бакеты приватны по умолчанию; публичный доступ — осознанный;
  • аутентификация: access key / secret key, IAM-политики, временные токены (STS);
  • bucket policy, ACL (устаревает), шифрование на стороне сервера (SSE-S3, SSE-KMS, SSE-C), TLS;
  • CORS для браузерного доступа;
  • Object Lock (WORM), версионирование — защита от удаления.

Когда использовать

Загруженные пользователями файлы, изображения и видео, отчёты и экспорт, бэкапы и архивы, логи, data lake (Parquet), статические сайты, артефакты сборки.

Когда нет

Частые частичные изменения, низкая задержка на мелкие чтения (используйте БД/кэш), POSIX-семантика (нужна файловая система), транзакции между объектами.

Вопросы с ответами