por que não há exemplos de balanceadores de carga de software escalonáveis ​​horizontalmente balanceando ssl?

9

Eu tenho várias perguntas sobre ssl, sessões locais e balanceamento de carga que parecem estar interconectados, então peço desculpas antecipadamente pela duração desta pergunta.

Eu tenho um site que usa sessões baseadas em arquivo. A natureza do site é que a maioria é http, mas algumas seções são ssl. Atualmente, devido às sessões baseadas em arquivo, é necessário que qualquer solicitação de SSL atinja o mesmo servidor que qualquer solicitação de HTTP anterior.

Devido a restrições de tempo, desejo fazer o mais fácil possível para equilibrar o carregamento do aumento do tráfego HTTP e SSL.

Parece haver duas opções para algoritmos de balanceamento de carga persistente:

  • baseado em ip
  • baseado em cookies

A solução baseada em IP provavelmente funcionará, mas o algoritmo de hash poderá alterar potencialmente o servidor ao qual um usuário acessa quando um servidor fica inativo ou é adicionado, o que é indesejável na configuração atual da sessão baseada em arquivo. Suponho também que seja tecnicamente possível para um usuário alterar legitimamente ips enquanto navega em um site.

O algoritmo baseado em cookies parece melhor, mas a incapacidade de inspecionar o cookie quando criptografado pelo SSL aparentemente apresenta seus próprios problemas.

Eu tenho pesquisado no Google por exemplos de como carregar o SSL de equilíbrio, e não consigo encontrar exemplos explícitos de configurações que possam fazer o balanceamento de carga baseado em cookie E que podem lidar com o aumento da carga de SSL adicionando outro decodificador de SSL.

A maioria dos exemplos explícitos que eu vi tem o decodificador ssl (geralmente hardware, apache_mod_ssl ou nginx) entre o cliente do navegador e o balanceador de carga. Os exemplos geralmente parecem ter algo assim (modificado em http://haproxy.1wt.eu/download/1.3/doc/architecture.txt ):

      192.168.1.1 192.168.1.11-192.168.1.14
 ------- + ----------- + ----- + ----- + ----- +
        | | | | |       
     + - + - + + - + - + + - + - + + - + - + + - + - +    
     | LB1 | A | B | C | D    
     + ----- + + --- + + --- + + --- + + --- +    
     servidores web apache 4 baratos
     mod_ssl
     haproxy 

A parte de decodificação ssl no exemplo acima parece ser um gargalo em potencial que não é escalável horizontalmente.

Eu olhei para haproxy, e parece ter uma opção 'mode tcp' que permitiria algo assim, o que permitiria que você tivesse vários decodificadores ssl:

              haproxy
                 |
            -------------
            | |
decodificador-ssl-1 decodificador-ssl2
            | |
        -------------------
        | | |  
      web1 web2 web3

No entanto, nessa configuração, parece que você perderia o IP do cliente porque o haproxy não está decodificando o ssl: https://cloud-support.engineyard.com/discussions/problems/335-haproxy-not-passing-x-forwarded -para

Também observei o nginx e também não vejo exemplos explícitos de decodificadores ssl horizontalmente escaláveis. Parece haver muitos exemplos de pessoas tendo o nginx como um gargalo em potencial. E pelo menos esse link parece sugerir que o nginx nem sequer tem a opção de configuração do tipo haproxy, onde você perderia o ip dizendo que o nginx "não suporta a passagem transparente de conexões TCP a um back-end" Como passar o Apache Tráfego SSL através do proxy nginx? .

Questões:

  • Por que não parece haver mais exemplos de configurações adicionando mais decodificadores SSL para lidar com o aumento do tráfego?
  • É porque a etapa de decodificação do SSL é apenas um gargalo teórico e, na prática, um decodificador será essencialmente suficiente, exceto em sites com tráfego ridículo?
  • Outra solução possível que me vem à mente é que talvez alguém com essas necessidades de ssl aumentadas também tenha um armazenamento de sessão centralizado, portanto, não importa em qual servidor da Web o cliente acessa em solicitações sequenciais. Então você pode ativar o mod_ssl ou equivalente em todos os servidores da web.
  • A solução haproxy citada acima parece funcionar (além do problema de IP do cliente), mas alguém encontrou uma solução de balanceador de carga de software baseada em cookie pegajoso que funcionaria aumentando o número de decodificadores enquanto mantinha o IP do cliente, ou talvez isso não seja tecnicamente possível (porque você precisa decodificar a solicitação para obter o IP do cliente; nesse caso, temos um gargalo no decodificador).

Supondo que tudo o que eu disse seja verdade, essas são as minhas opções:

  • use hash ip (ruim para usuários que potencialmente alteram legitimamente ips e para cenários de adição e remoção de servidores)
  • use nginx ou mod_ssl como o primeiro programa a tocar na solicitação ssl, este será um gargalo em potencial de decodificação ssl
  • use haproxy como o primeiro programa a tocar na solicitação ssl, ganhando escalabilidade ssl horizontal, mas viva sem ips registrados no nível do servidor da web para solicitações ssl (provavelmente temporariamente ok)
  • a longo prazo, vá para um armazenamento de sessão móvel ou centralizado, tornando desnecessárias as sessões persistentes
em que lugar
fonte
Eu acho que womble tem razão em saber que a coisa mais simples é mudar para um repositório centralizado de sessões. Provavelmente vou marcar a resposta dele como correta, embora ainda esteja interessado em outros pensamentos aleatórios.
wherestheph

Respostas:

8

A "coisa mais simples", com toda a seriedade, é mudar para um armazenamento de sessão centralizado. Você precisa configurar todo esse encanamento com balanceadores de carga, haproxy, SSL e o restante, quando cada pedaço de código de manipulação de sessão que eu já vi torna quase trivial conectar diferentes mecanismos de armazenamento, então um pouco de código e muito, muito pouca complexidade extra resolve todos os seus problemas.

mulher
fonte
8

womble está certo sobre a loja de sessões compartilhadas, facilitando muito as coisas. Além de sua resposta, posso expandir um pouco as partes do balanceamento de carga da pergunta:

Por que não parece haver mais exemplos de configurações adicionando mais decodificadores SSL para lidar com o aumento do tráfego?

Os PCs modernos com vários núcleos podem realizar vários milhares de transações SSL por segundo. E se isso se tornar um gargalo, um dispositivo dedicado da F5 , Citrix, Cisco ou similar pode ser ainda mais rápido. Portanto, a maioria dos sites nunca supera uma boa solução SSL e balanceamento de carga para um único dispositivo.

Supondo que tudo o que eu disse seja verdade, essas são as minhas opções:

Existem opções para dimensionar a descriptografia SSL horizontalmente, se você precisar disso.

A abordagem comum é usar o DNS Round Robin para pares de aceleradores SSL altamente disponíveis, ou seja, publicar vários endereços IP para o domínio, cada endereço IP apontando para um par de aceleradores SSL.

Nesse caso, você pode se preocupar com o tempo limite do DNS TTL no meio de uma sessão do usuário, enviando o usuário para outro servidor de aplicativos. Isso não deve ser uma ocorrência comum, mas pode acontecer. Um armazenamento de sessão compartilhado é a solução comum, mas pode ser tratado de outras maneiras.

Como exemplo, você pode separar a descriptografia SSL do balanceamento do servidor de aplicativos. O manuseio de SSL consome mais CPU do que o balanceamento de carga básico, portanto, um único balanceador de carga deve poder saturar alguns aceleradores SSL. Como isso:

Internet --> DNS round robin to multiple SSL accelerators --> plain HTTP to a single HTTP load balancer --> plain HTTP to multiple application servers

Como mencionado no início, um armazenamento de sessão compartilhada simplifica muitas coisas e é quase certamente uma solução melhor a longo prazo do que colocar muita complexidade em sua camada de SSL / balanceamento de carga.

Jesper M
fonte
+1 para rodízio de DNS. Por exemplo, é isso que o balanceamento de carga elástico da AWS usa.
Alex
3

É divertido responder a perguntas de 2 anos assim quando os produtos evoluíram. No momento, o haproxy suporta o protocolo PROXY, que permite passar o IP do cliente para o próximo salto, mesmo no modo TCP puro. Ele também suporta SSL nativo, bem como aderência ao SSL, se você quiser usá-lo como uma primeira camada na frente de um farm SSL (possivelmente feito de servidores haproxy). Parece que sua solicitação estava um pouco adiantada e que as implementações alcançaram :-)

Willy Tarreau
fonte
1

Eu concordo com womble e Jesper aqui. A rota mais fácil / melhor é corrigir o código. É claro que, como administradores de sistemas, muitas vezes não temos essa opção, mas mesmo nesse caso há truques suficientes para que o hardware moderno relativamente barato seja escalado longe o suficiente, mesmo que não seja horizontal.

Eu só queria postar para comentar onde você está preocupado em perder o IP do cliente. Em qualquer uma das principais soluções L7 / proxy, você pode inserir um cabeçalho X-Forwarded-For (ou o que quiser) na solicitação. Em seguida, no servidor da web de back-end que recebe a solicitação, você pode alterar o formato do arquivo de log para registrar esse valor no mesmo espaço no arquivo usado para registrar o IP do cliente layer3. Dessa forma, qualquer software de análise de logs não vê a diferença (nem quando você está seguindo).

Há vantagens e desvantagens em tudo, e ainda não ouvimos o suficiente sobre sua configuração, mas com o trio de ha-proxy, nginx e verniz que você não pode errar, provavelmente é uma boa ideia mover seu balanceamento de carga para uma ferramenta de camada proxy. Isso resolverá o seu problema de SSL e fornecerá a você uma série de novas opções, como cache, troca de conteúdo e manipulação de cabeçalho.

cagenut
fonte
1

Alguns pensamentos aleatórios;)

Primeiro, atire na pessoa que decidiu usar os dados da sessão com base em arquivo. Não há como ler / gravar dados de um sistema de arquivos ser mais rápido do que apenas voltar à fonte para obter os dados necessários. Essa é a pior maneira de fazer isso.

Pessoalmente, nunca vi uma situação em que armazenar dados em uma sessão era melhor do que apenas extraí-los diretamente do banco de dados, conforme necessário. Dito isso, vi onde o uso do memcache ou estratégias de cache semelhantes podem ajudar um site a escalar milhões de usuários, mas isso não é nem o mesmo que usar sessões.

Segundo, você acabou de encontrar o motivo número um para não usar sessões: balanceamento de carga. FYI - Sticky não significa Stuck. Mesmo com as sessões fixas ativadas, você executa a possibilidade real de o usuário ser transferido para outro servidor no meio do uso do aplicativo. Isso acontecerá nos momentos mais inoportunos. Pegajoso significa apenas que o balanceador de carga tentará enviar o usuário de volta ao servidor em que eles começaram, mas não é de forma alguma uma garantia.

Esse ponto geralmente leva as pessoas a armazenar a sessão novamente no banco de dados ... o que eu acredito que é uma falha completa . Para que a sessão funcione, ela deve ser carregada e gravada em cada solicitação de página. Quando é armazenado em um banco de dados (necessário para servidores com balanceamento de carga), são necessárias duas consultas ao servidor: a primeira para obter os dados e a segunda para gravar as atualizações.

A parte falha é que as pessoas costumam usar sessões para não precisar voltar ao banco de dados para obter coisas como o nome do usuário ... Mas se a página precisar consultar o banco de dados para carregar uma sessão, então ... bem, você poderá ver o problema lógico aqui.

Só é pior com as sessões ... porque o processador da página precisa gravar os dados da sessão no banco de dados no final do ciclo de vida da página. No caso de algo mudar. O que significa que, em vez da consulta para puxar o nome do usuário, você acaba com duas. Para cada carregamento de página. Além disso, significa serializar e desserializar os dados que têm seu próprio impacto no desempenho.

O que quero dizer é: a sessão é má e você geralmente está melhor sem ela. Sites de baixo tráfego, executados apenas em um servidor Web, não precisam do aumento de desempenho que pode ocorrer; e sites de alto tráfego em execução em um web farm são limitados em escala devido a isso.

Eu não
fonte
0

Em vez de usar o Haproxy na frente, você pode usar o DNS de round robin para fazer um balanceamento aproximado entre vários decodificadores SSL e depois passá-lo para o haproxy para o balanceamento de carga adequado.

JamesRyan
fonte