Quando um IP do servidor muda, as conexões exising TCP (por exemplo, http / mysql) permanecem em execução

3

Temos alguns servidores PHP-FPM e, quando precisam de uma conexão de banco de dados, eles se conectam a um servidor HAProxy, que os seleciona para usar um servidor de banco de dados e a conexão é aberta. Quando, em seguida, desejamos realizar alguma manutenção nos servidores HAProxy (como alterações de configuração que exigem uma reinicialização HAProxy), o processo é o seguinte:

  1. Shutdown Keepalived no servidor HAProxy
  2. Aguarde até que o IP flutuante seja transferido para o servidor HAProxy de backup (também executando o Keepalived)
  3. Espere até que as estatísticas do HAProxy relatem apenas uma conexão (para verificar quantas conexões existem)
  4. Reinicie o HAProxy
  5. Reinicie o Keepalived

Como o passo 2 ocorre, o que acontecerá com as conexões abertas do mysql naquele ponto? De acordo com esta questão de Sessões TCP e Alterações de IP , as conexões serão canceladas. É este realmente o caso? Se sim, o que, se for o caso, pode ser feito para evitar que isso aconteça? A conexão pode de alguma forma ser forçada a usar o IP principal (não flutuante) do servidor?

Também temos uma configuração semelhante com dois servidores Nginx com o Keepalived sendo executado e planejamos fazer o processo equivalente. Se fizermos isso, a mesma pergunta se aplica - o que acontece com as conexões http existentes quando o IP passa para o outro servidor?

Agradeço sua ajuda.

    
por Luke Cousins 12.06.2014 / 10:32

2 respostas

5

Eles se desconectam. O TCP não tem parte de protocolo para alterar o endereço IP para que os clientes não saibam que ele mudou de forma mágica. Uma nova conexão terá que ser estabelecida.

    
por 12.06.2014 / 10:37
1

Os endereços IP a serem usados para a conexão TCP são escolhidos pelo cliente quando a conexão é estabelecida. A escolha pode ser feita pela camada de aplicação ligando o socket a um IP específico antes de conectar, ou pelo kernel se a camada de aplicação não tiver feito uma escolha.

A escolha feita pelo kernel pode ser controlada de algumas maneiras diferentes. Um host que tenha um endereço IP estático e um endereço IP flutuante deve ser configurado para usar o endereço IP estático para conexões de saída. Se você quiser usar um IP apenas para conexões de entrada e não para conexões de saída, você pode atribuí-lo a uma interface fictícia.

Por padrão, o endereço IP escolhido pelo kernel é aquele atribuído à interface pela qual o pacote TCP SYN é enviado. Se você estiver usando o IPv6, você tem um controle mais detalhado, aqui estão alguns exemplos de comandos que podem ser usados no Linux:

/sbin/ip -6 addr change 2001:db8::234 dev eth0 preferred_lft 1
/sbin/ip -6 addr change 2001:db8::1 dev eth0 preferred_lft 0

O par de comandos acima usaria 2001:db8::234 para pacotes SYN enviados através de eth0 .

    
por 12.06.2014 / 11:33