Um pool de daemons do memcache pode ser usado para compartilhar sessões com mais eficiência?

25

Estamos passando de uma configuração de 1 servidor da Web para uma configuração de dois servidores da Web e preciso começar a compartilhar sessões do PHP entre as duas máquinas com carga balanceada. Nós já temos memcached instalado ( e iniciado ) e por isso fiquei agradavelmente surpreendido por poder realizar sessões de compartilhamento entre os novos servidores alterando apenas 3 linhas no arquivo php.ini (a sessão . save_handler e session.save_path ):

eu substituí:

session.save_handler = files

com:

session.save_handler = memcache

Em seguida, no servidor da Web principal, defino o session.save_path para apontar para localhost:

session.save_path="tcp://localhost:11211"

e no servidor escravo eu defino o session.save_path para apontar para o mestre:

session.save_path="tcp://192.168.0.1:11211"

Trabalho feito, testei e funciona. Mas ...

Obviamente, usar o memcache significa que as sessões estão na RAM e serão perdidas se uma máquina for reinicializada ou o daemon memcache travar - estou um pouco preocupado com isso, mas estou um pouco mais preocupado com o tráfego de rede entre os dois servidores (especialmente à medida que aumentamos) porque sempre que alguém é balanceado com carga para o servidor da Web escravo, suas sessões serão buscadas na rede a partir do servidor da web mestre. Eu queria saber se eu poderia definir dois save_paths para que as máquinas olhem em seu próprio armazenamento de sessão antes de usar a rede. Por exemplo:

Mestre:

session.save_path="tcp://localhost:11211, tcp://192.168.0.2:11211"

Escravo:

session.save_path="tcp://localhost:11211, tcp://192.168.0.1:11211"

Isso compartilharia com êxito as sessões nos servidores E ajudaria no desempenho? , ou seja, economizaria tráfego de rede em 50% do tempo. Ou essa técnica é apenas para failovers (por exemplo, quando um daemon do memcache é inacessível)?

Observação : não estou realmente perguntando especificamente sobre a replicação do memcache - mais sobre se o cliente memcache do PHP pode atingir o máximo dentro de cada daemon do memcache em um pool, retornar uma sessão se encontrar um e só criar uma nova sessão se não encontrar um em todas as lojas. Enquanto estou escrevendo isso, estou pensando que estou perguntando um pouco sobre PHP, lol ...

Suponha que : não há sessões aderentes, balanceamento de carga round-robin, servidores LAMP.

    
por Tom 27.07.2010 / 08:26

5 respostas

37
Aviso: Você ficaria louco em me ouvir sem fazer uma tonelada de testes E obter uma segunda opinião de alguém qualificado - Eu sou novo neste jogo .

A ideia de melhoria de eficiência proposta nesta questão não funcionará. O principal erro que cometi foi pensar que a ordem em que os armazenamentos de memcached estão definidos no conjunto dita algum tipo de prioridade. Este não é o caso . Quando você define um conjunto de daemons com memamadas (por exemplo, usando session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211" ), não é possível saber qual loja será usada. Os dados são distribuídos uniformemente, o que significa que um item pode ser armazenado no primeiro ou pode ser o último (ou pode ser ambos se o cliente memcache estiver configurado para replicar - observe que é o cliente que manipula a replicação, o servidor de memcached não não faça isso em si). De qualquer maneira, o uso do localhost como o primeiro no pool não melhorará o desempenho - há 50% de chance de acertar qualquer loja.

Depois de fazer um pouco de testes e pesquisas, concluí que você PODE compartilhar sessões em servidores usando memcache, mas você provavelmente não quer - ele não parece ser popular porque não é dimensionado tão bem quanto usar um banco de dados compartilhado não é tão robusto. Eu apreciaria o feedback sobre isso para que eu possa aprender mais ...

Ignore the following unless you have a PHP app:

Dica 1: Se você quiser compartilhar sessões em dois servidores usando o memcache:

Certifique-se de ter respondido Sim para " Habilitar suporte ao manipulador de sessão memcache? " ao instalar o cliente PHP memcache e adicionar o seguinte no seu arquivo /etc/php.d/memcache.ini :

session.save_handler = memcache

No servidor 1 (IP: 192.168.0.1):

session.save_path="tcp://192.168.0.1:11211"

No servidor da web 2 (IP: 192.168.0.2):

session.save_path="tcp://192.168.0.1:11211"

Dica 2: Se você quiser compartilhar sessões em dois servidores usando o memcache E tiver suporte a failover:

Adicione o seguinte ao seu arquivo /etc/php.d/memcache.ini :

memcache.hash_strategy = consistent
memcache.allow_failover = 1

No servidor 1 (IP: 192.168.0.1):

session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"

No servidor da web 2 (IP: 192.168.0.2):

session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"

Notas:

  • Isso destaca outro erro que cometi na pergunta original - não estava usando um session.save_path idêntico em todos os servidores.
  • Nesse caso, "failover" significa que, se um daemon do memcache falhar, o cliente do PHP memcache começará a usar o outro. ou seja, quem teve sua sessão na loja que falhou será desconectado. Não é um failover transparente.

Dica 3: se você quiser compartilhar sessões usando o memcache E tiver suporte a failover transparente:

O mesmo que a dica 2, exceto que você precisa adicionar o seguinte ao seu arquivo /etc/php.d/memcache.ini :

memcache.session_redundancy=2

Notas:

  • Isso faz com que o cliente PHP memcache grave as sessões em dois servidores. Você obtém redundância (como o RAID-1), de modo que as gravações são enviadas para n espelhos e a falha get's é repetida nos espelhos. Isso significará que os usuários não perderão sua sessão no caso de uma falha do daemon do memcache.
  • As gravações espelhadas são feitas em paralelo (usando E / S não bloqueado) para que o desempenho de velocidade não diminua, pois o número de espelhos aumenta. No entanto, o tráfego de rede aumentará se os espelhos do memcache forem distribuídos em máquinas diferentes. Por exemplo, não há mais 50% de chance de usar o host local e evitar o acesso à rede.
    • Aparentemente, o atraso na replicação de gravação pode fazer com que dados antigos sejam recuperados, em vez de um erro de cache. A questão é se isso é importante para o seu aplicativo? Com que frequência você escreve dados da sessão?
  • memcache.session_redundancy é para redundância de sessão, mas há também uma opção memcache.redundancy ini que pode ser usada pelo seu código de aplicativo PHP se você quiser que ele tenha um nível diferente de redundância.
  • Você precisa de uma versão recente (ainda em beta neste momento) do cliente memcache do PHP - Versão 3.0.3 do pecl funcionou para mim.
por 30.07.2010 / 14:39
28

Re: Dica 3 acima (para qualquer outra pessoa que se deparar com isso via google), parece que pelo menos atualmente para que isso funcione, você deve usar memcache.session_redundancy = N+1 para N servidores em seu pool , pelo menos esse parece ser o valor limite mínimo que funciona. (Testado com o php 5.3.3 no debian stable, o pecl memcache 3.0.6, dois servidores memcached. session_redundancy=2 falharia assim que eu desligasse o primeiro servidor no save_path , session_redundancy=3 funciona bem.)

Isso parece ser capturado nesses relatórios de bugs:

por 01.12.2011 / 12:49
3

Juntamente com as configurações do php.ini mostradas acima, verifique se as seguintes configurações também estão definidas:

memcache.allow_failover = 1  
memcache.hash_strategy = 'consistent'

Em seguida, você obterá redundância completa de failover e do lado do cliente. A ressalva com essa abordagem é que, se o memcached estiver inativo no host local, sempre haverá uma falha de leitura antes que o cliente php memcache tente o próximo servidor no conjunto especificado em session.save_path

Lembre-se de que isso afeta as configurações globais do cliente php memcache em execução no servidor da Web.

    
por 27.07.2010 / 15:41
1

memcached não funciona assim (por favor, corrija-me se eu estiver errado!)

Se você deseja que seu aplicativo tenha armazenamento de sessão redundante, é necessário criar algo que altere / adicione / exclua entradas para as duas instâncias do memcached. memcached não lida com isso, a única coisa que ele fornece é como armazenamento de hash chave. Então, sem replicação, sincronização, nada, nada.

Espero não estar errado neste assunto, mas isto é o que eu sei de memcached, há alguns anos desde que o toquei.

    
por 27.07.2010 / 09:11
1

o memcached não é replicado fora da caixa, mas o repcached (um memcached corrigido) funciona. No entanto, se você já estiver usando o mysql, por que não apenas usar sua funcionalidade de replicação com a replicação master-master e obter o benefício da replicação completa de dados.

C.

    
por 27.07.2010 / 10:21