Schnellere Duplizierung von S3-Buckets

93

Ich habe versucht, ein besseres Befehlszeilen-Tool zum Duplizieren von Buckets als s3cmd zu finden . s3cmdkann Buckets duplizieren, ohne jede Datei herunterladen und hochladen zu müssen. Der Befehl, den ich normalerweise ausführe, um Buckets mit s3cmd zu duplizieren, lautet:

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

Dies funktioniert, ist jedoch sehr langsam, da jede Datei einzeln über die API kopiert wird. Wenn s3cmdich im Parallelmodus laufen könnte, wäre ich sehr glücklich.

Gibt es andere Optionen als Befehlszeilentools oder Code, mit denen Benutzer Buckets duplizieren, die schneller sind als s3cmd?

Edit: Sieht so aus, als ob s3cmd-Modifikation genau das ist, wonach ich suche. Schade, dass es nicht funktioniert. Gibt es noch andere Möglichkeiten?

Sean McCleary
quelle
6
Ich bin mir nicht sicher, warum diese Frage wiederholt geschlossen wird, da anscheinend eine Reihe von Entwicklern darauf gestoßen sind. Wie auch immer, ich habe es sehr parallel gelöst, hier ist der Link: github.com/cobbzilla/s3s3mirror danke! - Jonathan.
Cobbzilla

Antworten:

166

AWS CLI scheint die Arbeit perfekt zu machen und hat den Vorteil, ein offiziell unterstütztes Tool zu sein.

aws s3 sync s3://mybucket s3://backup-mybucket

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

Unterstützt standardmäßig gleichzeitige Übertragungen. Siehe http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests

Um eine große Anzahl kleiner Dateien schnell zu übertragen, führen Sie das Skript von einer EC2-Instanz aus, um die Latenz zu verringern, und erhöhen Sie es max_concurrent_requests, um die Auswirkungen der Latenz zu verringern. Z.B:

aws configure set default.s3.max_concurrent_requests 200
python1981
quelle
4
Es unterstützt die nicht gleichzeitige Synchronisierung basierend auf der geänderten Zeit, Größe usw. der Datei. Es war blitzschnell, als ich es ausprobierte. Ich glaube, die Objekte werden direkt auf S3 kopiert, ohne sie auf den lokalen Computer herunterzuladen. Es wird standardmäßig nicht parallel ausgeführt, aber ich bin sicher, dass mehrere Synchronisierungsbefehle gleichzeitig in separaten Unterordnern ausgeführt werden können. Es ist schnell genug, dass Sie es wahrscheinlich sowieso nicht parallel laufen lassen müssen. Ich habe gerade 100 GB Daten in wenigen Minuten dupliziert.
Python1981
10
Langsam wie die Hölle, wenn die Anzahl der Dateien hoch ist.
Phương Nguyễn
14
Wenn beim Übertragen vieler kleiner Dateien die Latenz zur Hauptbeschränkung wird, ist es wichtig, diesen Befehl von einer EC2-Instanz aus auszuführen.
Python1981
1
Ich habe dies verwendet, um einen Docker zu bauen und funktioniert ziemlich gut. Github.com/sunshineo/s3-bucket-copier
Gordon Sun
3
Jetzt unterstützt es die gleichzeitige Synchronisierung :-) docs.aws.amazon.com/cli/latest/topic/…
python1981
70

Wenn Ihnen die Verwendung der AWS-Konsole nichts ausmacht, können Sie:

  1. Wählen Sie alle Dateien / Ordner im ersten Bucket aus
  2. Klicken Sie auf Aktionen> Kopieren
  3. Erstellen Sie einen neuen Bucket und wählen Sie ihn aus
  4. Klicken Sie auf Aktionen> Einfügen

Es ist immer noch ziemlich langsam, aber Sie können es in Ruhe lassen und es seine Sache machen lassen.

tödlich
quelle
Kopiert dies den Inhalt des Quell-Buckets auf meinen Computer, während er auf das Ziel kopiert? Es gibt viele Netzwerkaktivitäten und der Browser-Inspektor ist extrem langsam, so dass es schwierig ist, ihn zu analysieren. 600K / s auf meiner Maschine. Dies wäre dann viel schneller, um die Übertragung innerhalb des Amazon-Netzwerks zu initiieren ... Ich werde es stattdessen dort versuchen.
Brad Goss
9
Ich habe diese Methode heute gerade angewendet. Es zieht die Dateien nicht auf Ihren lokalen Computer herunter - es kopiert direkt und ist viel, viel schneller.
Greg Benedict
7
Es wird immer noch die Dateiliste abgerufen. Wenn die Liste zu lang ist (in meinem Fall Zehntausende von Dateien), ist sie verdammt langsam. Und Timeout / Hang ist sehr wahrscheinlich
Phương Nguyễn
13
Leider ist dieser Vorgang an den Browser gebunden. :( Aus den Dokumenten : "Nachdem Sie den Kopiervorgang
gestartet haben,
4
Ich versuche dies in einem Eimer mit 8 Millionen Dateien zu tun. Ich weiß nicht, wie viele Monate ich brauchen werde, um alle Kontrollkästchen zu aktivieren ...
Chris Harrison
27

Ich habe versucht, zwei Buckets mit der AWS-Webkonsole, der s3cmdund der AWS-CLI , zu klonen . Obwohl diese Methoden die meiste Zeit funktionieren, sind sie schmerzhaft langsam.

Dann fand ich s3s3mirror: ein spezielles Tool zum Synchronisieren von zwei S3-Buckets. Es ist multithreaded und viel schneller als die anderen Ansätze, die ich versucht habe. Ich habe schnell Giga-Bytes an Daten von einer AWS-Region in eine andere verschoben.

Überprüfen Sie es unter https://github.com/cobbzilla/s3s3mirror oder laden Sie einen Docker-Container von https://registry.hub.docker.com/u/pmoust/s3s3mirror/ herunter.

Ketil
quelle
1
Wenn Sie viele Dateien übertragen müssen, ist dies bei weitem das beste Werkzeug für diesen Job. Schade, dass es so weit unten in der Liste der Antworten ist ...
John Chrysostom
Hinweis für einige Personen: Zum Kompilieren ist Java 6/7 erforderlich.
Brian
1
Ich benutze dies von einer EC2-Instanz und es funktioniert unglaublich schnell! Ich musste <source-bucket> und <destination-bucket> durch den tatsächlichen Bucket-Namen ersetzen (nicht den Endpunkt oder so etwas wie in AWS CLI).
Eisenmaus
1
Erstaunliches Tool, das anderen gegenüber sehr zu empfehlen ist, für eine große Anzahl von Dateien. Die Kontrolle über die Anzahl der Kopierthreads ist brillant.
Shaunak
Denken Sie nicht, dass es sicherer ist, aws-cli und keine Anwendungen von Drittanbietern zu verwenden, um die Arbeit zu erledigen? Schließlich müssen wir Anmeldeinformationen oder Zugriffsschlüssel angeben, um diese Tools verwenden zu können.
Keet Sugathadasa
10

Verwenden Sie für die Ad-hoc-Lösung die aws cliSynchronisierung zwischen Buckets:

aws s3 syncDie Geschwindigkeit hängt ab von:
- Latenz für einen API-Aufruf an den S3-Endpunkt
- Anzahl der gleichzeitig ausgeführten API-Aufrufe

So erhöhen Sie die Synchronisierungsgeschwindigkeit:
- Ausführen aws s3 syncvon einer AWS-Instanz (c3.large unter FreeBSD ist in Ordnung ;-))
- Aktualisieren Sie ~ / .aws / config mit:
- max_concurrent_requests = 128
-max_queue_size = 8096

Mit der folgenden Konfiguration und dem folgenden Instanztyp konnte ich den Bucket (309 GB, 72 KB Dateien, us-east-1) innerhalb von 474 Sekunden synchronisieren.

Für eine allgemeinere Lösung sollten Sie Folgendes berücksichtigen: AWS DataPipeLine- oder S3-Replikation über Regionen hinweg.

Tom Lime
quelle
Wissen Sie, ob ich mit S3 cp die gleiche Leistung erwarten könnte? Sind Sie sicher, dass bei Verwendung von Sync tatsächlich alle 309 GB übertragen wurden? Bei der Synchronisierung werden nur Dateien synchronisiert, die nicht identisch sind oder im anderen Bucket vorhanden sind.
Frosty
Was denken Sie darüber für einen Anwendungsfall, in dem ich 1 KB oder weniger Dateien habe, diese aber größer sind (10 GB)? Glaubst du, ich würde eine ähnliche Leistung wie du sehen?
frostig
@ Frosty, in meinem Fall war der Ziel-Eimer leer. per awsclidoc - aws synckopiere nur neue und aktualisierte Dateien. Wahrscheinlich sollten Sie mit einer hohen Leistung rechnen aws cp(das Kopieren erfolgt intern, Ihr Client gibt nur einen API-Aufruf aus). Die Leistung hängt von folgenden Faktoren ab: 1. Latenz zwischen src- und dst-Regionen (z. B. us-east-X bis us-west-X) 2. Latenz zwischen Ihrem Client und dem AWS-API-Endpunkt (wie schnell Sie einen API-Aufruf ausgeben können) 3. Anzahl gleichzeitiger Anforderungen (wie viele Anforderungen pro Sekunde Ihr Client ausgeben kann). In meinem Fall wurde 309G zwischen Eimern in derselben Region (us-east-1) kopiert
Tom Lime
3

Da es sich um Googles ersten Treffer zu diesem Thema handelt, werden zusätzliche Informationen hinzugefügt.

'Cyno' hat eine neuere Version der s3cmd-Modifikation erstellt, die jetzt die parallele Bucket-to-Bucket-Synchronisierung unterstützt. Genau darauf habe ich auch gewartet.

Die Pull-Anfrage finden Sie unter https://github.com/pcorliss/s3cmd-modification/pull/2 , seine Version unter https://github.com/pearltrees/s3cmd-modification

Jean-Pierre Deckers
quelle
Die s3cmd-Modifikation hat mir Tage des Kopierens erspart.
Gak
2

Ich kenne keine anderen S3-Befehlszeilentools, aber wenn hier nichts auftaucht, ist es möglicherweise am einfachsten, eigene zu schreiben.

Wählen Sie die Sprache und das Amazon SDK / Toolkit aus, die Sie bevorzugen. Dann müssen Sie nur noch den Inhalt des Quell-Buckets auflisten / abrufen und jede Datei kopieren (natürlich parallel).

Wenn man sich die Quelle für die s3cmd-Modifikation ansieht (und ich gebe zu, ich weiß nichts über Python), sieht es so aus, als hätten sie den Bucket-to-Bucket-Code nicht parallelisiert, aber vielleicht könnten Sie den Standard-Upload / Download-Parallelcode als Ausgangspunkt verwenden mach das.

Geoff Appleford
quelle
Ja. Ich habe mit dieser Idee gespielt und sie mit Event-Maschine oder mit JRuby in Ruby geschrieben. Allerdings ist s3cmd schon ziemlich vollständig und ich würde das lieber einfach benutzen. Ich habe mit dem Entwickler von s3cmd gesprochen, und er hat einige Lösungen in der Pipeline, die wahrscheinlich Leistungsprobleme beheben werden.
Sean McCleary
1

ein einfaches aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursivefunktioniert gut (vorausgesetzt du hast aws cli setup)

mdmjsh
quelle