Ich habe versucht, ein besseres Befehlszeilen-Tool zum Duplizieren von Buckets als s3cmd zu finden . s3cmd
kann 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 s3cmd
ich 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?
amazon-web-services
amazon-s3
Sean McCleary
quelle
quelle
Antworten:
AWS CLI scheint die Arbeit perfekt zu machen und hat den Vorteil, ein offiziell unterstütztes Tool zu sein.
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:quelle
Wenn Ihnen die Verwendung der AWS-Konsole nichts ausmacht, können Sie:
Es ist immer noch ziemlich langsam, aber Sie können es in Ruhe lassen und es seine Sache machen lassen.
quelle
Ich habe versucht, zwei Buckets mit der AWS-Webkonsole, der
s3cmd
und 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.
quelle
Verwenden Sie für die Ad-hoc-Lösung die
aws cli
Synchronisierung zwischen Buckets:aws s3 sync
Die 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 sync
von 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.
quelle
awscli
doc -aws sync
kopiere nur neue und aktualisierte Dateien. Wahrscheinlich sollten Sie mit einer hohen Leistung rechnenaws 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) kopiertDa 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
quelle
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.
quelle
ein einfaches
aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursive
funktioniert gut (vorausgesetzt du hast aws cli setup)quelle