41 votes

Meilleure façon de copier des millions de fichiers entre 2 serveurs

J'ai environ 5 millions de petits fichiers (5-30ko) dans un seul répertoire que je voudrais copier vers une autre machine sur le même réseau gigabit. J'ai essayé d'utiliser rsync, mais cela ralentirait à ramper après quelques heures d'exécution, je suppose en raison du fait que rsync doit vérifier le fichier source et la destination à chaque fois?

Ma deuxième pensée serait d'utiliser scp, mais je voulais obtenir un avis extérieur pour voir s'il y avait une meilleure façon. Merci!

44voto

romejoe Points 121

Quelque chose comme ceci devrait bien fonctionner:

tar c some/dir | gzip - | ssh host2 tar xz

Peut-être aussi omettre gzip et le drapeau "z" pour l'extraction, puisque vous êtes sur un réseau gigabit.

19voto

Marc Novakowski Points 191

Je suis sûr que le fait d'avoir les CINQ MILLIONS de fichiers dans un seul répertoire va désorienter de nombreux outils. Je ne suis pas surpris que rsync n'ait pas géré cela de manière élégante - c'est une situation assez "unique". Si vous pouviez trouver un moyen de structurer les fichiers dans une sorte de structure de répertoire, je suis sûr que les outils de synchronisation standard tels que rsync seraient beaucoup plus réactifs.

Cependant, juste pour donner quelques conseils concrets - peut-être qu'une solution serait de déplacer physiquement le disque dans la machine de destination temporairement afin que vous puissiez copier les fichiers dans le serveur réel (pas via le réseau). Ensuite, remettez le disque en place et utilisez rsync pour maintenir les choses à jour.

14voto

vron Points 1

Pour copier des millions de fichiers via un commutateur gigabit (dans un environnement de confiance), vous pouvez également utiliser une combinaison de netcat (ou nc) et tar, comme suggéré par l'utilisateur55286. Cela diffusera tous les fichiers en un seul fichier volumineux (voir Copie de fichiers rapide - Linux! (39 Go)).

# nécessite netcat sur les deux serveurs
nc -l -p 2342 | tar -C /cible/repertoire -xzf -   # boîte de destination
tar -cz /source/repertoire | nc Target_Box 2342    # boîte source

5voto

Dad Points 3898

Nous avions environ 1 million de fichiers dans un répertoire (environ 4 ans de fichiers).

Et nous avons utilisé robocopy pour déplacer les fichiers vers le répertoire YYYY/MM (environ 35-45,000 fichiers par mois).. nous avons mis le script robocopy dans un fichier .bat comme ceci:

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081201 /MINAGE:20090101 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\12
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090101 /MINAGE:20090201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\01
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090201 /MINAGE:20090301 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\02

notes succinctes.. /ns /nc /nfl /np est utilisé pour éviter que le fichier journal ne soit trop volumineux avec des informations supplémentaires /log+... est utilisé pour écrire des informations de synthèse dans le fichier journal.

/minage et /maxage sont utilisés pour copier les fichiers modifiés dans cette plage de dates. 

donc par exemple les fichiers modifiés >= 01/Nov/2008 (inclus) aux fichiers modifiés < 01/Déc/2008 (non inclus)

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11

/mov pour déplacer les fichiers

puis vient le répertoire source

puis vient le répertoire de destination (les répertoires seront créés au fur et à mesure selon les besoins).

Il a fallu environ 40 à 60 minutes pour transférer un mois de fichiers (environ 35-45,000 fichiers) Nous estimons que cela prend environ 12 heures ou moins pour transférer un an de fichiers.

Utilisation de Windows Server 2003.

Toutes les informations sont enregistrées dans le fichier journal... Heure de début, heure de fin et nombre de fichiers copiés.

Robocopy a sauvé la mise.

4voto

Bernard Dy Points 1613

Vous savez, j'ai applaudi la solution tar, mais - en fonction de l'environnement - une autre idée me vient à l'esprit. Vous pourriez envisager d'utiliser dd(1). Le problème de vitesse avec quelque chose comme ça, c'est que cela nécessite de nombreux mouvements de tête pour ouvrir et fermer un fichier, ce que vous ferez cinq millions de fois. Si vous pouviez vous assurer qu'ils sont assignés de manière contigüe, vous pourriez les dd à la place, ce qui réduirait le nombre de mouvements de tête par un facteur de 5 ou plus.

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