Самый быстрый способ синхронизации двух ковшей Amazon S3

У меня есть ведро S3 с объемом около 4 миллионов файлов, занимающих около 500 ГБ. Мне нужно синхронизировать файлы с новым ведром (фактическое изменение имени ведра было бы достаточно, но поскольку это невозможно, мне нужно создать новое ведро, переместить туда файлы и удалить старый).

Я использую команду AWS CLI s3 sync, и она выполняет эту работу, но занимает много времени. Я хотел бы уменьшить время, так что время простоя зависимой системы минимально.

Я пытался запустить синхронизацию как с моей локальной машины, так и с экземпляра EC2 c4.xlarge, и нет большой разницы во времени.

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

aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "1?/*" 
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "2?/*" 
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "3?/*" 
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "4?/*" 
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "1?/*" --exclude "2?/*" --exclude "3?/*" --exclude "4?/*"

Есть ли что-нибудь еще, что я могу ускорить синхронизацию еще больше? Является ли другой тип экземпляра EC2 более подходящим для работы? Является ли разделение задания на несколько партий хорошей идеей и есть ли что-то вроде "оптимального" количества процессов sync, которые могут выполняться параллельно в одном и том же ведре?

Обновление

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

Ответ 1

Вы можете использовать EMR и S3-distcp. Мне пришлось синхронизировать 153 ТБ между двумя ведрами, и это заняло около 9 дней. Также убедитесь, что сегменты находятся в одном регионе, потому что вы также столкнулись с расходами на передачу данных.

aws emr add-steps --cluster-id <value> --steps Name="Command Runner",Jar="command-runner.jar",[{"Args":["s3-dist-cp","--s3Endpoint","s3.amazonaws.com","--src","s3://BUCKETNAME","--dest","s3://BUCKETNAME"]}]

http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-commandrunner.html

Ответ 2

Как вариант того, что OP уже делает.
Можно создать список всех файлов для синхронизации, aws s3 sync --dryrun

aws s3 sync s3://source-bucket s3://destination-bucket --dryrun
# or even
aws s3 ls s3://source-bucket --recursive

Используя список объектов для синхронизации, разделите задание на несколько команд aws s3 cp .... Таким образом, "aws cli" не будет просто висит там, получая список кандидатов на синхронизацию, как это происходит при запуске нескольких заданий синхронизации с аргументами типа --exclude "*" --include "1?/*".

Когда все "копии" заданий выполняются, другая синхронизация может стоить этого, для хорошей меры, возможно, с --delete, если объект может быть удален из "исходного" ведра.

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

Ответ 3

Справочная информация. Узкие места в команде синхронизации - это перечисление объектов и копирование объектов. Перечисление объектов обычно является последовательной операцией, хотя если вы укажете префикс, вы можете перечислить подмножество объектов. Это единственный трюк для его распараллеливания. Копирование объектов может быть сделано параллельно.

К сожалению, aws s3 sync не выполняет распараллеливания и даже не поддерживает перечисление по префиксу, если префикс не заканчивается на / (т. aws s3 sync Он может перечислять по папкам). Вот почему это так медленно.

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

Вы также можете сделать это самостоятельно, используя AWS API.

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

Ответ 5

40100 объектов 160 ГБ было скопировано/синхронизировано менее чем за 90 секунд

выполните следующие шаги:

step1- select the source folder
step2- under the properties of the source folder choose advance setting
step3- enable transfer acceleration and get the endpoint 

Конфигурации AWS только один раз (нет необходимости повторять это каждый раз)

aws configure set default.region us-east-1 #set it to your default region
aws configure set default.s3.max_concurrent_requests 2000
aws configure set default.s3.use_accelerate_endpoint true

enter image description here

опции :-

--delete: эта опция удалит файл в месте назначения, если его нет в источнике

Команда AWS для синхронизации

aws s3 sync s3://source-test-1992/foldertobesynced/ s3://destination-test-1992/foldertobesynced/ --delete --endpoint-url http://soucre-test-1992.s3-accelerate.amazonaws.com 

стоимость ускорения передачи

https://aws.amazon.com/s3/pricing/#S3_Transfer_Acceleration_pricing

они не упомянули цену, если ведра находятся в одном регионе enter image description here