Duplication de seau s3 plus rapide

93

J'ai essayé de trouver un meilleur outil de ligne de commande pour dupliquer des buckets que s3cmd . s3cmdpeut dupliquer des buckets sans avoir à télécharger et télécharger chaque fichier. La commande que j'exécute normalement pour dupliquer des seaux à l'aide de s3cmd est:

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

Cela fonctionne, mais c'est très lent car il copie chaque fichier via l'API un par un. Si s3cmdpouvait fonctionner en mode parallèle, je serais très heureux.

Existe-t-il d'autres options disponibles en tant qu'outils de ligne de commande ou code que les gens utilisent pour dupliquer des buckets plus rapides que s3cmd?

Edit: On dirait que s3cmd-modification est exactement ce que je recherche. Dommage que ça ne marche pas. Il y a-t-il des alternatives?

Sean McCleary
la source
6
Je ne sais pas pourquoi cette question est fermée à plusieurs reprises, car il semble qu'un certain nombre de développeurs l'aient rencontrée. Quoi qu'il en soit, je l'ai résolu de manière très parallèle, voici le lien: github.com/cobbzilla/s3s3mirror merci! - Jonathan.
cobbzilla

Réponses:

166

AWS CLI semble parfaitement faire le travail et a l'avantage d'être un outil officiellement pris en charge.

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

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

Prend en charge les transferts simultanés par défaut. Voir http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests

Pour transférer rapidement un grand nombre de petits fichiers, exécutez le script à partir d'une instance EC2 pour réduire la latence et augmentez-la max_concurrent_requestspour réduire l'impact de la latence. Par exemple:

aws configure set default.s3.max_concurrent_requests 200
python1981
la source
4
Il prend en charge la synchronisation non simultanée en fonction de l'heure de modification du fichier, de sa taille, etc. C'était ultra rapide lorsque je l'ai essayé. Je crois que les objets sont copiés directement sur S3 sans les télécharger sur la machine locale. Il ne fonctionne pas en parallèle par défaut, mais je suis sûr que vous pourriez avoir plusieurs commandes de synchronisation s'exécutant sur des sous-dossiers distincts en même temps. Il est suffisamment rapide pour que vous n'en ayez probablement pas besoin de toute façon. Je viens de dupliquer 100 Go de données en quelques minutes.
python1981
11
Lent comme l'enfer si le nombre de fichiers est élevé.
Phương Nguyễn
14
Lors du transfert de nombreux petits fichiers, la latence devient la principale contrainte, il est donc essentiel d'exécuter cette commande à partir d'une instance EC2.
python1981
1
Je l'ai utilisé pour construire un docker et fonctionne plutôt bien github.com/sunshineo/s3-bucket-copier
Gordon Sun
3
Maintenant, il prend en charge la synchronisation simultanée :-) docs.aws.amazon.com/cli/latest/topic/…
python1981
70

Si cela ne vous dérange pas d'utiliser la console AWS, vous pouvez:

  1. Sélectionnez tous les fichiers / dossiers dans le premier compartiment
  2. Cliquez sur Actions> Copier
  3. Créez un nouveau bucket et sélectionnez-le
  4. Cliquez sur Actions> Coller

C'est encore assez lent, mais vous pouvez le laisser seul et le laisser faire son travail.

mort
la source
Est-ce que cela copie le contenu du compartiment source sur ma machine lors de la copie vers la destination? Il y a beaucoup d'activité réseau et l'inspecteur de navigateur est extrêmement lent, il est donc difficile à analyser. 600K / s sur ma machine. Ce serait alors beaucoup plus rapide de lancer le transfert au sein du réseau amazon ... J'essaierai à la place.
Brad Goss le
9
Je viens d'utiliser cette méthode aujourd'hui. Il ne récupère pas les fichiers sur votre ordinateur local - il effectue une copie directe et est beaucoup, beaucoup plus rapide.
Greg Benedict
7
Il récupère toujours la liste des fichiers. Si la liste est trop longue (des dizaines de milliers de fichiers dans mon cas), alors c'est lent comme diable. Et le timeout / hang est extrêmement probable
Phương Nguyễn
13
Malheureusement, ce processus est lié au navigateur. :( Extrait de la documentation : "Après avoir lancé le processus de copie, vous devez garder le navigateur ouvert pendant que la copie est en cours."
David Lemayian
4
J'essaie de le faire sur un seau contenant 8 millions de fichiers. Je ne sais pas combien de mois il me faudra pour cocher toutes les cases ...
Chris Harrison
28

J'ai essayé de cloner deux buckets à l'aide de la console Web AWS, s3cmdet de l'AWS CLI. Bien que ces méthodes fonctionnent la plupart du temps, elles sont extrêmement lentes.

Puis j'ai trouvé s3s3mirror: un outil spécialisé pour synchroniser deux compartiments S3. Il est multi-thread et beaucoup plus rapide que les autres approches que j'ai essayées. J'ai rapidement déplacé des Giga-octets de données d'une région AWS à une autre.

Découvrez-le sur https://github.com/cobbzilla/s3s3mirror ou téléchargez un conteneur Docker sur https://registry.hub.docker.com/u/pmoust/s3s3mirror/

Ketil
la source
1
Si vous avez beaucoup de fichiers à transférer, c'est de loin le meilleur outil pour le travail. Dommage que ce soit si loin dans la liste des réponses ...
John Chrysostom
Note à certaines personnes: nécessite Java 6/7 pour compiler.
Brian
1
J'utilise ceci à partir d'une instance EC2 et cela fonctionne incroyablement vite! J'ai dû remplacer <source-bucket> et <destination-bucket> par le nom réel du bucket (pas le point de terminaison ou quelque chose comme dans AWS CLI).
ironmouse
1
Outil incroyable, fortement recommandé par rapport aux autres, pour un grand nombre de fichiers. Le contrôle du nombre de threads de copie est génial.
Shaunak
Ne pensez-vous pas qu'il est plus sûr d'utiliser aws-cli et non des applications tierces pour faire le travail? Après tout, nous devons fournir des informations d'identification ou des clés d'accès pour utiliser ces outils.
Keet Sugathadasa
10

Pour une solution adhoc, utilisez aws clipour synchroniser entre les buckets:

aws s3 syncla vitesse dépend:
- de la latence d'un appel d'API vers un point de terminaison S3
- du nombre d'appels d'API effectués simultanément

Pour augmenter la vitesse de synchronisation:
- exécutez aws s3 syncdepuis une instance AWS (c3.large sur FreeBSD est OK ;-))
- mettez à jour ~ / .aws / config avec:
- max_concurrent_requests = 128
-max_queue_size = 8096

Avec la configuration et le type d'instance suivants, j'ai pu synchroniser le bucket (309 Go, 72K fichiers, us-east-1) en 474 secondes.

Pour une solution plus générique, envisagez la réplication entre régions AWS DataPipeLine ou S3.

Tom Lime
la source
Savez-vous si je pourrais m'attendre aux mêmes performances si j'utilisais S3 cp? Êtes-vous sûr que lorsque vous avez utilisé la synchronisation, les 309 Go ont effectivement été transférés? sync ne synchronisera que les fichiers qui ne sont pas identiques ou présents dans l'autre compartiment.
frosty
De plus, que pensez-vous de cela pour un cas d'utilisation où j'ai 1k fichiers ou moins, mais ils sont de plus grande taille (10 Go)? Pensez-vous que je verrais une performance similaire à vous?
frosty
@frosty, dans mon cas, le seau de destination était vide. per awsclidoc - aws synccopie uniquement les fichiers nouveaux et mis à jour. vous devriez probablement vous attendre à des performances élevées avec aws cp(la copie est effectuée en interne, votre client émet simplement un appel API). les performances dépendent de ces facteurs: 1. latence entre les régions src et dst (par exemple, us-east-X vers us-west-X) 2. latence entre votre client et le point de terminaison d'API AWS (à quelle vitesse vous pouvez émettre un appel d'API) 3. quantité de requêtes simultanées (combien de requêtes par seconde votre client peut émettre). Dans mon cas, 309G a été copié entre des seaux dans la même région (us-east-1)
Tom Lime
3

Comme il s'agit du premier succès de Google sur ce sujet, ajouter des informations supplémentaires.

«Cyno» a créé une version plus récente de s3cmd-modification, qui prend désormais en charge la synchronisation parallèle de bucket-to-bucket. Exactement ce que j'attendais aussi.

La demande d'extraction est à https://github.com/pcorliss/s3cmd-modification/pull/2 , sa version à https://github.com/pearltrees/s3cmd-modification

Jean-Pierre Deckers
la source
s3cmd-modification m'a sauvé des jours de copie.
gak
2

Je ne connais aucun autre outil de ligne de commande S3, mais si rien ne se présente ici, il serait peut-être plus facile d'écrire le vôtre.

Choisissez la langue et Amazon SDK / Toolkit que vous préférez. Ensuite, il vous suffit de lister / récupérer le contenu du bucket source et de copier chaque fichier (en parallèle évidemment)

En regardant la source de s3cmd-modification (et j'admets que je ne sais rien sur python), il semble qu'ils n'aient pas parallélisé le code bucket-to-bucket, mais vous pourriez peut-être utiliser le code parallèle standard de téléchargement / téléchargement comme point de départ pour fais ça.

Geoff Appleford
la source
Ouais. J'ai joué avec cette idée et l'ai écrite en rubis de manière événementielle avec une machine événementielle ou enfilée avec JRuby. Cependant, s3cmd est déjà assez complet et je préfère l'utiliser. J'ai parlé avec le développeur de s3cmd, et il a quelques solutions en préparation qui résoudront probablement les problèmes de performances.
Sean McCleary
1

un simple aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursivefonctionne bien (en supposant que vous ayez la configuration aws cli)

mdmjsh
la source