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


44

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

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

Ответы:


53

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

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

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

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

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

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

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

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

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


Мне кажется, что Bucket Explorer работает хорошо (в данный момент перемещаются файлы между двумя корзинами)
Noodles

3
Где aws s3 sync s3://source s3://destinationвписывается?
Оливье Лалонд

7

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

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

А. Создайте новое ведро

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

B. Синхронизируйте старое ведро с новым ведром

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

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

Начато 17:03

Завершено 17:06

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

Как только новый сегмент настроен правильно, то есть разрешения, политика и т. Д., И вы хотите удалить старый сегмент.

C. Удалить / удалить старое ведро

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

Спаситель жизни. Я копирую 300+ ГБ. Совет: если вы копируете из сегментов в одном регионе, это происходит намного быстрее, чем в другом (и я читал, что это дешевле).
Марсело Агимовель

У меня возникла проблема с вашим методом: конфиденциальность файлов была установлена ​​на PRIVATE, даже большинство объектов были общедоступными, что случилось?
Марсело Агимовель

5

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


6
Это вряд ли будет хорошо работать с миллионами файлов.
Джеймс

@James может до боли это подтвердить;)
ограбить

3

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

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

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


У меня был большой опыт с s3s3mirror. Мне удалось настроить его на узле m1.small EC2 и скопировать 1,5 миллиона объектов примерно за 2 часа. Установка была немного сложной, из-за моего незнакомства с Maven и Java, но потребовалось всего несколько команд apt-get для Ubuntu, чтобы установить все. Последнее замечание: если (как и я) вы беспокоитесь о запуске неизвестного сценария в большом важном сегменте s3, создайте специального пользователя с доступом только для чтения в блоке копирования из и используйте эти учетные данные. Нулевой шанс случайного удаления.
Мика

Можно ли это применить к корзинам между разными аккаунтами?
Оливер Бурдекин

@OliverBurdekin да, есть --cross-account-copyвозможность ( -Cдля краткости) сделать это. Обратите внимание, что при копировании между учетными записями списки ACL не копируются; владелец целевого сегмента будет иметь полные права на скопированные данные.
cobbzilla

Спасибо @rfcreader Как я могу оценить стоимость этого? Я знаком с калькулятором затрат AWS, но не знаю, что этот процесс будет касаться с точки зрения количества запросов на получение запросов на получение и т. Д. Я полагаю, что довольно легко подсчитать эти показатели с помощью CLI, но если вы знаете больше, пожалуйста, свяжитесь с нами. Поддержка AWS предложила "запрашивающая сторона платит". ха!
Оливер Бурдекин

@OliverBurdekin s3s3mirror отслеживает количество запросов AWS по типу (GET, COPY, DELETE и т. Д.). Эта статистика печатается периодически при запуске и в последний раз в конце. Вы можете выполнить ограниченный / тестовый запуск для копирования небольшого подмножества объектов, это должно дать вам общее представление о том, сколько всего запросов потребуется для копирования всего набора данных.
cobbzilla

2

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

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

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 + МБ / с, что увеличило скорость В 70 раз больше конфигурации по умолчанию.


0

В потерянном сегменте выберите файлы, которые вы хотите скопировать в другой блок.

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

1
Зачем повторять решение, о котором другие упоминали год назад?
Бенджамин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.