Я пытался найти лучший инструмент командной строки для дублирования блоков, чем s3cmd . s3cmd
может дублировать сегменты без необходимости загружать и выгружать каждый файл. Команда, которую я обычно запускаю для дублирования сегментов с помощью s3cmd:
s3cmd cp -r --acl-public s3://bucket1 s3://bucket2
Это работает, но очень медленно, поскольку копирует каждый файл через API по одному. Если s3cmd
бы можно было работать в параллельном режиме, я был бы очень рад.
Существуют ли другие параметры, доступные в виде инструментов командной строки или кода, которые люди используют для дублирования сегментов, которые работают быстрее, чем s3cmd
?
Изменить: похоже, что s3cmd-модификация - это именно то, что я ищу. Жаль, что это не работает. Есть ли другие варианты?
amazon-web-services
amazon-s3
Шон МакКлири
источник
источник
Ответы:
AWS CLI, похоже, отлично справляется со своей задачей и имеет то преимущество, что является официально поддерживаемым инструментом.
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, вы можете:
Это все еще довольно медленно, но вы можете оставить его в покое и позволить ему делать свое дело.
источник
Я попытался клонировать две корзины с помощью веб-консоли
s3cmd
AWS, интерфейса командной строки AWS. Хотя эти методы работают большую часть времени, они очень медленные.Затем я нашел
s3s3mirror
: специализированный инструмент для синхронизации двух ведер S3. Он многопоточный и намного быстрее, чем другие подходы, которые я пробовал. Я быстро переместил гигабайты данных из одного региона AWS в другой.Проверьте это на https://github.com/cobbzilla/s3s3mirror или загрузите контейнер Docker с https://registry.hub.docker.com/u/pmoust/s3s3mirror/
источник
Для специального решения используйте
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.
источник
awscli
doc -aws sync
копировать только новые и обновленные файлы. вероятно, вам следует ожидать высокой производительности сaws cp
(копирование выполняется внутри, ваш клиент просто выполняет вызов API). производительность зависит от следующих факторов: 1. задержка между src и dst регионами (например, us-east-X до us-west-X) 2. задержка между вашим клиентом и конечной точкой API AWS (насколько быстро вы можете выполнить вызов API) 3. количество одновременных запросов (сколько запросов в секунду может выдать ваш клиент). В моем случае 309G был скопирован между ведрами в одном и том же регионе (us-east-1)Поскольку это первая попытка Google по этой теме, добавлена дополнительная информация.
Cyno разработал новую версию s3cmd-модификации, которая теперь поддерживает параллельную синхронизацию между сегментами. Именно того, чего я и ждал.
Запрос на вытягивание находится на https://github.com/pcorliss/s3cmd-modification/pull/2 , его версия на https://github.com/pearltrees/s3cmd-modification
источник
Я не знаю других инструментов командной строки S3, но если здесь ничего не получится, проще всего будет написать свой собственный.
Выберите любой предпочитаемый язык и Amazon SDK / Toolkit. Затем вам просто нужно перечислить / получить содержимое исходного ведра и скопировать каждый файл (очевидно, параллельно)
Глядя на источник s3cmd-модификации (и я признаю, что ничего не знаю о python), похоже, что они не распараллелили код от ведра к ведру, но, возможно, вы могли бы использовать стандартный параллельный код загрузки / выгрузки в качестве отправной точки для сделай это.
источник
простой
aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursive
работает хорошо (при условии, что у вас есть настройка aws cli)источник