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çãomemcache.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.