Швидше копіювання відра 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.