web-dev-qa-db-fra.com

Transférez 15 To de petits fichiers

J'archive des données d'un serveur à un autre. Au début, j'ai commencé un travail rsync. Il a fallu 2 semaines pour créer la liste des fichiers juste pour 5 TB de données et une autre semaine pour transférer 1 TB de données).

Ensuite, j'ai dû tuer le travail car nous avons besoin de temps d'arrêt sur le nouveau serveur.

Il a été convenu que nous allons le tarir car nous n'aurons probablement pas besoin d'y accéder à nouveau. Je pensais à le diviser en morceaux de 500 Go. Après l'avoir _ tar, j'allais le copier à travers ssh. J'utilisais tar et pigz mais c'est encore trop lent.

Y a-t-il une meilleure façon de le faire? Je pense que les deux serveurs sont sur Redhat. L'ancien serveur est Ext4 et le nouveau est XFS.

La taille des fichiers varie de quelques ko à quelques mb et il y a 24 millions de jpegs dans 5 To. Je suppose donc environ 60 à 80 millions pour 15 To.

edit: Après avoir joué avec rsync, nc, tar, mbuffer et pigz pendant quelques jours. Le goulot d'étranglement va être le disque IO. Comme les données sont réparties sur 500 SAS et environ 250 millions de jpegs. Cependant, maintenant, je me suis renseigné sur tous ces bons outils que je peux utiliser à l'avenir.

80
lbanz

J'ai eu de très bons résultats en utilisant tar, pigz (gzip parallèle) et nc.

Machine source:

tar -cf - -C /path/of/small/files . | pigz | nc -l 9876

Machine de destination:

Extraire:

nc source_machine_ip 9876 | pigz -d | tar -xf - -C /put/stuff/here

Pour conserver les archives:

nc source_machine_ip 9876 > smallstuff.tar.gz

Si vous voulez voir le taux de transfert, passez simplement par pv après pigz -d!

65
h0tw1r3

Je m'en tiendrai à la solution rsync. Modern (3.0.0+) rsync utilise une liste de fichiers incrémentielle, il n'est donc pas nécessaire de créer la liste complète avant le transfert. Le redémarrer ne vous obligera donc pas à refaire tout le transfert en cas de problème. La division du transfert par répertoire de niveau supérieur ou secondaire optimisera encore plus cela. (J'utiliserais rsync -a -P et ajouter --compress si votre réseau est plus lent que vos lecteurs.)

21
Fox

Mettre en place un VPN (si son internet), créer un lecteur virtuel d'un certain format sur le serveur distant (le rendre ext4), le monter sur le serveur distant, puis montez cela sur le serveur local (en utilisant un protocole de niveau bloc comme iSCSI), et utilisez dd ou un autre outil de niveau bloc pour effectuer le transfert. Vous pouvez ensuite copier les fichiers du lecteur virtuel vers le lecteur réel (XFS) à votre convenance.

Deux raisons:

  1. Pas de surcharge du système de fichiers, qui est le principal responsable des performances
  2. Pas de recherche, vous regardez la lecture/écriture séquentielle des deux côtés
15
Arthur Kay

Si l'ancien serveur est mis hors service et que les fichiers peuvent être hors ligne pendant quelques minutes, il est souvent plus rapide de simplement retirer les lecteurs de l'ancien boîtier et de les câbler au nouveau serveur, de les monter (de nouveau en ligne maintenant) et de copier les fichiers aux nouveaux disques natifs des serveurs.

9
Robin Hammond

Avez-vous pensé à sneakernet? Avec cela, je veux dire tout transférer sur le même lecteur, puis déplacer physiquement ce lecteur.

il y a environ un mois, Samsung a dévoilé un disque 16 TB (techniquement, c'est 15,36 To), qui est également un SSD: http://www.theverge.com/2015/ 8/14/9153083/samsung-worlds-most-hard-drive-16tb

Je pense que ce lecteur ferait à peu près cela. Vous devriez toujours copier tous les fichiers, mais comme vous n'avez pas de latence réseau et que vous pouvez probablement utiliser SATA ou une technique similaire, cela devrait être beaucoup plus rapide.

3
Nzall

Utilisez mbuffer et s'il se trouve sur un réseau sécurisé, vous pouvez éviter l'étape de cryptage.

3
JamesRyan

(De nombreuses réponses différentes peuvent fonctionner. En voici une autre.)

Générez la liste des fichiers avec find -type f (cela devrait se terminer dans quelques heures), divisez-le en petits morceaux et transférez chaque morceau à l'aide de rsync --files-from=....

3
pts

Vous utilisez RedHat Linux, donc cela ne s'appliquerait pas, mais comme autre option:

J'ai eu beaucoup de succès en utilisant ZFS pour conserver des millions de fichiers car les inodes ne sont pas un problème.

Si c'était une option pour vous, vous pourriez alors prendre des instantanés et utiliser zfs pour envoyer des mises à jour incrémentielles. J'ai eu beaucoup de succès en utilisant cette méthode pour transférer et archiver des données.

ZFS est principalement un système de fichiers Solaris, mais peut être trouvé dans les illumos (fork open source d'OpenSolaris de Sun). Je sais qu'il y a également eu de la chance d'utiliser ZFS sous BSD et Linux (en utilisant FUSE?) - mais je n'ai aucune expérience sur ce sujet.

2
sleepyweasel

S'il y a une chance d'obtenir un taux de réussite élevé lors de la déduplication, j'utiliserais quelque chose comme borgbackup ou Attic.

Sinon, vérifiez la solution netcat + tar + pbzip2 , adaptez les options de compression en fonction de votre matériel - vérifiez quel est le goulot d'étranglement (CPU? Réseau? IO? ). Le pbzip2 s'étendrait bien sur tous les processeurs, offrant de meilleures performances.

2
neutrinus

Démarrez un démon rsync sur la machine cible. Cela accélérera beaucoup le processus de transfert.

1
Heiko Wiesner