Tempo limite do cliente Linux / keepalive do MySQL

6

Existe uma maneira de definir um keepalive no cliente MySQL da linha de comando no Linux?

Nossa rede mudou recentemente para uma configuração de VLAN e nosso departamento de sistemas não tem mais o controle do firewall. Os poderes que decidiram definir uma regra em seu firewall para matar todas as conexões após 30 minutos se nenhum dado foi passado (algo sobre ter que manter o controle das conexões e dos recursos limitados). Eu não tenho controle sobre isso.

Como administrador e programador de servidores, meu problema é que isso significa que não posso ter um cliente de linha de comando mysql sendo executado em segundo plano enquanto faço programação. Se eu não enviar uma consulta (ou enviar dados), quando tentar 35 minutos depois, o cliente detecta que não tem mais uma conexão. Tenho que reconectar todas as vezes.

No SSH, posso definir um keepalive para que eu possa manter as conexões abertas durante o dia. Existe uma opção configurável semelhante para o cliente de linha de comando mysql? Estou tendo problemas para encontrar algo, porque "Mysql Keepalive" e pesquisas semelhantes retornam resultados para uma conexão de backend dentro de uma linguagem de programação.

    
por Stephen Schrauger 02.10.2012 / 14:34

3 respostas

4

Você pode definir keepalives TCP genéricos, acho que há uma configuração do kernel para isso. Mas eles são geralmente muito menos frequentes (horas). Existe um TCP Keepalive HOWTO que parece ter detalhes.

Como alternativa, por que não apenas encapsular a conexão MySQL via SSH, então você pode usar keepalives SSH?

$ ssh -L1234:127.0.0.1:3306 -o ServerAliveInterval=300 user@mysql-server
... (in another terminal)
$ mysql -u user -p -h 127.0.0.1 -P 1234

A terceira opção seria configurar um túnel (por exemplo, OpenVPN) para o seu servidor e, em seguida, isso funcionará como keepalive (e reconexão transparente, etc.).

PS: O argumento "nossos recursos preciosos" para expirar as conexões TCP estabelecidas em 30 minutos é BS. Infelizmente, eu já estive no lugar deles - alguns equipamentos também são BS. Por exemplo, BCP 142 / RFC 5382 dá um tempo mínimo de 2 horas e 4 minutos (e isso é somente se o firewall não puder determinar se o host ainda está ativo).

    
por 02.10.2012 / 21:20
3

O cliente MySQL CLI assume como padrão a conexão automática, se uma conexão for perdida durante uma sessão. Documentação: Dicas do MySQL & Controlando o comportamento de reconexão automática .

A solução real seria trabalhar com os líderes e descobrir uma solução que funcione para os membros da equipe de desenvolvimento.

Naturalmente isso levaria algum tempo, portanto, uma solução temporária talvez precise ser criada. Eu recomendaria desabilitar a conexão automática do MySQL ( --skip-reconnect ) e criar um script simples para lidar com a reconexão. Não é uma boa ideia, mas pode ajudar.

#!/bin/bash

PROGRAM="/path/to/mysql"
ARGS="--skip-reconnect"

while [ 1 ]; do
 $PROGRAM $ARGS
 sleep 1
 echo -n "Lost Connection... Reconnect[Y]"
 read USER_INPUT
 case x$USER_INPUT in
  x)
   echo "Reconnecting..."
   ;;
  x[yY])
   echo "Reconnecting..."
   ;;
  *)
   echo "Stopping..."
   break
   ;;
 esac
done
    
por 02.10.2012 / 16:12
3

Você pode usar o libkeepalive para pré-carregar um libkeepalive.so que interceptará socket() chamadas e chamará automaticamente setsockopt() de sua preferência manter as configurações de manutenção no soquete antes de retorná-lo.

Isso faz não requerer que você recompile o aplicativo (neste caso o MySQL), é completamente transparente.

Veja também o TCP COMO fazer Keepalive? .

    
por 24.03.2014 / 14:45