Memcache - Problemas em um ambiente distribuído com muitos nós

2

Eu dei uma rápida olhada nas outras perguntas com título semelhante e nenhuma é particularmente semelhante às questões que estou tendo atualmente.

Basicamente, tivemos um anel memcached de vários nós em funcionamento por mais de dois anos e, na maioria dos casos, ele está livre de problemas. A instalação do memcache foi movida recentemente para servidores dedicados e a capacidade foi triplicada (2x 1GB para 2x3GB). No começo, tivemos problemas com o que eu acredito ser problemas com o modo como as bibliotecas php estavam conversando com os servidores, ou com a ordenação da lista de servidores, ou com o fato de eles serem iniciados incorretamente.

Os servidores 'pareciam' estar funcionando corretamente, mas as chaves pareciam estar sendo armazenadas em vários servidores e uma expiração não expira todas as instâncias do valor.

Basicamente, mudamos o mecanismo de hashing de padrão para consistente e os problemas com pesquisas de chave (e expira / obtém) e tudo parece ter voltado ao normal.

No entanto, tenho monitorado coisas nas últimas semanas e percebi que o primeiro servidor parece estar sendo acertado muitas vezes mais do que o segundo (a ferramenta de monitoramento de memcache do PHP informa uma média de 1.200 acessos um segundo, enquanto o segundo é apenas a 500 ).

Alguém pode explicar:

  • Em primeiro lugar, qualquer ideia do que está acontecendo acima, por que um servidor estaria obtendo muitos mais hits em um ambiente 'distribuído'
  • Em segundo lugar, quais são as configurações recomendadas para clientes memcache em uma situação distribuída
    • Estou fazendo a coisa certa usando hash consistente
    • Devo usar o failover ?;
    • armazenamento binário?;
    • ou compactação?
  • Qual é o procedimento correto para redefinir / mover um toque de memcache ao vivo

Eu achei o memcached como uma ferramenta fantástica, perfeita para seu propósito, mas os guias de melhores práticas e a documentação útil (poucos descrevem em detalhes) são poucos e distantes entre si. Se eu puder ter alguma ideia do que está acontecendo, eu definitivamente vou postá-lo como um artigo técnico para todos verem (para ajudar no futuro), mas estou tendo problemas agora!

Obrigado antecipadamente

    
por kwiksand 21.06.2011 / 21:54

2 respostas

0

Se suas chaves tiverem padrões de acesso desiguais, você verá um tráfego desigual para cada nó do memcached. por exemplo. Se você tiver 2 chaves, uma das quais a é obtida / definida 500 vezes por segundo e uma b , que é obtida / definida 250 vezes por segundo, o nó que contém a terá o dobro do tráfego nó que contém b .

No meu caso, nós tivemos 8 nós memcached com alguns milhares de chaves. Uma dessas chaves estava fazendo cerca de 800 pontos / seg no pico de tráfego e quase todas as outras chaves estava fazendo menos de 1 get / sec. O nó memcached que tinha a chave ocupada exibia um tráfego significativamente maior que os outros.

Se você quiser equilibrar o tráfego igualmente para cada um dos seus nós memcached, então você precisa:

  • Jogue com a sua codificação para garantir que suas teclas ocupadas se espalhem adequadamente.
  • Mude para usar o repcached ou o Membase para replicar as chaves em vários nós
por 02.07.2011 / 15:13
0

Você tem certeza de que os front-ends que se comunicam com o Memcached têm entradas de configuração sincronizadas corretamente para o seu pool?

Todos os servidores podem fazer uma conexão limpa com o nó do Memcached que está com problemas de baixa conectividade?

Verifique se você tem o Memcached :: OPT_LIBKETAMA_COMPATIBLE ativado também.

Em relação à configuração; Se você estiver armazenando objetos grandes, a compactação / igbinary acelerará as coisas na E / S da rede, obviamente, pode haver uma desvantagem para que cada caso seja diferente. O benchmarking é a chave.

    
por 21.06.2011 / 23:22