Duplicazione più rapida del bucket s3


93

Ho cercato di trovare uno strumento da riga di comando migliore per duplicare i bucket rispetto a s3cmd . s3cmdpuò duplicare i bucket senza dover scaricare e caricare ogni file. Il comando che normalmente eseguo per duplicare i bucket utilizzando s3cmd è:

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

Funziona, ma è molto lento poiché copia ogni file tramite l'API uno alla volta. Se s3cmdpotesse funzionare in modalità parallela, sarei molto felice.

Sono disponibili altre opzioni come strumenti della riga di comando o codice che le persone utilizzano per duplicare i bucket più veloci di s3cmd?

Modifica: sembra che la modifica di s3cmd sia esattamente quello che sto cercando. Peccato che non funzioni. Ci sono altre opzioni?


6
Non sono sicuro del motivo per cui questa domanda viene ripetutamente chiusa, dal momento che sembra che molti sviluppatori si siano imbattuti in essa. Ad ogni modo, l'ho risolto in modo altamente parallelo, ecco il link: github.com/cobbzilla/s3s3mirror grazie! - Jonathan.
cobbzilla

Risposte:


166

AWS CLI sembra svolgere perfettamente il suo lavoro e ha il vantaggio di essere uno strumento ufficialmente supportato.

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

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

Supporta trasferimenti simultanei per impostazione predefinita. Vedi http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests

Per trasferire rapidamente un numero enorme di file di piccole dimensioni, esegui lo script da un'istanza EC2 per diminuire la latenza e aumentalo max_concurrent_requestsper ridurre l'impatto della latenza. Per esempio:

aws configure set default.s3.max_concurrent_requests 200

4
Supporta la sincronizzazione non simultanea in base al tempo di modifica del file, alla dimensione, ecc. È stato velocissimo quando l'ho provato. Credo che gli oggetti vengano copiati direttamente su S3 senza scaricarli sulla macchina locale. Non viene eseguito in parallelo per impostazione predefinita, ma sono sicuro che potresti avere più comandi di sincronizzazione in esecuzione su sottocartelle separate contemporaneamente. È abbastanza veloce che probabilmente non avrai bisogno che funzioni in parallelo comunque. Ho appena duplicato 100 GB di dati in pochi minuti.
python1981

10
Lento come l'inferno se il numero di file è alto.
Phương Nguyễn

14
Quando si trasferiscono molti file di piccole dimensioni, la latenza diventa il vincolo chiave, quindi è essenziale eseguire questo comando da un'istanza EC2.
python1981

1
L'ho usato per costruire una finestra mobile e funziona abbastanza bene github.com/sunshineo/s3-bucket-copier
Gordon Sun

3
Ora supporta la sincronizzazione simultanea :-) docs.aws.amazon.com/cli/latest/topic/…
python1981

70

Se non ti dispiace usare la console AWS, puoi:

  1. Seleziona tutti i file / cartelle nel primo bucket
  2. Fare clic su Azioni> Copia
  3. Crea un nuovo bucket e selezionalo
  4. Fare clic su Azioni> Incolla

È ancora abbastanza lento, ma puoi lasciarlo da solo e lasciarlo fare.


Sta copiando il contenuto del bucket di origine sulla mia macchina mentre copia nella destinazione? C'è molta attività di rete e l'ispettore del browser è estremamente lento, quindi è difficile da analizzare. 600K / s sulla mia macchina. Sarebbe quindi molto più veloce avviare il trasferimento all'interno della rete amazon ... Ci proverò invece.
Brad Goss

9
Ho appena usato questo metodo oggi. Non trasferisce i file sul computer locale: esegue una copia diretta ed è molto, molto più veloce.
Greg Benedict

7
Recupera ancora l'elenco dei file. Se l'elenco è troppo lungo (dozzine di migliaia di file nel mio caso), allora è lento. E il timeout / blocco è estremamente probabile
Phương Nguyễn

13
Purtroppo questo processo è legato al browser. :( Dai documenti : "Dopo aver avviato il processo di copia, devi tenere il browser aperto mentre la copia è in corso."
David Lemayian

4
Sto provando a farlo su un bucket con 8 milioni di file al suo interno. Non so quanti mesi mi ci vorranno per selezionare tutte le caselle di controllo ...
Chris Harrison,

27

Ho provato a clonare due bucket utilizzando la console Web AWS, s3cmde l'AWS CLI. Sebbene questi metodi funzionino per la maggior parte del tempo, sono dolorosamente lenti.

Poi ho trovato s3s3mirror: uno strumento specializzato per sincronizzare due bucket S3. È multi-thread e molto più veloce degli altri approcci che ho provato. Ho spostato rapidamente Giga-byte di dati da una regione AWS a un'altra.

Controllalo su https://github.com/cobbzilla/s3s3mirror o scarica un container Docker da https://registry.hub.docker.com/u/pmoust/s3s3mirror/


1
Se hai molti file da trasferire, questo è di gran lunga lo strumento migliore per il lavoro. Peccato che sia così in fondo alla lista delle risposte ...
John Chrysostom

Nota per alcune persone: richiede Java 6/7 per la compilazione.
Brian

1
Lo sto usando da un'istanza EC2 e funziona incredibilmente velocemente! Ho dovuto sostituire <source-bucket> e <destination-bucket> con il nome effettivo del bucket (non l'endpoint o qualcosa di simile in AWS CLI).
Ironmouse

1
Strumento straordinario, altamente consigliato rispetto ad altri, per un gran numero di file. Il controllo sul numero di thread di copia è eccezionale.
Shaunak

Non pensi che sia più sicuro utilizzare aws-cli e non applicazioni di terze parti per svolgere il lavoro? Dopo tutto, dobbiamo fornire credenziali o chiavi di accesso per utilizzare questi strumenti.
Keet Sugathadasa

10

Per l'utilizzo di soluzioni ad hoc aws cliper la sincronizzazione tra i bucket:

aws s3 syncla velocità dipende da:
- latenza per una chiamata API all'endpoint S3
- quantità di chiamate API effettuate simultaneamente

Per aumentare la velocità di sincronizzazione:
- esegui aws s3 syncda un'istanza AWS (c3.large su FreeBSD è OK ;-))
- aggiorna ~ / .aws / config con:
- max_concurrent_requests = 128
-max_queue_size = 8096

con la seguente configurazione e il tipo di istanza sono stato in grado di sincronizzare il bucket (309 GB, 72.000 file, us-east-1) entro 474 secondi.

Per una soluzione più generica, considera: AWS DataPipeLine o replica interregionale S3.


Sai se potevo aspettarmi le stesse prestazioni se usassi S3 cp? Sei sicuro che quando hai utilizzato la sincronizzazione abbia effettivamente trasferito tutti i 309 GB? sync sincronizzerà solo i file che non sono uguali o presenti nell'altro bucket.
gelido

Inoltre, che cosa ne pensi di questo per un caso d'uso in cui ho 1k o meno file, ma sono di dimensioni maggiori (10 GB)? Credi che vedrei prestazioni simili a te?
gelido

@frosty, nel mio caso il bucket di destinazione era vuoto. per awsclidoc - aws synccopia solo i file nuovi e aggiornati. probabilmente dovresti aspettarti prestazioni elevate con aws cp(la copia viene eseguita internamente, il tuo client emette solo una chiamata API). le prestazioni dipendono da questi fattori: 1. latenza tra le regioni src e dst (ad es. us-east-X a us-west-X) 2. latenza tra il tuo client e l'endpoint API AWS (quanto velocemente puoi emettere una chiamata API) 3. quantità di richieste simultanee (quante richieste al secondo il tuo client può emettere). Nel mio caso 309G è stato copiato tra bucket nella stessa regione (us-east-1)
Tom Lime

3

Poiché si tratta del primo successo di Google su questo argomento, l'aggiunta di informazioni extra.

"Cyno" ha creato una versione più recente di s3cmd-modification, che ora supporta la sincronizzazione parallela da bucket a bucket. Esattamente quello che stavo aspettando anch'io.

La richiesta di pull è su https://github.com/pcorliss/s3cmd-modification/pull/2 , la sua versione su https://github.com/pearltrees/s3cmd-modification


La modifica di s3cmd mi ha fatto risparmiare giorni di copia.
Gak

2

Non conosco altri strumenti da riga di comando S3, ma se non viene fuori nulla qui, potrebbe essere più semplice scriverne uno tuo.

Scegli la lingua e Amazon SDK / Toolkit che preferisci. Quindi devi solo elencare / recuperare il contenuto del bucket di origine e copiare ogni file (in parallelo ovviamente)

Guardando la fonte per la modifica di s3cmd (e ammetto di non sapere nulla di python), sembra che non abbiano parallelizzato il codice da bucket a bucket, ma forse potresti utilizzare il codice parallelo di upload / download standard come punto di partenza per Fai questo.


Si. Ho giocato con questa idea e l'ho scritta in rosso rubino con modalità ad eventi con la macchina degli eventi o in thread con JRuby. Tuttavia, s3cmd è già abbastanza completo e preferirei usarlo. Ho parlato con lo sviluppatore di s3cmd e ha un paio di soluzioni in cantiere che probabilmente risolveranno i problemi di prestazioni.
Sean McCleary

1

un semplice aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursivefunziona bene (supponendo che tu abbia la configurazione di aws cli)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.