Назад | Перейти на главную страницу

Как с минимальными затратами перемещать файлы между двумя ведрами S3?

У меня миллионы файлов в корзине Amazon S3, и я хотел бы переместить эти файлы в другие корзины и папки с минимальными затратами или, если возможно, бесплатно. Все ковши находятся в одной зоне.

Как я мог это сделать?

Миллионы - это большое число, я вернусь к этому позже.

Независимо от вашего подхода, базовый механизм должен копировать напрямую из одной корзины в другую - таким образом (поскольку ваши корзины находятся в одном регионе) вы не несете никакой платы за пропускную способность. Любой другой подход просто неэффективен (например, загрузка и повторная загрузка файлов).

Копирование между бакетами выполняется с помощью «PUT copy» - это запрос PUT, который включает заголовок «x-amz-copy-source» - я считаю, что это классифицируется как запрос COPY. Это скопирует файл и по умолчанию связанные метаданные. Вы должны включить "x-amz-acl" с правильным значением, если вы хотите установить ACL одновременно (в противном случае он будет по умолчанию закрытым). С вас будет взиматься плата за запросы на КОПИРОВАНИЕ (0,01 доллара США за 1000 запросов). Вы можете удалить ненужные файлы после того, как они были скопированы (запросы DELETE не тарифицируются). (Один момент, который я не совсем понимаю, заключается в том, требует ли запрос COPY также плату за запрос GET, поскольку объект должен быть сначала извлечен из исходного сегмента - если это так, плата будет дополнительно составлять 0,01 доллара США / 10 000 Запросы).

Вышеуказанные расходы кажутся неизбежными - за миллион объектов вы смотрите около 10 долларов (или 11 долларов). Поскольку в конечном итоге вы должны фактически создать файлы в целевом сегменте, другие подходы (например, сжатие файлов с помощью tar-архивирования, импорт / экспорт Amazon и т. Д.) Не помогут обойти эту стоимость. Тем не менее, возможно, стоит обратиться в Amazon, если вам нужно передать более пары миллионов объектов.

Учитывая вышеизложенное (неизбежная цена), следующее, на что следует обратить внимание, - это время, которое будет большим фактором при копировании «миллионов файлов». Все инструменты, которые могут выполнять прямое копирование между корзинами, требуют одинаковой платы. К сожалению, вам требуется один запрос на файл (для копирования), один запрос на удаление и, возможно, один запрос на чтение данных ACL (если ваши файлы имеют разные ACL). Наилучшая скорость будет получена от всего, что может выполнять самые параллельные операции.

Есть несколько подходов к командной строке, которые могут быть весьма жизнеспособными:

  • s3cmd-модификация (этот конкретный запрос на перенос) включает параллельные команды cp и mv и должен быть для вас хорошим вариантом.
  • Консоль AWS может выполнять копирование напрямую - хотя я не могу сказать, насколько это параллельно.
  • Плюсы Тима Кея Скрипт может делать копию, но это не параллельно - вам нужно будет создать скрипт для запуска полной копии, которую вы хотите (вероятно, это не лучший вариант в этом случае, хотя это отличный скрипт).
  • CloudBerry S3 Explorer, Ведро Explorer, и CloudBuddy все должны быть в состоянии выполнить эту задачу, хотя я не знаю, насколько эффективна каждая из них. Однако я считаю, что многопоточные функции большинства из них требуют покупки программного обеспечения.
  • Создайте собственный сценарий, используя один из доступных SDK.

Существует некоторая вероятность того, что s3fs может работать - он довольно параллелен, поддерживает копии между одним и тем же сегментом - НЕ поддерживает копии между разными сегментами, но мощь поддержка перемещается между разными ковшами.

Я бы начал с s3cmd-модификации и посмотрел, добьетесь ли вы успеха, или обратитесь в Amazon за лучшим решением.

Старая тема, но это для всех, кто исследует тот же сценарий. Наряду со временем, на которое я потратил более 20 000 объектов. Работает на AWS Linux / Centos, каждый объект по большей части представляет собой изображения, а также видео и различные мультимедийные файлы.

Использование инструментов интерфейса командной строки AWS для копирования файлов из сегмента A в сегмент B.

A. Создайте новую корзину

$ aws s3 mb s3://new-bucket-name

Б. Синхронизируйте старый ковш с новым.

$ aws s3 sync s3://old-bucket-name s3://new-bucket-name

Копирование 20 000+ объектов ...

Стартовал 17:03

Закончился 17:06

Общее время для 20000+ объектов = примерно 3 минуты

После того, как новый ковш будет правильно настроен, т.е. разрешения, политика и т. д., и вы хотите удалить старую корзину.

C. Удалить / удалить старую корзину

$ aws s3 rb --force s3://old-bucket-name

Я не уверен, что это лучший подход, но в консоли управления AWS есть функция вырезания / копирования / вставки. очень проста в использовании и эффективна.

Интерфейс командной строки AWS позволяет копировать одну корзину в другую в параллельных процессах. Взято из https://stackoverflow.com/a/40270349/371699:

Следующие команды сообщают интерфейсу командной строки AWS использовать 1000 потоков для выполнения заданий (каждый представляет собой небольшой файл или одну часть составной копии) и просматривать 100000 заданий:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

После их запуска вы можете использовать простую команду синхронизации следующим образом:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

На машине m4.xlarge (в AWS - 4 ядра, 16 ГБ ОЗУ) для моего случая (файлы от 3 до 50 ГБ) скорость синхронизации / копирования увеличилась с 9,5 МБ / с до 700 + МБ / с, прирост скорости составил 70x по сравнению с конфигурацией по умолчанию.

Я предполагаю, что вы, вероятно, уже нашли хорошее решение, но для других, кто сталкивается с этой проблемой (как я был совсем недавно), я создал простую утилиту специально для цели зеркалирования одной корзины S3 в другую в высокая степень одновременности, но эффективный способ использования ЦП и памяти.

Это на github под лицензией Apache здесь: https://github.com/cobbzilla/s3s3mirror

Если вы решите попробовать, дайте мне знать, если у вас есть отзывы.

В проигрышной корзине выберите файл (ы), которые вы хотите скопировать в другую корзину.

  • В разделе «Действия» выберите «Копировать».
  • Идите к ведру набора.
  • В разделе "Действия" выберите "Вставить".