53 votes

Comment déplacer des fichiers entre deux buckets S3 avec un coût minimum ?

J'ai des millions de fichiers dans un bac Amazon S3 et j'aimerais déplacer ces fichiers vers d'autres bacs et dossiers avec un coût minimum ou sans coût si possible. Tous les buckets sont dans la même zone.

Comment pourrais-je le faire ?

57voto

cyberx86 Points 20450

Des millions, c'est un chiffre important - j'y reviendrai plus tard.

Quelle que soit votre approche, le mécanisme sous-jacent doit consister à copier directement d'une base de données à une autre - de cette manière (puisque vos bases de données se trouvent dans la même région), vous ne payez pas de frais pour la bande passante. Toute autre approche est tout simplement inefficace (par exemple, le téléchargement et le rechargement des fichiers).

La copie entre godets est réalisée en utilisant "PUT copy" - c'est-à-dire une requête PUT qui inclut l'en-tête "x-amz-copy-source" - je crois qu'il s'agit d'une requête COPY. Cela copiera le fichier et, par défaut, les métadonnées associées. Vous devez inclure un en-tête "x-amz-acl" avec la bonne valeur si vous voulez définir l'ACL en même temps (sinon, elle sera définie par défaut comme privée). Vous serez facturé pour vos demandes de COPIE (0,01 $/1 000 demandes). Vous pouvez supprimer les fichiers inutiles après qu'ils ont été copiés (les demandes DELETE ne sont pas facturées). (Un point sur lequel je ne suis pas très clair est de savoir si une requête COPY entraîne également les frais d'une requête GET, puisque l'objet doit d'abord être récupéré dans le panier source - si c'est le cas, les frais seront de 0,01 $/10 000 requêtes supplémentaires).

Les frais susmentionnés sont apparemment inévitables - pour un million d'objets, il faut compter environ 10 $ (ou 11 $). Étant donné qu'en fin de compte vous devez créer les fichiers sur le panier de destination, les autres approches (par exemple, tar-gzipping des fichiers, Amazon Import/Export, etc) ne permettent pas de contourner ce coût. Néanmoins, il peut être intéressant de contacter Amazon si vous avez plus de quelques millions d'objets à transférer.

Compte tenu de ce qui précède (prix inévitable), la prochaine chose à prendre en considération est le temps, qui sera un facteur important lors de la copie de "millions de fichiers". Tous les outils capables d'effectuer une copie directe entre des godets seront facturés au même prix. Malheureusement, vous avez besoin d'une demande par fichier (pour copier), d'une demande pour supprimer, et éventuellement d'une demande pour lire les données ACL (si vos fichiers ont des ACL variées). La meilleure vitesse est celle qui permet d'exécuter le plus grand nombre d'opérations en parallèle.

Il existe des approches en ligne de commande qui pourraient être tout à fait viables :

  • s3cmd-modification (cette pull request spécifique) inclut les commandes parallèles cp et mv et devrait être une bonne option pour vous.
  • La console AWS peut effectuer la copie directement - je ne peux pas dire à quel point c'est parallèle.
  • L'aws de Tim Kay script peut effectuer la copie - mais il n'est pas parallèle - vous devrez script pour exécuter la copie complète que vous souhaitez (ce n'est probablement pas la meilleure option dans ce cas - bien qu'il s'agisse d'un excellent script).
  • CloudBerry S3 Explorer , Explorateur de seaux et CloudBuddy devraient tous être en mesure d'effectuer la tâche, bien que je ne sache pas quelle est l'efficacité de chacun d'entre eux. Je crois cependant que les fonctions multithread de la plupart d'entre eux nécessitent l'achat du logiciel.
  • scriptvotre propre script en utilisant l'un des SDK disponibles.

Il est possible que s3fs fonctionne - il est assez parallèle, prend en charge les copies entre les mêmes godets - ne prend PAS en charge les copies entre les différents godets, mais il est possible que s3fs ne prenne pas en charge les copies entre les différents godets. pourrait se déplace d'un godet à l'autre.

Je commencerais avec s3cmd-modification et verrais si vous avez du succès avec ou contacter Amazon pour une meilleure solution.

14voto

audnffs Points 31

Vieux sujet, mais ceci s'adresse à tous ceux qui enquêtent sur le même scénario. Avec le temps que cela m'a pris, pour plus de 20 000 objets. Fonctionnant sur AWS Linux/Centos, chaque objet étant pour la plupart des images, ainsi que quelques vidéos et divers fichiers multimédias.

Utilisation des outils AWS CLI pour copier les fichiers du Bucket A vers le Bucket B.

A. Créer le nouveau seau

$ aws s3 mb s3://new-bucket-name

B. Synchroniser l'ancien seau avec le nouveau seau

$ aws s3 sync s3://old-bucket-name s3://new-bucket-name

Copier plus de 20 000 objets...

Démarrage 17:03

Terminé 17:06

Temps total pour 20 000+ objets = environ 3 minutes

Une fois que le nouveau seau est correctement configuré, c'est-à-dire les autorisations, la politique, etc. et que vous souhaitez supprimer l'ancien seau.

C. Retirer/supprimer l'ancien seau

$ aws s3 rb --force s3://old-bucket-name

6voto

prubini87 Points 423

L'interface de commande AWS permet de copier un bac vers un autre en parallèle. Tiré de https://stackoverflow.com/a/40270349/371699 :

Les commandes suivantes indiquent à l'interface de programmation AWS d'utiliser 1 000 threads pour exécuter des tâches (chacune étant un petit fichier ou une partie d'une copie en plusieurs parties) et d'anticiper 100 000 tâches :

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

Après les avoir exécutés, vous pouvez utiliser la commande de synchronisation simple comme suit :

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

Sur une machine m4.xlarge (dans AWS - 4 cœurs, 16 Go de RAM), dans mon cas (3-50 Go de fichiers), la vitesse de synchronisation/copie est passée d'environ 9,5 Mo/s à 700+ Mo/s, soit une augmentation de la vitesse de 70x par rapport à la configuration par défaut.

5voto

Zuryn Points 1

Je ne suis pas sûr que ce soit la meilleure approche, mais la console de gestion AWS dispose d'une fonction couper/copier/coller, très facile à utiliser et efficace.

3voto

Faruz Points 3081

J'imagine que vous avez déjà trouvé une bonne solution, mais pour ceux qui rencontrent ce problème (comme je l'ai fait récemment), j'ai conçu un utilitaire simple qui permet de mettre en miroir un bucket S3 vers un autre de manière hautement concurrentielle, tout en étant efficace en termes de CPU et de mémoire.

Il est disponible sur github sous licence Apache ici : https://github.com/cobbzilla/s3s3mirror

Si vous décidez de l'essayer, n'hésitez pas à me faire part de vos commentaires.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X