Como a viscosidade da sessão é alcançada em vários servidores da web?

20

Quantos servidores web o StackOverflow / ServerFault tem?

Se a resposta for "mais de um", então é possível atingir Sessões de sessão enquanto pesquisa DNS?

    
por p.campbell 23.05.2017 / 14:41

6 respostas

42

Grandes sites podem ter "carga balanceada" em várias máquinas. Em muitas configurações de balanceamento de carga, um usuário pode acessar qualquer uma das máquinas de back-end durante uma sessão. Por causa disso, existem vários métodos para permitir que muitas máquinas compartilhem sessões de usuários.

O método escolhido dependerá do estilo de balanceamento de carga empregado, bem como da disponibilidade / capacidade de armazenamento de back-end:

Informações da sessão armazenadas somente em cookies : As informações da sessão (não apenas um identificador de sessão) são armazenadas no cookie de um usuário. Por exemplo, o cookie do usuário pode conter o conteúdo do carrinho de compras. Para impedir que os usuários adulterem os dados da sessão, um HMAC pode ser fornecido junto com o cookie. Este método é provavelmente menos adequado para a maioria das aplicações:

  • Nenhum armazenamento de back-end é necessário
  • O usuário não precisa acessar a mesma máquina todas as vezes, portanto, o balanceamento de carga do DNS pode ser empregado
  • Não há latência associada à recuperação das informações da sessão de uma máquina de banco de dados (como é fornecido com a solicitação HTTP). Útil se o seu site tiver carga equilibrada por máquinas em diferentes continentes.
  • A quantidade de dados que podem ser armazenados na sessão é limitada (pelo limite de tamanho do cookie 4K)
  • A criptografia deve ser empregada se um usuário não puder ver o conteúdo de sua sessão
  • O HMAC (ou similar) deve ser empregado para impedir a violação de dados de sessão por parte do usuário
  • Como os dados da sessão não são armazenados no servidor, é mais difícil para os desenvolvedores depurarem

O balanceador de carga sempre direciona o usuário para a mesma máquina : muitos balanceadores de carga podem definir seu próprio cookie de sessão, indicando em qual máquina de backend um usuário está fazendo solicitações, e direcioná-lo para essa máquina no futuro . Como o usuário é sempre direcionado para a mesma máquina, o compartilhamento de sessão entre várias máquinas não é necessário. Isso pode ser bom em algumas situações:

  • O tratamento de sessão de um aplicativo existente pode não precisar ser alterado para se tornar ciente de várias máquinas
  • Nenhum sistema de banco de dados compartilhado (ou similar) é necessário para armazenar sessões, possivelmente aumentando a confiabilidade, mas com o custo da complexidade
  • Uma queda de máquina de back-end derrubará qualquer sessão de usuário iniciada com ela.
  • A retirada de máquinas de serviço é mais difícil. Usuários com sessões em uma máquina a serem removidas para manutenção devem ter permissão para concluir suas tarefas, antes que a máquina seja desligada. Para suportar isso, os balanceadores de carga da Web podem ter um recurso para "drenar" solicitações para uma determinada máquina de backend.

Banco de dados de back-end ou armazenamento de chave / valor compartilhado : As informações da sessão são armazenadas em um banco de dados de back-end, que todos os servidores da Web têm acesso para consulta e atualização. O navegador do usuário armazena um cookie contendo um identificador (como o ID da sessão), apontando para as informações da sessão. Este é provavelmente o método mais limpo dos três:

  • O usuário nunca precisa ser exposto às informações da sessão armazenada.
  • O usuário não precisa acessar a mesma máquina todas as vezes, portanto, o balanceamento de carga do DNS pode ser empregado
  • Uma desvantagem é o gargalo que pode ser colocado em qualquer sistema de armazenamento de back-end que seja empregado.
  • As informações da sessão podem ter expirado e feito backup de forma consistente.

No geral, a maioria dos aplicativos da web dinâmicos realiza várias consultas ao banco de dados ou solicitações de armazenamento de chave / valor, portanto, o banco de dados ou armazenamento de chave / valor é o local de armazenamento lógico dos dados da sessão.

    
por 26.06.2009 / 22:42
4

Se a sua pergunta é como manter as sessões em vários servidores Web front-end, a resposta geralmente é usar um banco de dados centralizado. Em vez de confiar nas instâncias do servidor da Web para rastrear arquivos de sessão nos sistemas de arquivos locais, você gravaria os ids e dados da sessão em um banco de dados central, e todos os servidores da Web recuperariam os dados de lá.

    
por 26.06.2009 / 21:52
1

Usar nemcached parece ser uma boa solução, não como mencionado por @David Pashley

Isso significa ter uma instância remota do memcached compartilhada por todos os servidores e usar a extensão PLCL do memcache que fornece seu próprio manipulador de sessão.

Isso só requer a alteração de dois parâmetros na configuração do php!

Aqui está um bom tutorial link

    
por 25.04.2013 / 16:08
0

IIRC, em DotNetRocks # 440 eles disseram um período de servidor. Não sei se esse ainda é o caso.

Editar: Na verdade, foi Hanselminutos # 134 . Desculpe.

    
por 26.06.2009 / 21:58
0

Você pode definir um cookie.

Você pode calcular um hash do IP remoto (em seus hosts remotos mais simples, com numeração ímpar, vão para o servidor A e os hosts com numeração par vão para o servidor B).

Parece que você também pode fazer isso por meio de alguns valores que permanecem no sistema de origem, se você estiver usando um túnel ssl.

Normalmente, cada um dos mecanismos acima requer um servidor "proxy reverso" ou um balanceador de carga de algum tipo. Esse balanceador de carga aceita o tráfego e, em seguida, direciona-o para qualquer servidor que tenha inicialmente a sessão, com base em um dos critérios acima.

Não tenho certeza, no entanto, do que você quer dizer com "pesquisa de DNS"

    
por 26.06.2009 / 22:07
0

a) Você pode armazenar informações da sessão no cookie do usuário. Veja cookies endurecidos stateless, que não armazenam nenhum dado no lado do servidor, mas preserva o link . b) Você pode alterar o armazenamento de back-end da sessão para o banco de dados ou o memcached. Para eliminar o ponto único de falha, você pode definir a replicação do banco de dados ou vários nós do memcached. Note que memcached é recomendado em tais configurações onde perder o estado do usuário na sessão não é um grande erro e não o torna muito infeliz. Para casos em que o estado de preservação é vital, use bancos de dados. Ambos PHP, Django e Rails permitem que o desenvolvedor escreva back-end de sessão personalizada.

    
por 26.06.2009 / 23:39