Quão bem o nginx e o memcached trabalham juntos?

14

Temos um aplicativo da Web baseado em Java EE em execução em um cluster de servidor de aplicativos Glassfish . O tráfego de entrada será principalmente solicitações RESTful para representações baseadas em XML de nossos recursos de aplicativo, mas talvez 5% do tráfego possa ser para representações baseadas em JSON ou XHTML / CSS.

Agora estamos investigando soluções de balanceamento de carga para distribuir o tráfego de entrada nas instâncias Glassfish no cluster. Também estamos investigando como descarregar o cluster usando o memcached, um mapa de hash distribuído na memória cujas chaves seriam os nomes de recursos REST (por exemplo, "/ user / bob", "/ group / jazzlovers") e cujos valores são as representações XML correspondentes.

Uma abordagem que parece promissora é matar os dois pássaros com uma cajadada e usar o servidor / reverso leve e rápido nginx proxy. O Nginx lidaria com cada requisição de entrada procurando primeiro seu URI no memcached para ver se já existe uma representação XML não expirada. Se não, o nginx envia a solicitação para uma das instâncias Glassfish. O módulo memcached do nginx é descrito em este breve resumo .

Qual é a sua impressão geral com o nginx e o memcached usados dessa maneira, como você está feliz com eles? Quais recursos você achou mais úteis para aprender sobre eles? Se você os experimentou e eles não se adequaram aos seus propósitos, por que não e o que você usou?

Observação: esta é uma pergunta relacionada . Antes que eu soubesse sobre ServerFault eu perguntei isso em StackOverflow .

Edit: Todas as respostas até aqui foram bastante úteis, embora não houvesse experiência direta. Esta resposta acabou aparecendo no StackOverflow, e foi bastante otimista na configuração do nginx / memcached.

    
por Jim Ferrans 01.07.2009 / 20:18

4 respostas

6

Você realmente deve usar um servidor de cache na frente de seus servidores da web. Eu recomendo o Varnish-cache. Nós o usamos no trabalho com o maior e mais movimentado site da escandinávia. Nós substituímos 13 caixas de Lulas altamente carregadas por 1 caixa de verniz e 1 de reposição.

Eu testei um aplicativo simples no meu site particular e passou de 9 solicitações por segundo para mais de 2.000.

Você decide por quanto tempo isso mantém as coisas na memória, você pode fazer até o final dos tempos e depois enviar uma solicitação de limpeza http para o servidor de cache quando os dados forem alterados.

    
por 07.07.2009 / 14:00
3

Minha opinião pessoal, por experiência, é que, se você estiver usando um balanceador de carga, deseja limitar essa caixa inteiramente às funções de balanceamento de carga. Ter seu balanceador de carga fornecendo conteúdo, mesmo de um cache, degrada a funcionalidade de balanceamento de carga em situações de alta carga (mais conexões permanecem ativas por mais tempo, reduzindo a capacidade geral e a taxa de transferência).

Eu aconselho que o aplicativo faça a pesquisa e forneça o conteúdo em cache e deixe o balanceador de carga fazer o trabalho. Dito isso, o nginx não é perfeito quando se trata de balanceamento de carga - ele oferece apenas um algoritmo round-robin muito básico. Eu recomendaria haproxy em vez disso. Se você precisar de serviços de descriptografia SSL na frente, o nginx funciona bem na frente do haproxy, na minha experiência.

    
por 05.07.2009 / 21:44
1

Eu acho que você irá para becos sem saída caso precise de coisas como balanceamento de carga, alta disponibilidade e etc.

Além disso, considere essa situação: quando a página do usuário é autorizada é diferente, com recursos adicionais disponíveis e individualizados para cada usuário. Os URLs são os mesmos para conveniência de links e etc. Por exemplo, site onde o usuário autenticado não precisa digitar seu nome / captcha para comentários ou o site exibe seu nome de usuário no topo, quando você está logado (como serverfault). Nesses casos, o nginx ficará inutilizável, porque você não pode distinguir o usuário autenticado de não autenticado.

Se você não precisa de SSL, eu sugiro que você execute o Varnish. Ele foi projetado como Acelerador HTTP, não como servidor web ou proxy. Se você precisar de SSL, execute o nginx no topo como acelerador SSL e verniz como acelerador HTTP simples, porque o Varnish não pode lidar com SSL.

Acho que a escolha do servidor de armazenamento em cache é específica do aplicativo e você não pode fazer comentários generalizados sobre isso sem uma análise detalhada do aplicativo.

    
por 05.07.2009 / 21:17
1

minha escolha é haproxy. Muito pequeno e muito rápido proxy reverso, mas não é proxy de cache! Eu uso para o meu sistema de cache "Squid Web Proxy"

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

Este trabalho é perfeito para o meu sistema web

    
por 05.07.2009 / 21:28