У меня есть миллионы файлов в корзине Amazon S3, и я хотел бы переместить эти файлы в другие корзины и папки с минимальными затратами или, если это возможно, без затрат. Все ведра находятся в одной зоне.
Как я мог это сделать?
У меня есть миллионы файлов в корзине Amazon S3, и я хотел бы переместить эти файлы в другие корзины и папки с минимальными затратами или, если это возможно, без затрат. Все ведра находятся в одной зоне.
Как я мог это сделать?
Ответы:
Миллионы - это большое число, я вернусь к этому позже.
Независимо от вашего подхода, базовый механизм должен копировать напрямую из одного сегмента в другой - таким образом (поскольку ваши сегменты находятся в одном регионе), вы не будете платить за пропускную способность. Любой другой подход просто неэффективен (например, загрузка и повторная загрузка файлов).
Копирование между сегментами выполняется с помощью '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). Наилучшая скорость зависит от того, что может выполнять большинство параллельных операций.
Есть несколько подходов командной строки, которые могут быть весьма жизнеспособными:
Существует некоторая возможность того, что s3fs может работать - он довольно параллелен, поддерживает копии между одним и тем же сегментом - НЕ поддерживает копии между различными сегментами, но может поддерживать перемещения между различными сегментами.
Я бы начал с s3cmd-модификации и посмотрел, есть ли у вас какой-либо успех, или свяжитесь с Amazon для лучшего решения.
aws s3 sync s3://source s3://destination
вписывается?
Старая тема, но это для тех, кто исследует тот же сценарий. Наряду со временем это заняло у меня более 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
Я предполагаю, что вы, вероятно, уже нашли хорошее решение к настоящему времени, но для тех, кто сталкивается с этой проблемой (как я только недавно), я разработал простую утилиту специально для того, чтобы отразить одну корзину S3 в другую в очень параллельный, но эффективный процессор и память.
Это на github под лицензией Apache здесь: https://github.com/cobbzilla/s3s3mirror
Если вы решите попробовать, пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы.
--cross-account-copy
возможность ( -C
для краткости) сделать это. Обратите внимание, что при копировании между учетными записями списки ACL не копируются; владелец целевого сегмента будет иметь полные права на скопированные данные.
Интерфейс командной строки 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 раз больше конфигурации по умолчанию.