Швидше копіювання відра s3


93

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

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

Це працює, але дуже повільно, оскільки копіює кожен файл через API по одному. Якби s3cmdміг працювати в паралельному режимі, я був би дуже радий.

Чи доступні інші варіанти як інструменти командного рядка або код, які люди використовують для продублювання сегментів, які швидші s3cmd?

Редагувати: Схоже, модифікація s3cmd - це саме те, що я шукаю. Шкода, що це не працює. Чи є інші варіанти?


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

Відповіді:


166

Здається, 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
Як повільно, якщо кількість файлів велика.
Phương Nguyễn

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

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

3
Тепер він ПІДТРИМУЄ
python1981

70

Якщо ви не проти використовувати консоль AWS, ви можете:

  1. Виберіть усі файли / папки в першому сегменті
  2. Клацніть Дії> Копіювати
  3. Створіть нове відро та виберіть його
  4. Клацніть Дії> Вставити

Це все ще досить повільно, але ви можете залишити це в спокої і дозволити йому зробити своє.


Це копіює вміст вихідного відра на мою машину під час копіювання до місця призначення? У мережі багато активності, а інспектор браузерів надзвичайно повільний, тому важко аналізувати. 600K / s на моїй машині. Тоді це буде набагато швидше ініціювати передачу в мережі Amazon ... Натомість спробую там.
Brad Goss

9
Я щойно використовував цей метод сьогодні. Він не тягне файли на локальну машину - він робить пряму копію та набагато швидше.
Грег Бенедикт

7
Він все ще отримує список файлів. Якщо список занадто довгий (у моєму випадку десятки тисяч файлів), тоді він як повільний. І тайм-аут / зависання надзвичайно ймовірні
Пхонг Нгуйон

13
На жаль, цей процес пов’язаний з браузером. :( З документації : "Після запуску процесу копіювання ви повинні тримати браузер відкритим, доки триває копіювання."
Девід Лемайян,

4
Я намагаюся зробити це на відрі з 8 мільйонами файлів. Не знаю, скільки місяців мені знадобиться, щоб позначити всі прапорці ...
Кріс Гаррісон,

28

Я спробував клонувати два відра за допомогою веб-консолі AWS, s3cmdта CLI 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

1
Дивовижний інструмент, настійно рекомендований для інших, для великої кількості файлів. Контроль за кількістю потоків копіювання є чудовим.
Шаунак

Чи не вважаєте ви, що безпечніше використовувати програму aws-cli, а не сторонні програми? Врешті-решт нам потрібно надати облікові дані або ключі доступу, щоб використовувати ці інструменти.
Кіт Сугатадхадаса

10

Для рішення adhoc використовуйте 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 Гб, файли 72K, us-east-1) протягом 474 секунд.

Для отримання більш загального рішення розгляньте - реплікацію міжрегіональної області AWS DataPipeLine або S3.


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

Крім того, які ваші думки з цього приводу щодо випадку використання, коли у мене є 1 тис. Або менше файлів, але вони більші за розміром (10 Гб)? Ви думаєте, я бачив би подібний виступ?
морозний

@frosty, у моєму випадку відро призначення було порожнім. на awscliдокумент - aws syncкопіюйте лише нові та оновлені файли. ймовірно, слід очікувати високої продуктивності за допомогою aws cp(копіювання здійснюється внутрішньо, ваш клієнт просто видає виклик API). продуктивність залежить від цих факторів: 1. латентність між регіонами src та dst (наприклад, us-east-X до us-west-X) 2. латентність між вашим клієнтом та кінцевою точкою API AWS (наскільки швидко ви можете здійснити виклик API) 3. кількість одночасних запитів (скільки запитів на секунду може зробити ваш клієнт). У моєму випадку 309G було скопійовано між відрами в тому ж регіоні (США-схід-1)
Том Лайм

3

Оскільки мова йде про перший хіт Google на цю тему, додавши додаткову інформацію.

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

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


s3cmd-модифікація заощадила мені дні копіювання.
gak

2

Я не знаю жодного іншого інструменту командного рядка S3, але якщо тут нічого не виникає, можливо, найпростіше написати свій власний.

Виберіть будь-яку мову та Amazon SDK / Набір інструментів, який вам більше подобається. Тоді вам просто потрібно перерахувати / отримати вміст вихідного сегмента та скопіювати кожен файл (паралельно, очевидно)

Дивлячись на джерело модифікації 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.