Copiez un fichier volumineux d'un serveur Linux à un autre


20

J'essaie de copier un tgz de 75 gigaoctets (instantané mysql lvm) d'un serveur Linux dans notre centre de données LA vers un autre serveur Linux dans notre centre de données NY sur une liaison de 10 Mo.

J'obtiens environ 20-30Kb / s avec rsync ou scp qui oscille entre 200-300 heures.

Pour le moment, c'est un lien relativement silencieux car le deuxième centre de données n'est pas encore actif et j'ai obtenu d'excellentes vitesses de transferts de petits fichiers.

J'ai suivi différents guides de réglage tcp que j'ai trouvés via google en vain (peut-être que je lis les mauvais guides, j'en ai un bon?).

J'ai vu l'astuce du tunnel tar + netcat, mais je crois comprendre que cela n'est bon que pour BEAUCOUP de petits fichiers et ne vous met pas à jour lorsque le transfert du fichier est effectivement terminé.

Avant de recourir à l'expédition d'un disque dur, quelqu'un a-t-il une bonne entrée?

MISE À JOUR: Eh bien ... ce peut être le lien après tout :( Voir mes tests ci-dessous ...

Transferts de NY à LA:

Obtenir un fichier vierge.

[nathan@laobnas test]$ dd if=/dev/zero of=FROM_LA_TEST bs=1k count=4700000
4700000+0 records in
4700000+0 records out
4812800000 bytes (4.8 GB) copied, 29.412 seconds, 164 MB/s
[nathan@laobnas test]$ scp -C obnas:/obbkup/test/FROM_NY_TEST .
FROM_NY_TEST                                    3%  146MB   9.4MB/s   07:52 ETA

Obtention de l'archive tar instantanée.

[nathan@obnas db_backup]$ ls -la db_dump.08120922.tar.gz
-rw-r--r-- 1 root root 30428904033 Aug 12 22:42 db_dump.08120922.tar.gz

[nathan@laobnas test]$ scp -C obnas:/obbkup/db_backup/db_dump.08120922.tar.gz .
db_dump.08120922.tar.gz            0%   56MB 574.3KB/s 14:20:40 ET

Transferts de LA à NY:

Obtenir un fichier vierge.

[nathan@obnas test]$ dd if=/dev/zero of=FROM_NY_TEST bs=1k count=4700000
4700000+0 records in
4700000+0 records out
4812800000 bytes (4.8 GB) copied, 29.2501 seconds, 165 MB/s
[nathan@obnas test]$ scp -C laobnas:/obbkup/test/FROM_LA_TEST .
FROM_LA_TEST                                    0% 6008KB 497.1KB/s 2:37:22 ETA

Obtention de l'archive tar instantanée.

[nathan@laobnas db_backup]$ ls -la db_dump_08120901.tar.gz
-rw-r--r-- 1 root root 31090827509 Aug 12 21:21 db_dump_08120901.tar.gz

[nathan@obnas test]$ scp -C laobnas:/obbkup/db_backup/db_dump_08120901.tar.gz .
db_dump_08120901.tar.gz                0%  324KB  26.8KB/s 314:11:38 ETA

Je suppose que je vais en discuter avec les gens qui gèrent nos installations, le lien est étiqueté comme un lien MPLS / Ethernet 10 Mo. (hausser les épaules)


Juste un commentaire, j'ai récemment reçu une version d'un fournisseur de logiciels sur un Seagate FreeAgent (disque USB) d'environ 50 Go. L'entreprise en question était présente sur le Web et demandait généralement aux clients de télécharger simplement depuis leur site Web. J'ai pensé que c'était une solution intéressante et j'ai pensé que cela pourrait ajouter des informations pour vous aider dans votre décision.
mdpc

Quel genre de latence voyez-vous?
retracile

Environ 80 ms sur le lien.
Nathan Milford

Ouais, maintenant je suis juste confus et frustré. Je l'ai divisé en morceaux de 50 Mo et ça marche toujours lentement! Mais la resynchronisation d'autres données obtient 500kb / s ... il doit y avoir quelque chose de terriblement mal à chaque fois que je manque ...
Nathan Milford

Inspectez votre trafic avec tcpdump. Cela peut vous aider à découvrir ce qui ralentit le transfert.
lexsys

Réponses:


16

Sneakernet Quelqu'un?

En supposant qu'il s'agit d'une copie unique, je ne pense pas qu'il soit possible de simplement copier le fichier sur un CD (ou autre support) et du jour au lendemain vers la destination.

Cela pourrait en fait être votre option la plus rapide car un transfert de fichiers de cette taille, via cette connexion, peut ne pas copier correctement ... dans ce cas, vous pouvez recommencer à zéro.


rsync

Mon deuxième choix / tentative serait rsync car il détecte les transferts en échec, les transferts partiels, etc. et peut reprendre là où il s'était arrêté.

rsync --progress file1 file2 user@remotemachine:/destination/directory

Le drapeau --progress vous donnera des commentaires au lieu de simplement rester là et vous laisser vous remettre en question. :-)


Vuze (bittorrent)

Le troisième choix serait probablement d'essayer d'utiliser Vuze comme serveur torrent, puis de faire en sorte que votre emplacement distant utilise un client bitorrent standard pour le télécharger. Je connais d'autres qui l'ont fait mais vous savez ... au moment où ils ont tout mis en place, etc ... J'aurais pu passer la nuit à les données ...

Cela dépend de votre situation, je suppose.

Bonne chance!


MISE À JOUR:

Vous savez, j'ai réfléchi un peu plus à votre problème. Pourquoi le fichier doit-il être une seule énorme archive tar? Tar est parfaitement capable de diviser des fichiers volumineux en plus petits (pour couvrir les médias par exemple), alors pourquoi ne pas diviser cette énorme archive tar en morceaux plus gérables, puis transférer les morceaux à la place?


3
+1, bien que probablement pas rentable dans ce cas. Ne sous-estimez jamais la bande passante d'un 747 plein de disques durs :)
Chad Huneycutt

2
Je n'ai pas trouvé le lien, mais il y a quelques années, Google envisageait de transporter des caisses de disques. Si vous pouvez déplacer une caisse de disques totalisant 500 To du point A au point B, de toute façon vous le coupez, c'est une bande passante très fine
STW

2
Vous faites peut-être référence à cet article: arstechnica.com/science/news/2007/03/…
KPWINC

1
Ouais, j'ai fini par expédier un disque dur. Le vrai problème, du moins m'a-t-on dit, était le contrôle de flux sur le (s) commutateur (s).
Nathan Milford

Bittorrent ne fonctionne mieux qu'un transfert direct que si vous avez plusieurs semoirs. Même si OP installe bt sur plusieurs machines, il n'a qu'une seule connexion. Et il a déjà déterminé que plusieurs petits fichiers ne vont pas plus vite qu'un gros, ce qui pointe le doigt vers la connexion réseau.
Xalorous

7

Je l'ai fait dans le passé, avec un fichier tbz2 de 60 Go. Je n'ai plus le script mais il devrait être facile de le réécrire.

Tout d'abord, divisez votre fichier en morceaux de ~ 2 Go:

split --bytes=2000000000 your_file.tgz

Pour chaque pièce, calculez un hachage MD5 (c'est pour vérifier l'intégrité) et stockez-le quelque part, puis commencez à copier les pièces et leur md5 sur le site distant avec l'outil de votre choix (moi: netcat-tar-pipe dans un écran session).

Après un certain temps, vérifiez auprès du md5 si vos pièces sont correctes, puis:

cat your_file* > your_remote_file.tgz

Si vous avez également effectué un MD5 du fichier d'origine, vérifiez-le également. Si tout va bien, vous pouvez décompresser votre fichier, tout devrait bien se passer.

(Si je trouve le temps, je réécrirai le script)


5

Normalement, je suis un grand défenseur de rsync, mais lorsque vous transférez un seul fichier pour la première fois, cela ne semble pas avoir beaucoup de sens. Si, cependant, vous retransfertiez le fichier avec de légères différences, rsync serait le vainqueur incontestable. Si vous choisissez d'utiliser rsync de toute façon, je vous recommande vivement d'exécuter une extrémité en --daemonmode pour éliminer le tunnel ssh qui réduit les performances. La page de manuel décrit ce mode de manière assez détaillée.

Ma recommandation? FTP ou HTTP avec des serveurs et des clients qui prennent en charge la reprise des téléchargements interrompus. Les deux protocoles sont rapides et légers, évitant la pénalité ssh-tunnel. Apache + wget crierait vite.

L'astuce de pipe netcat fonctionnerait également bien. Tar n'est pas nécessaire lors du transfert d'un seul gros fichier. Et la raison pour laquelle il ne vous avertit pas quand c'est fait, c'est parce que vous ne le lui avez pas dit. Ajoutez un -q0indicateur côté serveur et il se comportera exactement comme vous vous y attendez.

serveur $ nc -l -p 5000> outfile.tgz

client $ nc -q0 server.example.com 5000 <infile.tgz

L'inconvénient de l'approche Netcat est qu'elle ne vous permettra pas de reprendre si votre transfert meurt 74 Go dans ...


+1 pour rsyncd. Je l'utilise en fait pour les transferts sur mon réseau local car je vois un débit plus élevé que CIFS ou NFS.
Ophidian

1
Alors que FTP et HTTP évitent la "pénalité ssh-tunnel", la "pénalité" pour ne pas crypter les données doit être considérée.
J.Money

3

Donnez un coup de filet à netcat (parfois appelé nc). Ce qui suit fonctionne sur un répertoire, mais il devrait être assez facile de le modifier pour ne copier qu'un seul fichier.

Sur la case de destination:

netcat -l -p 2342 | tar -C /target/dir -xzf -

Sur la boîte source:

tar czf * | netcat target_box 2342

Vous pouvez essayer de supprimer l'option «z» dans les deux commandes tar pour un peu plus de vitesse car le fichier est déjà compressé.


1

SCP et Rsync par défaut (qui utilise SCP) sont très lents pour les gros fichiers. Je suppose que je chercherais à utiliser un protocole avec des frais généraux inférieurs. Avez-vous essayé d'utiliser un chiffrement de chiffrement plus simple, ou pas du tout? Essayez d'examiner l' --rshoption pour rsync de modifier la méthode de transfert.

Pourquoi pas FTP ou HTTP?


1
j'ai fait l'ol '"python -m SimpleHTTPServer" de commandlinefu sur la source et wget'd le fichier sur la destination. Je reçois toujours "18.5K / s eta 15j 3h"
Nathan Milford

1

Bien qu'il ajoute un peu de surcharge à la situation, BitTorrent est en fait une très bonne solution pour transférer des fichiers volumineux. BitTorrent possède de nombreuses fonctionnalités intéressantes, telles que la segmentation native d'un fichier et la somme de contrôle de chaque segment qui peut être retransmis s'il est corrompu.

Un programme comme Azureus [maintenant connu sous le nom de Vuze] contient toutes les pièces dont vous aurez besoin pour créer, serveur et télécharger des torrents dans une seule application. Gardez à l'esprit qu'Azureus n'est pas la plus légère des solutions disponibles pour BitTorrent et je pense qu'elle nécessite également son interface graphique - il existe cependant de nombreux outils torrent pilotés par ligne de commande pour linux.


bt ne va plus vite que le transfert direct s'il y a plusieurs graines. Il a une seule source. Plus important encore, il a un réseau à source unique avec une mauvaise connexion réseau. Même la copie locale du fichier vers plusieurs emplacements, puis la configuration de bt avec plusieurs graines est contre-productive en raison de cette mauvaise connexion. De plus, faire plusieurs copies et les configurer en tant que graines multiplie le temps de copie au lieu de le réduire. BT pourrait être une solution viable si OP tentait de mettre un fichier volumineux à la disposition de plusieurs destinataires.
Xalorous

0

Eh bien, personnellement, 20-30 Ko / s semble assez faible pour une liaison de 10 Mo (en supposant 10 Mo et non 10 Mo).

Si j'étais vous, je ferais l'une des deux choses (en supposant que l'accès physique n'est pas disponible) -

Dans les deux cas, je vous conseille de diviser le gros fichier en plus petits morceaux, environ 500 Mo. Juste en cas de corruption en transit.

Lorsque vous avez les plus petits morceaux, utilisez à nouveau rsync, ou je préfère personnellement utiliser une session ftp sécurisée privée, puis CRC les fichiers à la fin.


0

Quelques questions pourraient aider dans les discussions: à quel point les données à transférer sont-elles critiques? Est-ce pour la récupération après sinistre, la sauvegarde à chaud, le stockage hors ligne ou quoi? Avez-vous l'intention de sauvegarder la base de données lorsqu'elle est en marche ou en panne? Qu'en est-il de la mise en place d'une base de données sur le système distant et de les maintenir synchronisées à l'aide de la mise en cluster ou de la mise à jour via les journaux des modifications (je ne connais pas totalement les capacités d'un système de base de données MySql). Cela pourrait aider à réduire la quantité de données devant être transférées via le lien.


Il s'agit d'un instantané LVM d'une autre réplique MYSQL (de notre instance MYSQL principale ailleurs). Une fois transférée et située, l'instance mysql de destination peut simplement mettre à jour la différence entre cet instantané (l'utiliser comme delta) et où se trouve le maître maintenant. Que ce soit une sauvegarde MYSQL n'est pas pertinent, c'est juste un gros morceau de données que je n'ai besoin de déplacer qu'une seule fois.
Nathan Milford

0

bbcp va fragmenter le fichier pour vous et le copier avec plusieurs flux.


0

Réponse tardive pour les googleurs:

Lors du transfert de grands ensembles de données, rsync peut être utilisé pour comparer la source et la destination, puis écrire un fichier de commandes sur un support amovible local à l'aide de l'indicateur --only-write-batch. Vous expédiez ensuite le média local à l'emplacement distant, le branchez et exécutez à nouveau rsync, en utilisant --read-batch pour incorporer les modifications dans l'ensemble de données distant.

Si les fichiers source changent pendant le transport physique, ou si le support de transport se remplit, vous pouvez simplement continuer à répéter --only-write-batch | navire | - cycle de lecture-batch jusqu'à ce que la destination soit entièrement rattrapée.

(Réf: j'étais l'un des auteurs de cette fonctionnalité dans rsync - pour plus de contexte et de cas d'utilisation, voir cette discussion sur la mise en œuvre du prototype: https://lists.samba.org/archive/rsync/2005-March/011964 .html )

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.