J'ai un compartiment S3 avec environ 4 millions de fichiers prenant environ 500 Go au total. J'ai besoin de synchroniser les fichiers vers un nouveau compartiment (en fait, changer le nom du compartiment suffirait, mais comme ce n'est pas possible, je dois créer un nouveau compartiment, y déplacer les fichiers et supprimer l'ancien).
J'utilise la commande s3 sync
D'AWS CLI et elle fait le travail, mais prend beaucoup de temps. Je voudrais réduire le temps pour que le temps d'arrêt du système dépendant soit minime.
J'essayais d'exécuter la synchronisation à partir de ma machine locale et de l'instance EC2 c4.xlarge
Et il n'y a pas beaucoup de différence de temps.
J'ai remarqué que le temps nécessaire peut être quelque peu réduit lorsque je divise le travail en plusieurs lots à l'aide des options --exclude
Et --include
Et les exécute en parallèle à partir de fenêtres de terminal distinctes, c'est-à-dire.
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "1?/*"
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "2?/*"
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "3?/*"
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "4?/*"
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "1?/*" --exclude "2?/*" --exclude "3?/*" --exclude "4?/*"
Puis-je faire autre chose pour accélérer encore plus la synchronisation? Un autre type d'instance EC2
Convient-il mieux à la tâche? Le fractionnement du travail en plusieurs lots est-il une bonne idée et existe-t-il quelque chose comme un nombre "optimal" de processus sync
pouvant s'exécuter en parallèle sur le même compartiment?
Mise à jour
Je penche vers la stratégie de synchronisation des compartiments avant de supprimer le système, de faire la migration, puis de synchroniser à nouveau les compartiments pour copier uniquement le petit nombre de fichiers qui ont changé entre-temps. Cependant, l'exécution de la même commande sync
même sur des compartiments sans aucune différence prend beaucoup de temps.
Vous pouvez utiliser EMR et S3-distcp. J'ai dû synchroniser 153 TB entre deux compartiments et cela a pris environ 9 jours. Assurez-vous également que les compartiments sont dans la même région, car vous obtenez également des coûts de transfert de données.
aws emr add-steps --cluster-id <value> --steps Name="Command Runner",Jar="command-runner.jar",[{"Args":["s3-dist-cp","--s3Endpoint","s3.amazonaws.com","--src","s3://BUCKETNAME","--dest","s3://BUCKETNAME"]}]
http://docs.aws.Amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html
http://docs.aws.Amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-commandrunner.html
En variante de ce que OP fait déjà ..
On pourrait créer une liste de tous les fichiers à synchroniser, avec aws s3 sync --dryrun
aws s3 sync s3://source-bucket s3://destination-bucket --dryrun
# or even
aws s3 ls s3://source-bucket --recursive
En utilisant la liste des objets à synchroniser, divisez le travail en plusieurs aws s3 cp ...
commandes. De cette façon, "aws cli" ne sera pas simplement suspendu, tout en obtenant une liste de candidats à la synchronisation, comme c'est le cas lorsque l'on démarre plusieurs tâches de synchronisation avec --exclude "*" --include "1?/*"
arguments de type.
Lorsque tous les travaux de "copie" sont terminés, une autre synchronisation peut valoir la peine, pour faire bonne mesure, peut-être avec --delete
, si l'objet peut être supprimé du compartiment "source".
Dans le cas de compartiments "source" et "destination" situés dans différentes régions, il est possible d'activer la réplication des compartiments cross-region , avant de commencer à synchroniser les compartiments.
Contexte: les goulots d'étranglement de la commande de synchronisation répertorient les objets et copient les objets. La liste des objets est normalement une opération en série, bien que si vous spécifiez un préfixe, vous pouvez lister un sous-ensemble d'objets. C'est la seule astuce pour la paralléliser. La copie d'objets peut se faire en parallèle.
Malheureusement, aws s3 sync
ne fait aucune parallélisation et ne prend même pas en charge la liste par préfixe, sauf si le préfixe se termine par /
(c'est-à-dire qu'il peut lister par dossier). C'est pourquoi c'est si lent.
s3s3mirror (et de nombreux outils similaires) parallélise la copie. Je ne pense pas qu'il (ou tout autre outil) parallélise la liste des objets car cela nécessite une connaissance a priori de la façon dont les objets sont nommés. Cependant, il prend en charge les préfixes et vous pouvez l'invoquer plusieurs fois pour chaque lettre de l'alphabet (ou ce qui est approprié).
Vous pouvez également créer le vôtre à l'aide de l'API AWS.
Enfin, le aws s3 sync
la commande elle-même (et tout autre outil d'ailleurs) devrait être un peu plus rapide si vous la lancez dans une instance dans la même région que votre compartiment S3.
40100 objets 160 Go ont été copiés/synchronisés en moins de 90 secondes
suivez les étapes ci-dessous:
step1- select the source folder
step2- under the properties of the source folder choose advance setting
step3- enable transfer acceleration and get the endpoint
Configurations AWS une seule fois (pas besoin de répéter cela à chaque fois)
aws configure set default.region us-east-1 #set it to your default region
aws configure set default.s3.max_concurrent_requests 2000
aws configure set default.s3.use_accelerate_endpoint true
options: -
--delete: cette option supprimera le fichier à destination s'il n'est pas présent dans la source
Commande AWS à synchroniser
aws s3 sync s3://source-test-1992/foldertobesynced/ s3://destination-test-1992/foldertobesynced/ --delete --endpoint-url http://soucre-test-1992.s3-accelerate.amazonaws.com
coût d'accélération du transfert
https://aws.Amazon.com/s3/pricing/#S3_Transfer_Acceleration_pricing
ils n'ont pas mentionné de prix si les compartiments sont dans la même région