Dans quelle mesure nginx et memcached fonctionnent-ils ensemble?

14

Nous avons une application Web basée sur Java EE fonctionnant sur un cluster de serveurs d'applications Glassfish . Le trafic entrant sera principalement des demandes RESTful pour des représentations basées sur XML de nos ressources d'application, mais peut-être 5% du trafic pourrait être pour des représentations basées sur JSON ou XHTML / CSS.

Nous étudions actuellement des solutions d'équilibrage de charge pour répartir le trafic entrant sur les instances Glassfish du cluster. Nous examinons également comment décharger le cluster à l'aide de memcached, une carte de hachage distribuée en mémoire dont les clés seraient les noms des ressources REST (par exemple, "/ user / bob", "/ group / jazzlovers") et dont les valeurs sont les représentations XML correspondantes.

Une approche qui semble prometteuse est de tuer les deux oiseaux avec une pierre et d'utiliser le serveur HTTP / proxy inverse nginx rapide et léger . Nginx traiterait chaque demande entrante en recherchant d'abord son URI dans memcached pour voir s'il y a déjà une représentation XML non expirée. Sinon, nginx envoie la demande à l'une des instances Glassfish. Le module nginx memcached est décrit dans ce bref article .

Quelle est votre impression générale avec nginx et memcached utilisés de cette façon, êtes-vous satisfait d'eux? Quelles ressources avez-vous trouvées les plus utiles pour en savoir plus? Si vous les avez essayés et qu'ils ne vous convenaient pas, pourquoi pas, et qu'avez-vous utilisé à la place?

Remarque: voici une question connexe . Avant de connaître ServerFault, j'ai posé cette question sur StackOverflow .

Edit: Toutes les réponses ici jusqu'à présent ont été très utiles, bien qu'il n'y ait pas eu d'expérience directe. Cette réponse s'est finalement révélée sur StackOverflow, et elle était assez haussière sur la configuration nginx / memcached.

Jim Ferrans
la source
Cool, fera l'affaire. Nous allons probablement l'expérimenter dans le mois prochain
Jim Ferrans

Réponses:

6

Vous devez vraiment utiliser un serveur de cache devant vos serveurs Web. Je recommande Varnish-cache. Nous l'utilisons au travail avec le site Web le plus grand et le plus fréquenté de Scandinavie. Nous avons remplacé 13 boîtes Squid très chargées par 1 boîte de vernis et 1 de rechange.

J'ai comparé une application simple sur mon site Web privé, et elle est passée de 9 requêtes par seconde à plus de 2000.

Vous décidez combien de temps il garde les choses en mémoire, vous pouvez faire jusqu'à la fin des temps, puis simplement envoyer une demande de purge http au serveur de cache lorsque les données changent.

Trausti Thor
la source
1
Mais le cache nginx est clairement plus rapide que Varnish .
VBart
4

Mon expérience personnelle, par expérience, est que si vous utilisez un équilibreur de charge, vous voulez limiter entièrement cette boîte aux fonctions d'équilibrage de charge. Le fait que votre équilibreur de charge serve le contenu, même à partir d'un cache, dégrade la fonctionnalité d'équilibrage de charge dans des situations de charge élevée (plus de connexions restent actives plus longtemps, ce qui réduit la capacité globale et le débit).

Je conseillerais à l'application de faire la recherche, de diffuser le contenu mis en cache et de laisser l'équilibreur de charge faire son travail. Cela dit, nginx n'est pas parfait en matière d'équilibrage de charge - il ne propose qu'un algorithme de tourniquet très basique. Je recommanderais plutôt haproxy. Si vous avez besoin de services de décryptage SSL à l'avant, nginx fonctionne bien assis devant haproxy, selon mon expérience.

Chris
la source
1

Je pense que vous irez dans l'impasse au cas où vous auriez besoin de choses comme l'équilibrage de charge, la haute disponibilité, etc.

Considérez également une telle situation: lorsque l'utilisateur est authentifié, la page est différente, avec des fonctionnalités supplémentaires disponibles et personnalisées pour chaque utilisateur. Les URL sont les mêmes pour la commodité des liens, etc. Dans de tels cas, nginx sera inutilisable, car vous ne pouvez pas distinguer un utilisateur authentifié d'un utilisateur non authentifié.

Si vous n'avez pas besoin de SSL, je vous suggère d'exécuter Varnish. Il a été conçu comme HTTP Accelerator, pas comme serveur Web ou proxy. Si vous avez besoin de SSL, exécutez nginx sur le dessus comme accélérateur SSL et vernissez comme accélérateur HTTP ordinaire, car Varnish ne peut pas gérer SSL.

Je pense que le choix du serveur de mise en cache est spécifique à l'application et vous ne pouvez pas faire de commentaires généralisés à ce sujet sans une analyse approfondie de l'application.

Kristaps
la source
1

mon choix est haproxy. Proxy inversé très petit et très rapide, mais n'est pas un proxy cache! J'utilise pour mon système de cache "Squid Web Proxy"

CACHE /squid/ -> Load-balancing /Haproxy/ -> WEB I /lighttpd/
                                          -> WEB II /lighttpd/
                                          -> WEB III /lighttpd/

Ce travail parfait pour mon système web

Yordan
la source