Multipart upload, версионирование, lifecycle, репликация

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

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

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

Управление большими файлами и жизненным циклом данных: отказоустойчивость, экономия и защита от удаления.

Multipart upload

Большой объект загружается частями параллельно.

  1. CreateMultipartUpload → UploadId.
  2. UploadPart (номер 1–10000, размер 5 МБ–5 ГБ, кроме последней) для каждой части, можно параллельно и повторять.
  3. CompleteMultipartUpload (список номеров и ETag частей) → объект собран.
  4. AbortMultipartUpload — очистка при отказе.

Преимущества: возобновление и повтор только неудавшихся частей, параллелизм, загрузка без знания итогового размера, файлы больше 5 ГБ (лимит одной операции PUT).

Рекомендации: размер части 8–64 МБ; обязательно настроить lifecycle на удаление неоконченных загрузок (AbortIncompleteMultipartUpload, например через 7 дней), иначе скрытые части копят стоимость.

var transfer = new TransferUtility(_s3);
await transfer.UploadAsync(new TransferUtilityUploadRequest
{
    BucketName = _bucket, Key = key, FilePath = path,
    PartSize = 16 * 1024 * 1024,
});

Версионирование

mc version enable local/bucket / PutBucketVersioning. Каждая перезапись создаёт новую версию (versionId), DELETE ставит delete marker, предыдущие версии остаются.

  • защита от случайного удаления и перезаписи, откат (GetObject?versionId=...);
  • стоимость: хранение всех версий: нужны lifecycle-правила (NoncurrentVersionExpiration);
  • включённое версионирование нельзя полностью отключить, только приостановить;
  • в сочетании с Object Lock (WORM: режимы GOVERNANCE, COMPLIANCE, retention, legal hold) защищает от удаления и шифровальщиков.

Lifecycle

Правила автоматического управления данными по префиксу/тегу/возрасту:

{
  "Rules": [
    { "ID": "tmp-cleanup", "Status": "Enabled", "Filter": { "Prefix": "tmp/" }, "Expiration": { "Days": 1 } },
    { "ID": "logs", "Status": "Enabled", "Filter": { "Prefix": "logs/" },
      "Transitions": [{ "Days": 30, "StorageClass": "STANDARD_IA" }, { "Days": 180, "StorageClass": "GLACIER" }],
      "Expiration": { "Days": 365 } },
    { "ID": "versions", "Status": "Enabled", "Filter": {}, "NoncurrentVersionExpiration": { "NoncurrentDays": 30 } },
    { "ID": "abort-mpu", "Status": "Enabled", "Filter": {}, "AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 } }
  ]
}

Применения: временные файлы, логи и бэкапы по срокам хранения (политика ретенции, требования закона), переход на более дешёвые классы, очистка версий. В MinIO: mc ilm, tiering на удалённые уровни (S3, Azure, GCS).

Репликация

ТипОписание
Bucket replication (CRR/SRR)копирование новых объектов в другой бакет/кластер/регион
Site replication (MinIO)синхронизация нескольких кластеров: бакеты, политики, пользователи
Active-passive / active-activeрезерв или двусторонняя репликация

Свойства: требуется версионирование; асинхронная (возможна задержка); реплицируются новые объекты (существующие — через batch replication); можно реплицировать delete markers; фильтры по префиксу/тегам; метрики задержки.

Цели: отказоустойчивость (DR), близость к пользователям, соответствие требованиям (копия в другом регионе), миграция.

Другие возможности

  • Event notifications: событие s3:ObjectCreated:* → очередь/webhook (обработка загруженных файлов, превью);
  • Batch операции, инвентаризация;
  • Тегирование для lifecycle и учёта затрат;
  • Классы хранения (Standard, IA, Glacier/Archive) — цена против скорости доступа.

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