Объектное хранилище и S3 API: buckets, objects, keys, метаданные
↑ 4.2 Объектное хранилище: MinIO и S3 · → Следующая
Зачем это на собесе
Хранение файлов — типовая задача; нужно понимать, чем объектное хранилище отличается от файловой системы и БД.
Что это
Объектное хранилище — плоское хранилище объектов (данные + метаданные) с доступом по 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
| Операция | Метод |
|---|---|
PutObject | PUT /bucket/key |
GetObject | GET /bucket/key (поддержка Range) |
HeadObject | HEAD — метаданные без тела |
DeleteObject, DeleteObjects | DELETE |
CopyObject | копирование на стороне сервера |
ListObjectsV2 | GET /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-семантика (нужна файловая система), транзакции между объектами.
Вопросы с ответами
Есть ли в S3 каталоги?
Нет. Ключи плоские, «папки» — это общий префикс в имени, отображаемый клиентами благодаря разделителю
/.
Можно ли изменить часть объекта?
Нет, объекты неизменяемы: загружается новая версия целиком (или используется multipart для сборки нового объекта).
Как организовать ключи объектов?
Включать идентификатор владельца или тип и уникальный идентификатор файла (UUID), а исходное имя хранить в метаданных/БД, чтобы избежать коллизий и проблем с символами.