2009-08-29 8 views
0

Nous avons un groupe de 4 serveurs Web qui contiennent quelques domaines, dont l'un contient un grand nombre de vidéos. Nous avons également un serveur de «mise en scène» auquel nous synchronisons/téléchargeons habituellement des fichiers, puis nous les rsyncons tous via un script bash vers les autres serveurs Web.Téléchargement de fichiers volumineux sur une grappe de serveurs

Le problème que nous avons, c'est qu'un peu de ceci est manuel. Si le week-end l'un des éditeurs de contenu veut remplacer une vidéo/télécharger un nouveau, alors ils doivent attendre jusqu'à lundi et nous constatons qu'ils vont télécharger des fichiers à d'autres endroits, car c'est plus facile, etc

Nous avons besoin d'une solution Les membres du personnel peuvent ainsi télécharger des fichiers volumineux sur le serveur de transfert, puis les synchroniser sur les autres serveurs. Espérons que personne d'autre ne soit impliqué dans le processus.

Vous avez regardé les gestionnaires de fichiers ajax; télécharger via SFTP utiliser le gestionnaire de fichiers pour déplacer les fichiers appuyer sur un bouton de synchronisation super

Répondre

0

Pourquoi ne vous avez pas seulement un processus automatisé de quelque sorte (en utilisant Cron, par exemple) effectuer la synchronisation pour vous?

Vous pouvez faire en sorte qu'un travail cron surveille un répertoire (ou des répertoires) "Dropbox", puis il peut exécuter un script pour effectuer la réplication pour vous.

Vous pouvez demander aux utilisateurs de soumettre le fichier avec des métadonnées afin de mieux acheminer le fichier une fois celui-ci téléchargé. Simplement, ne laissez jamais les utilisateurs "choisir" où ça va, plutôt demandez-leur de vous dire "à quoi ça sert" et ensuite vous avez vos scripts "savoir" où les choses vont et comment les obtenir là.

C'est une application Web assez simple à faire, même avec juste quelques CGI perl ou autre. Et la plomberie arrière est aussi simple.

Répondre commentaire ...

Si vous avez une application web d'effectuer le téléchargement à CGI, vous obtenez généralement ne même pas « contrôle » de la demande jusqu'à ce que le fichier a été entièrement téléchargé. Cela dépend de la technologie côté serveur que vous utilisez. En tout cas, il est facile de "savoir" avec une application web lorsque le fichier est entièrement téléchargé. Votre processus de synchronisation peut alors s'appuyer uniquement sur les métadonnées pour effectuer le travail sur le fichier, et vous ne créez les métadonnées qu'après avoir déplacé le fichier dans la zone de transfert appropriée, etc.

Si vous utilisez simplement FTP ou scp pour copier des fichiers dans des répertoires intermédiaires, alors la solution est de deux avec deux processus. Le premier surveille le répertoire entrant, le second copie réellement les fichiers.

Le premier processus peut simplement ressembler à ceci:

cd /your/upload/dir 
ls -l > /tmp/newfiles 
comm -12 /tmp/lastfiles /tmp/newfiles > /tmp/samefiles 
filelist=`awk '{print $9}' /tmp/samefiles` 
mv $filelist /your/copy/dir 
mv /tmp/newfiles /tmp/lastfiles 

Cela fonctionne comme ceci:

  • Grabs une liste des fichiers en cours dans le répertoire de téléchargement entrant.
  • Utilise comm (1) pour que les fichiers dont le n'a pas été modifié depuis la dernière fois que le processus a été exécuté.
  • Utilise awk (1) pour obtenir les noms de fichier inchangés.
  • Utilise mv (1) pour déplacer les fichiers vers votre répertoire "de stockage" .
  • Enfin, il prend la liste actuelle des fichiers, et le fait la dernière liste pour la prochaine exécution.

La magie ici est comm (1). 'comm -12 filea fileb' vous donne un fichier contenant des lignes identiques entre les deux fichiers. Si un nouveau fichier arrive, alors sa taille changera quand il sera téléchargé, donc quand vous lancerez 'ls -l' la minute suivante, sa ligne ne correspondra pas à la nouvelle ligne - la taille (au minimum) sera différente . Ainsi, comm trouvera seulement les fichiers dont les dates, les noms de fichiers et les tailles n'ont pas changé. Une fois que vous avez cette liste, le reste est assez simple. La seule hypothèse que ce processus fait est simplement que vos noms de fichiers n'ont pas d'espaces dedans (ainsi awk fonctionnera facilement pour obtenir le nom de fichier de la liste). Si vous autorisez des espaces, vous aurez besoin d'un mécanisme un peu plus intelligent pour convertir une ligne 'ls -l' en nom de fichier.

De plus, le 'mv $ filelist/votre/copy/dir' n'occupe aucun espace dans les noms de fichiers, donc il devrait aussi être modifié (vous pouvez le lancer dans le script awk, en le faisant faire un système() appel, peut-être).

Le second processus est aussi simple:

cd /your/copy/dir 
for i in * 
do 
    sync $i 
    mv $i /your/file/youve/copied/dir 
done 

Encore une fois, les "pas d'espaces dans les noms de fichiers hypothèse" ici. Ce processus repose sur un script de shell de synchronisation que vous avez écrit qui fait la bonne chose. C'est laissé comme un exercice pour le lecteur.

Une fois synchronisé, il déplace le fichier vers un autre répertoire. Tous les fichiers qui y apparaissent ont été "synchronisés" correctement. Vous pouvez également simplement supprimer le fichier, mais j'ai tendance à ne pas le faire. Je mettrais ce répertoire peut-être sur le programme "supprimer les fichiers plus d'une semaine". De cette façon, si vous rencontrez un problème, vous avez toujours les fichiers originaux avec lesquels vous pouvez récupérer.

Ce truc est assez simple, mais il est aussi robuste. Tant que le premier processus est "plus lent" que le téléchargement (si vous l'exécutez deux fois de suite, vous êtes assuré que la taille du fichier changera au moins), alors le temps d'exécution peut être de 1 minute, chaque heure, chaque jour, peu importe. Au minimum, il peut être redémarré en toute sécurité et récupéré automatiquement. Le côté obscur du second processus est si votre processus de synchronisation prend plus de temps que votre calendrier cron. Si vous l'exécutez toutes les minutes et que l'exécution prend plus d'une minute, deux processus copient les mêmes fichiers.

Si le processus de synchronisation est "sûr", vous finirez par copier les fichiers deux fois ... une perte, mais généralement inoffensive.

Vous pouvez atténuer cela en utilisant une technique comme this pour vous assurer que votre script de copie ne s'exécute pas plus d'un à la fois.

Voilà la viande. Vous pouvez également utiliser une combinaison (en utilisant une application Web pour télécharger avec les métadonnées et en utilisant le processus de synchronisation exécuté automatiquement via cron).

Vous pouvez également avoir une page Web simple qui répertorie tous les fichiers du répertoire/your/copy/afin que les utilisateurs puissent voir si leurs fichiers ont déjà été synchronisés. Si le fichier se trouve dans ce répertoire, il n'a pas encore terminé la synchronisation.Mettez le contenu dans un répertoire destiné uniquement aux téléchargements.

+0

Ceci est une approche intéressante, le seul problème que je pouvais voir est s'il y a un cron automatique qui s'exécute automatiquement alors il pourrait essayer de synchroniser des fichiers quand ils sont seulement à moitié téléchargés. Aurait besoin d'une sorte de drapeau, peut-être que le fichier de méta-données devrait être téléchargé par la suite les fichiers principaux. Je suppose que le sujet était "Uploading large ...." mais j'aurais probablement besoin de savoir comment gérer la suppression de fichiers. – Wizzard

0

Ensuite, utilisez rsync pour le copier sur différents serveurs. Ne vous inquiétez pas de déplacer les fichiers quelque part plus tard. Rsync utilisera la taille du fichier + l'heure de la modification pour indiquer s'il doit copier un fichier de votre compte "Envoi sécurisé" vers d'autres serveurs.

Votre script serait

#!/bin/bash 

servers="monkey cow turtle" 

for s in $servers 
do 
    rsync -r /path/to/dropbox $s:/place/to/putit 
done 

qui peut être démarré manuellement ou exécuter si Cron. Vous pourriez le faire créer/vérifier un fichier PID afin que seul un de lui-même fonctionnera, kick de synchronisation aux serveurs en parallèle si vous voulez, etc. Si un fichier était "halfway uploadé" la première fois que le script courait, il serait complété la deuxième fois automatiquement.

+0

Merci j'ai quelque chose de très similaire à cet atm. Cependant, le problème est de savoir comment décider où les fichiers dans le téléchargement (dropbox) se retrouvent sur les serveurs. Comme il y a plusieurs sites avec plusieurs dossiers. Je pourrais configurer un tas de valeurs par défaut, (tous les pdfs vont ici, etc) mais il y aura toujours des exceptions – Wizzard

+0

Vous auriez besoin de méta-données supplémentaires (comme dit Will) pour savoir où placer les choses. Ou, une autre possiblilité serait de normaliser vos structures de répertoires utilisées sur chaque système donc il n'y a pas de question. – Shizzmo

Questions connexes