Estamos passando de uma configuração de 1 servidor para uma configuração de dois servidores e preciso começar a compartilhar sessões PHP entre as duas máquinas com balanceamento de carga. Já instalamos o memcached ( e iniciamos ) e, por isso, fiquei agradavelmente surpreso ao concluir as sessões de compartilhamento entre os novos servidores alterando apenas três linhas no php.ini
arquivo ( session.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
ponto para localhost:
session.save_path="tcp://localhost:11211"
e no servidor escravo, defino o session.save_path
ponto para o mestre:
session.save_path="tcp://192.168.0.1:11211"
Trabalho feito, eu 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 do memcache travar - estou um pouco preocupado com isso, mas estou um pouco mais preocupado com o tráfego de rede entre os dois servidores da web (especialmente como aumentamos) porque sempre que alguém é balanceado por carga para o servidor escravo, suas sessões serão buscadas na rede a partir do servidor 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 sessões com êxito entre os servidores e ajudaria no desempenho? ou seja, economize tráfego de rede 50% do tempo. Ou essa técnica é apenas para failovers (por exemplo, quando um daemon do memcache está inacessível)?
Nota : Na verdade, não estou perguntando especificamente sobre a replicação do memcache - mais sobre se o cliente PHP do memcache pode entrar dentro de cada daemon do memcache em um pool, retornar uma sessão se encontrar um e criar apenas uma nova sessão se não encontrar um em todas as lojas. Enquanto escrevo isso, estou pensando em pedir um pouco demais ao PHP, lol ...
Suponha : sem sessões complicadas, balanceamento de carga round-robin, servidores LAMP.
fonte
Respostas:
Isenção de responsabilidade: Você ficaria louco de me ouvir sem fazer uma tonelada de testes E obter uma segunda opinião de alguém qualificado - sou novo neste jogo .
A ideia de melhoria de eficiência proposta nesta pergunta não funcionará. O principal erro que cometi foi pensar que a ordem em que os armazenamentos em cache são definidos no pool determina algum tipo de prioridade. Este não é o caso . Quando você define um conjunto de daemons memached (por exemplo, usando
session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"
), não pode 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 o último se o cliente memcache estiver configurado para replicar - observe que é o cliente que manipula a replicação, o servidor memcached não faça isso sozinho). De qualquer forma, isso significa que o uso do host local como o primeiro no pool não melhorará o desempenho - há 50% de chance de atingir qualquer loja.Depois de fazer um pouco de teste e pesquisa, concluí que você PODE compartilhar sessões entre servidores usando o memcache, MAS provavelmente não deseja - não parece ser popular porque não é tão dimensionável quanto o uso de um compartilhamento. banco de dados nele não é tão robusto. Gostaria de receber feedback sobre isso para que eu possa aprender mais ...
Dica 1: se você deseja compartilhar sessões entre 2 servidores usando o memcache:
Certifique-se de responder Sim para " Ativar suporte ao manipulador de sessão do memcache? " Ao instalar o cliente memcache do PHP e adicione o seguinte no seu
/etc/php.d/memcache.ini
arquivo:No servidor da web 1 (IP: 192.168.0.1):
No servidor da web 2 (IP: 192.168.0.2):
Dica 2: se você deseja compartilhar sessões entre 2 servidores usando o memcache E possuir suporte a failover:
Adicione o seguinte ao seu
/etc/php.d/memcache.ini
arquivo:No servidor da web 1 (IP: 192.168.0.1):
No servidor da web 2 (IP: 192.168.0.2):
Notas:
session.save_path
em todos os servidores.Dica 3: se você deseja compartilhar sessões usando o memcache E ter suporte transparente a failover:
Igual à dica 2, exceto que você precisa adicionar o seguinte ao seu
/etc/php.d/memcache.ini
arquivo:Notas:
get's
sejam repetidas nos espelhos. Isso significa que os usuários não perdem sua sessão no caso de uma falha do daemon do memcache.memcache.session_redundancy
é para redundância de sessão, mas também há umamemcache.redundancy
opção ini que pode ser usada pelo seu código de aplicativo PHP, se você desejar que ele tenha um nível diferente de redundância.fonte
ext/memcache
versão 3.x. Também estamos brincando com essa opção e decidi percorrer a lista de servidores e escrever nela mesma.Re: Dica 3 acima (para qualquer pessoa que se depare com isso via google), parece que, pelo menos atualmente, para que isso funcione, você deve usar os
memcache.session_redundancy = N+1
servidores N no seu pool , pelo menos esse parece ser o limite mínimo valor que funciona. (Testado com o php 5.3.3 no debian stable, pecl memcache 3.0.6, dois servidores memcached.session_redundancy=2
Falharia assim que eu desligasse o primeiro servidor nosave_path
,session_redundancy=3
funciona bem.)Isso parece ser capturado nestes relatórios de erros:
fonte
Juntamente com as configurações do php.ini mostradas acima, verifique também o seguinte:
Então você obterá failover total e redundância do lado do cliente. A ressalva dessa abordagem é que, se o memcached estiver desativado no localhost, sempre haverá uma falha de leitura antes que o cliente php memcache tente o próximo servidor no pool 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.
fonte
consistent
estratégia de hash faz sentido, considerando quesession.save_path
é diferente em cada servidor da web?O memcached não funciona dessa maneira (por favor, corrija-me se estiver errado!)
Se você deseja que seu aplicativo tenha armazenamento de sessão redundante, é necessário criar algo que altere / adicione / exclua entradas nas duas instâncias armazenadas em cache. O memcached não lida com isso, a única coisa que fornece é como armazenamento de hash da chave. Portanto, sem replicação, sincronização, nada, nada.
Espero não estar errado sobre esse assunto, mas é isso que sei do memcached, já faz alguns anos desde que o toquei.
fonte
O memcached não é replicado imediatamente , mas o repcached (um memcached corrigido) sim. No entanto, se você já estiver usando o mysql, por que não usar sua funcionalidade de replicação com a replicação master-master e obter o benefício da replicação completa de dados.
C.
fonte