Хранение и резервные копии

Мультипарт-загрузка

1 мин чтения

Мультипарт-загрузка делит большой файл на части и загружает их параллельно. При обрыве соединения заново загружается только неудачная часть. Используйте ее для файлов больше 100 МБ.

В примерах используется AWS CLI, настроенный для UzCloud. Замените my-bucket на имя своего бакета.

Ограничения

  • размер части — от 5 МБ до 5 ГБ (последняя часть может быть меньше);
  • до 10 000 частей на файл;
  • максимальный размер объекта — 5 ТБ.

Автоматическая мультипарт-загрузка

aws s3 cp, aws s3 sync, rclone и SDK используют мультипарт-загрузку автоматически для больших файлов. В AWS CLI можно настроить размер части и число параллельных запросов:

aws configure set default.s3.multipart_threshold 64MB
aws configure set default.s3.multipart_chunksize 64MB
aws configure set default.s3.max_concurrent_requests 10

aws s3 cp ./backup.tar.gz s3://my-bucket/backups/

Мультипарт-загрузка вручную

Низкоуровневые команды полезны в скриптах и для понимания того, как это работает:

1. Разделите файл на части:

split -b 100M backup.tar.gz part-

2. Начните загрузку и сохраните UploadId:

UPLOAD_ID=$(aws s3api create-multipart-upload --bucket my-bucket \
  --key backups/backup.tar.gz --query UploadId --output text)

3. Загрузите части, нумеруя их с 1:

n=1
for f in part-*; do
  ETAG=$(aws s3api upload-part --bucket my-bucket --key backups/backup.tar.gz \
    --upload-id "$UPLOAD_ID" --part-number $n --body "$f" \
    --query ETag --output text)
  echo "{\"PartNumber\": $n, \"ETag\": $ETAG}" >> parts.txt
  n=$((n+1))
done
echo "{\"Parts\": [$(paste -sd, parts.txt)]}" > parts.json

4. Завершите загрузку:

aws s3api complete-multipart-upload --bucket my-bucket \
  --key backups/backup.tar.gz --upload-id "$UPLOAD_ID" \
  --multipart-upload file://parts.json

Незавершенные загрузки

Части незавершенной загрузки занимают место и оплачиваются, хотя их не видно в списке объектов. Найдите и отмените их:

aws s3api list-multipart-uploads --bucket my-bucket

aws s3api abort-multipart-upload --bucket my-bucket \
  --key backups/backup.tar.gz --upload-id <UploadId>

Чтобы удалять их автоматически, добавьте правило жизненного цикла AbortIncompleteMultipartUpload.

Совет

См. также: