14 votes

Comment nginx et memcached fonctionnent-ils ensemble ?

Nous avons une application web basée sur Java EE et fonctionnant sur une Verre de mer cluster de serveurs d'applications. Le trafic entrant sera principalement constitué de requêtes RESTful pour des représentations basées sur XML de nos ressources applicatives, mais peut-être 5 % du trafic pourrait concerner 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 entre les instances Glassfish du cluster. Nous étudions également comment décharger le cluster en utilisant 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 seraient les représentations XML correspondantes.

Une approche qui semble prometteuse est de faire d'une pierre deux coups et d'utiliser l'application légère et rapide nginx Serveur HTTP/proxy inverse. Nginx traiterait chaque requête entrante en regardant d'abord son URI dans memcached pour voir s'il y a une représentation XML non expirée déjà là. Si ce n'est pas le cas, nginx envoie la requête à l'une des instances Glassfish. Le module memcached de nginx est décrit dans ce bref compte-rendu .

Quelle est votre impression générale avec nginx et memcached utilisés de cette manière, dans quelle mesure êtes-vous satisfaits d'eux ? Quelles ressources vous ont été les plus utiles pour les découvrir ? Si vous les avez essayés et qu'ils n'ont pas répondu à vos besoins, pourquoi et qu'avez-vous utilisé à la place ?

Note : voici un 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 d'expérience directe. この回答 a fini par apparaître sur StackOverflow, et il était assez optimiste sur la configuration nginx/memcached.

0 votes

Cool, je le ferai. Nous allons probablement l'expérimenter dans le mois à venir.

6voto

user11850 Points 326

Vous devriez vraiment utiliser un serveur de cache en amont de vos serveurs web. Je recommande Varnish-cache. Nous l'utilisons au travail avec le site web le plus important et le plus fréquenté de Scandinavie. Nous avons remplacé 13 boîtes Squid très chargées par une boîte Varnish, et une boîte de rechange.

J'ai évalué une application simple sur mon site web privé, et elle est passée de 9 demandes par seconde à plus de 2000.

C'est vous qui décidez de la durée de conservation des données en mémoire. Vous pouvez choisir de les conserver jusqu'à la fin du temps, puis envoyer une demande de purge http au serveur de cache lorsque les données changent.

2 votes

Mais le cache de nginx est clairement plus rapide que Varnish .

4voto

Andrew Hedges Points 11496

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

Je conseillerais de faire en sorte que l'application elle-même effectue la recherche et serve 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 round-robin très basique. Je recommande plutôt haproxy. Si vous avez besoin de services de décryptage SSL en amont, nginx fonctionne bien en amont de haproxy, d'après mon expérience.

1voto

Kristaps Points 2915

Je pense que vous allez vous retrouver dans une impasse si vous avez besoin de fonctions telles que l'équilibrage de charge, la haute disponibilité, etc.

En outre, envisagez la situation suivante : lorsque l'utilisateur est autorisé, la page se présente différemment, avec des fonctionnalités supplémentaires disponibles et individualisées pour chaque utilisateur. Les URL sont les mêmes pour faciliter la création de liens, etc. Par exemple, un site où l'utilisateur autorisé n'a pas besoin d'entrer son nom / captcha pour les commentaires ou un site qui affiche votre nom d'utilisateur en haut, lorsque vous êtes connecté (comme un défaut de serveur). Dans de tels cas, nginx sera inutilisable, car vous ne pourrez pas distinguer les utilisateurs autorisés des autres.

Si vous n'avez pas besoin de SSL, je vous suggère d'utiliser Varnish. Il a été conçu comme accélérateur HTTP, et non comme serveur web ou proxy. Si vous avez besoin de SSL, utilisez nginx comme accélérateur SSL et Varnish comme accélérateur HTTP normal, 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 que vous ne pouvez pas faire de commentaires généralisés à ce sujet sans une analyse approfondie de l'application.

1voto

ctcherry Points 15112

Mon choix se porte sur haproxy. C'est un reverse proxy très petit et très rapide, mais ce 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/

Cela fonctionne parfaitement pour mon système web

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X