У меня есть ведро 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
даже на ведрах без различий занимает много времени.