Более быстрое дублирование сегмента s3


94

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

s3cmd cp -r --acl-public s3://bucket1 s3://bucket2

Это работает, но очень медленно, поскольку копирует каждый файл через API по одному. Если s3cmdбы можно было работать в параллельном режиме, я был бы очень рад.

Существуют ли другие параметры, доступные в виде инструментов командной строки или кода, которые люди используют для дублирования сегментов, которые работают быстрее, чем s3cmd?

Изменить: похоже, что s3cmd-модификация - это именно то, что я ищу. Жаль, что это не работает. Есть ли другие варианты?


6
Не уверен, почему этот вопрос постоянно закрывают, поскольку, похоже, с ним столкнулись некоторые разработчики. Во всяком случае, я решил это очень параллельно, вот ссылка: github.com/cobbzilla/s3s3mirror спасибо! - джонатан.
cobbzilla

Ответы:


167

AWS CLI, похоже, отлично справляется со своей задачей и имеет то преимущество, что является официально поддерживаемым инструментом.

aws s3 sync s3://mybucket s3://backup-mybucket

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

По умолчанию поддерживает одновременные передачи. См. Http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests

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

aws configure set default.s3.max_concurrent_requests 200

4
Он поддерживает непараллельную синхронизацию в зависимости от времени изменения файла, его размера и т. Д. Когда я попробовал, он работал очень быстро. Я считаю, что объекты копируются прямо на S3, не загружая их на локальную машину. По умолчанию он не работает параллельно, но я уверен, что у вас может быть несколько команд синхронизации, выполняемых одновременно в разных подпапках. Это достаточно быстро, поэтому вам, вероятно, в любом случае не понадобится параллельная работа. Я просто скопировал 100 ГБ данных за несколько минут.
python1981

11
Медленно, как черт, если файлов много.
Phng Nguyễn

14
При передаче большого количества небольших файлов задержка становится ключевым ограничением, поэтому выполнение этой команды из экземпляра EC2 имеет важное значение.
python1981

1
Я использовал это для создания докера и неплохо работает github.com/sunshineo/s3-bucket-copier
Gordon Sun

3
Теперь он ДЕЙСТВИТЕЛЬНО поддерживает одновременную синхронизацию :-) docs.aws.amazon.com/cli/latest/topic/…
python1981

71

Если вы не против использования консоли AWS, вы можете:

  1. Выберите все файлы / папки в первой корзине
  2. Щелкните Действия> Копировать.
  3. Создайте новую корзину и выберите ее
  4. Щелкните Действия> Вставить.

Это все еще довольно медленно, но вы можете оставить его в покое и позволить ему делать свое дело.


Копирует ли это содержимое исходного сегмента на мой компьютер по мере его копирования в место назначения? Сетевая активность очень активна, а инспектор браузера работает очень медленно, поэтому его сложно анализировать. На моей машине 600К / с. Тогда это будет намного быстрее инициировать передачу в сети Amazon ... Вместо этого попробую там.
Брэд Госс,

9
Я как раз сегодня воспользовался этим методом. Он не загружает файлы на ваш локальный компьютер - он выполняет прямое копирование и работает намного быстрее.
Грег Бенедикт

7
Он по-прежнему получает список файлов. Если список слишком длинный (в моем случае - десятки тысяч файлов), то он чертовски медленный. И тайм-аут / зависание очень вероятны
Phương Nguyn

13
К сожалению, этот процесс привязан к браузеру. :( Из документации : «После того, как вы инициируете процесс копирования, вы должны держать браузер открытым, пока копирование выполняется.»
Дэвид Лемайян

4
Я пытаюсь сделать это на ведре с 8 миллионами файлов. Не знаю, сколько месяцев у меня уйдет, чтобы установить все флажки ...
Крис Харрисон,

28

Я попытался клонировать две корзины с помощью веб-консоли s3cmdAWS, интерфейса командной строки AWS. Хотя эти методы работают большую часть времени, они очень медленные.

Затем я нашел s3s3mirror: специализированный инструмент для синхронизации двух ведер S3. Он многопоточный и намного быстрее, чем другие подходы, которые я пробовал. Я быстро переместил гигабайты данных из одного региона AWS в другой.

Проверьте это на https://github.com/cobbzilla/s3s3mirror или загрузите контейнер Docker с https://registry.hub.docker.com/u/pmoust/s3s3mirror/


1
Если вам нужно передать много файлов, это, безусловно, лучший инструмент для работы. Жаль, что это так далеко в списке ответов ...
Иоанн Златоуст,

Примечание для некоторых: для компиляции требуется Java 6/7.
Брайан

1
Я использую это из экземпляра EC2, и он работает невероятно быстро! Мне пришлось заменить <source-bucket> и <destination-bucket> фактическим именем корзины (а не конечной точкой или чем-то вроде AWS CLI).
Ironmouse 07

1
Замечательный инструмент, который настоятельно рекомендуется использовать для работы с большим количеством файлов. Великолепный контроль над количеством потоков копирования.
Шаунак

Вам не кажется, что для этой работы безопаснее использовать aws-cli, а не сторонние приложения? В конце концов, нам нужно предоставить учетные данные или ключи доступа, чтобы использовать эти инструменты.
Кит Сугатхадаса

11

Для специального решения используйте aws cliдля синхронизации между бакетами:

aws s3 syncскорость зависит от:
- задержки для вызова API к конечной точке S3
- количества вызовов API, выполняемых одновременно

Чтобы увеличить скорость синхронизации:
- запустите aws s3 syncиз экземпляра AWS (c3.large на FreeBSD можно ;-))
- обновите ~ / .aws / config с помощью:
- max_concurrent_requests = 128
-max_queue_size = 8096

со следующей конфигурацией и типом экземпляра я смог синхронизировать ведро (309 ГБ, 72 КБ файлов, us-east-1) в течение 474 секунд.

Для более универсального решения рассмотрите возможность межрегиональной репликации AWS DataPipeLine или S3.


Вы знаете, можно ли ожидать такой же производительности, если бы я использовал S3 cp? Вы уверены, что когда вы использовали синхронизацию, фактически переместили все 309 ГБ? sync будет синхронизировать только файлы, которые не совпадают или присутствуют в другом сегменте.
морозный

Кроме того, что вы думаете об этом для случая использования, когда у меня 1 КБ или меньше файлов, но они больше по размеру (10 ГБ)? Как вы думаете, я увижу подобное вам исполнение?
морозный

@frosty, в моем случае корзина назначения была пуста. per awsclidoc - aws syncкопировать только новые и обновленные файлы. вероятно, вам следует ожидать высокой производительности с aws cp(копирование выполняется внутри, ваш клиент просто выполняет вызов API). производительность зависит от следующих факторов: 1. задержка между src и dst регионами (например, us-east-X до us-west-X) 2. задержка между вашим клиентом и конечной точкой API AWS (насколько быстро вы можете выполнить вызов API) 3. количество одновременных запросов (сколько запросов в секунду может выдать ваш клиент). В моем случае 309G был скопирован между ведрами в одном и том же регионе (us-east-1)
Tom Lime

3

Поскольку это первая попытка Google по этой теме, добавлена ​​дополнительная информация.

Cyno разработал новую версию s3cmd-модификации, которая теперь поддерживает параллельную синхронизацию между сегментами. Именно того, чего я и ждал.

Запрос на вытягивание находится на https://github.com/pcorliss/s3cmd-modification/pull/2 , его версия на https://github.com/pearltrees/s3cmd-modification


s3cmd-модификация сэкономила мне дни копирования.
gak

2

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

Выберите любой предпочитаемый язык и Amazon SDK / Toolkit. Затем вам просто нужно перечислить / получить содержимое исходного ведра и скопировать каждый файл (очевидно, параллельно)

Глядя на источник s3cmd-модификации (и я признаю, что ничего не знаю о python), похоже, что они не распараллелили код от ведра к ведру, но, возможно, вы могли бы использовать стандартный параллельный код загрузки / выгрузки в качестве отправной точки для сделай это.


Да уж. Я раздумывал над этой идеей и писал ее на рубине в равномерной манере с машиной событий или с JRuby. Однако s3cmd уже достаточно завершен, и я бы предпочел просто использовать его. Я разговаривал с разработчиком s3cmd, и у него в разработке есть пара решений, которые, вероятно, решат проблемы с производительностью.
Шон МакКлири,

1

простой aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursiveработает хорошо (при условии, что у вас есть настройка aws cli)

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