Nous utilisons FreeBSD (système de fichiers UFS), pas Linux, donc certains détails peuvent être différents.
Contexte
Nous avons plusieurs millions de fichiers sur ce système qui doivent être servis le plus rapidement possible à partir d'un site Web, pour un accès individuel. Le système que nous utilisons a très bien fonctionné au cours des 16 dernières années.
Le serveur 1 (nommé : Tom) a le site Web utilisateur principal avec une configuration Apache assez standard et une base de données MySQL. Rien de spécial du tout.
Le serveur 2 (nommé : Jerry) est l'endroit où les fichiers utilisateur sont stockés et a été personnalisé pour une livraison rapide de ces petits fichiers.
Le disque dur de Jerry est optimisé lors de sa création pour s'assurer que nous ne manquons pas d'inodes - quelque chose à prendre en compte lorsque vous créez des millions de petits fichiers.
La configuration Apache de Jerry est ajustée pour des temps de connexion très courts et un accès à un seul fichier par connexion. Sans ces ajustements, vous aurez des connexions ouvertes qui gaspillent des ressources. Cette configuration Apache ne conviendrait pas du tout au système principal (Tom) et causerait plusieurs problèmes.
Comme vous servez des "miniatures", et non des demandes individuelles, vous pourriez avoir besoin d'une structure légèrement différente. Pour être honnête, je ne connais pas suffisamment vos besoins pour conseiller vraiment ce qui serait le mieux pour la configuration de votre serveur Web.
Historiquement, nous avons utilisé plusieurs disques SCSI à travers plusieurs serveurs. Pour le moment, nous avons un seul serveur avec des disques de 300 Mo/s. L'entreprise est en déclin depuis un certain temps (grâce à Facebook), mais nous traitons encore plus de 2 millions de demandes de fichiers par jour. À notre apogée, c'était plus de 10 millions par jour.
Notre structure (une réponse possible)
Tout sur Jerry est optimisé pour la livraison des petits fichiers et rien d'autre.
Jerry est un serveur Web, mais nous le traitons plus comme une base de données. Tout ce qui n'est pas nécessaire est supprimé.
Chaque fichier reçoit un identifiant de 4 caractères. L'ID est alphanumérique (0-9, a-z, A-Z). Cela vous donne 61*61*61*61 combinaisons (ou 13,845,841 ID).
Nous avons également plusieurs domaines, donc chaque domaine a un maximum de 13,845,841 ID. Nous étions très proches de cette limite sur les "domaines" populaires avant que Facebook n'arrive, et nous avions des plans prêts à être mis en œuvre qui permettraient des identifiants de 5 caractères, mais cela n'a pas été nécessaire à la fin.
Les recherches dans le système de fichiers sont très rapides si vous connaissez le chemin complet du fichier. C'est seulement lent si vous avez besoin de scanner pour des correspondances de fichiers. Nous en avons pleinement profité.
Chaque ID de 4 caractères est une série de répertoires. par exemple, aBc9
est /chemin/vers/a/B/c/9
.
C'est un très grand nombre d'identifiants uniques à travers seulement 4 répertoires. Chaque répertoire a un maximum de 61 sous-répertoires. Créer des recherches rapides sans saturer l'index du système de fichiers.
Localisé dans le répertoire ./9
(le dernier répertoire dans l'ID) se trouvent les fichiers de métadonnées nécessaires et le fichier de données brut. Le nom du fichier de métadonnées est connu, tout comme le fichier de données. Nous avons également d'autres fichiers connus dans chaque dossier, mais vous avez compris l'idée.
Si un utilisateur met à jour ou vérifie les métadonnées, l'ID est connu, donc une demande des métadonnées est renvoyée.
Si le fichier de données est demandé, encore une fois, l'ID est connu, donc les données sont renvoyées. Aucun balayage ou vérification complexe n'est effectué.
Si l'ID est invalide, un résultat invalide est renvoyé.
Rien de complexe, tout pour la vitesse.
Nos problèmes
Lorsque vous parlez de millions de petits fichiers, il est possible de manquer d'inodes. Assurez-vous de prendre cela en compte lors de la création du disque pour le serveur dès le départ. Prévoyez à l'avance.
Nous avons désactivé et/ou modifié un certain nombre de vérifications système FreeBSD. Les tâches de maintenance cron ne sont pas conçues pour les systèmes avec autant de fichiers.
La configuration Apache a été un peu une affaire d'essais et d'erreurs pour la rendre parfaite. Mais une fois que vous y arrivez, le soulagement est énorme. Le mod_status
d'Apache est très utile.
La toute première chose à faire est de désactiver tous les fichiers journaux d'Apache. Ensuite, désactivez tout et ne réactivez que ce dont vous avez besoin.
Le code pour la livraison (et l'enregistrement) des métadonnées et des données brutes est également très optimisé. Oubliez les bibliothèques de code. Chaque ligne de code a été vérifiée et revérifiée au fil des ans pour la vitesse.
Conclusion
Si vous avez vraiment beaucoup de miniatures, divisez le système. Servez les petits fichiers à partir d'un serveur dédié optimisé à cette fin. Gardez le système principal optimisé pour un usage plus standard.
Un système d'ID basé sur les répertoires (qu'ils soient de 4 caractères aléatoires ou des parties d'un MD5) peut être rapide tant que vous n'avez pas besoin de rechercher des fichiers.
Votre système d'exploitation de base devra être ajusté pour que les vérifications système ne consomment pas vos ressources système.
Désactivez la création de fichiers journaux du serveur Web. Vous n'aurez presque jamais besoin de cela et cela créera un goulot d'étranglement sur le système de fichiers. Si vous avez besoin de statistiques, vous pouvez obtenir un aperçu général à partir de mod_status
.
Pour être très honnête, on ne sait pas vraiment assez d'informations sur votre cas individuel et vos besoins. Je doute de la pertinence de mon expérience personnelle.
Bonne chance !
0 votes
Il n'est pas clair pour moi quel problème vous essayez de résoudre, ou même si c'est vraiment un problème. Vous voulez optimiser "l'efficacité", mais que voulez-vous dire ? Moins d'espace gaspillé sur le disque ? Temps de recherche le plus rapide? Avez-vous besoin de la correspondance inverse où vous avez le nom de la vignette mais souhaitez l'image en haute résolution, ou simplement du cas où vous avez l'image en haute résolution et voulez la vignette. Combien d'images avez-vous? Que se passe-t-il si vous renommez un répertoire d'images haute résolution ?
0 votes
Quelle est la taille des images haute résolution ? Quelle est la taille des miniatures ? Les images haute résolution sont-elles au format JPEG ? Avez-vous envisagé de stocker les miniatures à l'intérieur des images haute résolution ? Le temps de démarrage est-il important ? Votre application est-elle distribuée - vous pourriez charger les miniatures dans Redis peut-être.