У мене є мільйони файлів у відрі Amazon S3, і я хотів би перенести ці файли в інші відра і папки з мінімальною вартістю або, якщо це можливо, без витрат. Всі відра знаходяться в одній зоні.
Як я міг це зробити?
У мене є мільйони файлів у відрі Amazon S3, і я хотів би перенести ці файли в інші відра і папки з мінімальною вартістю або, якщо це можливо, без витрат. Всі відра знаходяться в одній зоні.
Як я міг це зробити?
Відповіді:
Мільйони - це велика кількість - я до цього повернусь пізніше.
Незалежно від вашого підходу, основний механізм повинен копіювати безпосередньо з одного відра в інше - таким чином (оскільки ваші відра знаходяться в одному регіоні) ви не несете ніякої плати за пропускну здатність. Будь-який інший підхід просто неефективний (наприклад, завантаження та перезавантаження файлів).
Копіювання між відрами здійснюється за допомогою "PUT copy" - тобто запиту PUT, який включає заголовку "x-amz-copy-source" - я вважаю, що це класифікується як запит COPY. Це скопіює файл і за замовчуванням пов'язані метадані. Ви повинні включити "x-amz-acl" з правильним значенням, якщо ви хочете одночасно встановити ACL (інакше він буде за замовчуванням приватним). З вас будуть стягнуті ваші запити COPY (0,01 дол. США / 1000 запитів). Ви можете видалити непотрібні файли після їх копіювання (DELETE-запити не стягуються). (Мені не зовсім зрозуміло, чи не вимагає запит COPY також стягувати GET-запит, оскільки об’єкт спочатку повинен бути отриманий з вихідного відра - якщо це так, заряд буде додатково 0,01 $ / 10000 запити).
Вищезазначені звинувачення, здавалося б, неминучі - на мільйон предметів ви шукаєте приблизно 10 доларів (або 11 доларів). Оскільки зрештою потрібно створити файли у відрізці призначення, інші підходи (наприклад, tar-gzipping файлів, Amazon Import / Export тощо) не обійдуть ці витрати. Незважаючи на це, можливо, варто звернутися до Amazon, якщо у вас є кілька мільйонів об'єктів для передачі.
З огляду на вищезазначене (неминуча ціна), наступне, на що слід звернути увагу - час, який стане великим фактором при копіюванні «мільйонів файлів». Усі інструменти, які можуть виконувати пряму копію між відрами, несуть однакову плату. На жаль, вам потрібен один запит на файл (для копіювання), один запит на видалення та, можливо, один запит для читання даних ACL (якщо ваші файли мають різні ACL). Найкраща швидкість вийде з того, що може виконати найбільш паралельні операції.
Є кілька підходів до командного рядка, які можуть бути цілком життєздатними:
Існує певна можливість, що s3fs може працювати - це досить паралельно, підтримує копії між одним і тим же відром - НЕ підтримує копії між різними відрами, але може підтримувати переміщення між різними відрами.
Я б почав з модифікації s3cmd і побачив, чи маєте ви успіх у цьому, або зв’яжіться з Amazon для кращого рішення.
aws s3 sync s3://source s3://destination
вміщується?
Стара тема, але це для тих, хто досліджує той самий сценарій. Разом із часом, який мені знадобилося, для 20 000+ об’єктів. Працює на AWS Linux / Centos, кожен об'єкт здебільшого є зображеннями, а також деякими відео та різними медіафайлами.
Використання інструментів AWS CLI для копіювання файлів із відра А в відро B.
A. Створіть нове відро
$ aws s3 mb s3://new-bucket-name
B. Синхронізуйте старе відро з новим
$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
Копіювання 20 000+ об’єктів ...
Почав 17:03
Закінчився 17:06
Загальний час для 20 000+ об'єктів = приблизно 3 хвилини
Після правильного налаштування нового відра, тобто дозволів, політики тощо, і ви хочете видалити старе.
C. Вийміть / видаліть старе відро
$ aws s3 rb --force s3://old-bucket-name
Я не впевнений, що це найкращий підхід, але консоль управління AWS має функцію вирізання / копіювання / вставки. дуже простий у використанні та ефективний.
Я думаю, що ви, мабуть, знайшли хороше рішення до цього часу, але для інших, хто стикається з цією проблемою (як я нещодавно), я створив просту утиліту спеціально для того, щоб відобразити одне відро S3 до іншого в дуже одночасний, але в той же час процесор і пам'ять.
Це на Github під ліцензією Apache тут: https://github.com/cobbzilla/s3s3mirror
Якщо ви вирішите спробувати, будь ласка, повідомте мене, чи є у вас відгуки.
--cross-account-copy
варіант ( -C
коротко) зробити це. Зауважте, що при копіюванні через облікові записи ACL не копіюються; власник відрізка призначення матиме повні дозволи на скопійовані дані.
AWS CLI пропонує спосіб копіювання одного відра в інший при паралельних процесах. Взяте з https://stackoverflow.com/a/40270349/371699 :
Наступні команди дадуть команду AWS CLI використовувати 1000 потоків для виконання завдань (кожен невеликий файл або одну частину багаточастинкової копії) і заздалегідь розглянути 100 000 завдань:
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
Запустивши їх, ви можете використовувати просту команду синхронізації наступним чином:
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
На машині m4.xlarge (в AWS - 4 ядра, 16 Гб оперативної пам’яті) для мого випадку (файли 3-50 ГБ) швидкість синхронізації / копіювання пішла приблизно від 9,5 Мбіт / с до 700 + МіБ / с, збільшення швидкості 70 разів за конфігурацією за замовчуванням.