Более быстрое дублирование сегмента 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.