A única maneira de obter mais informações do haproxy do que você usa seria usar o comando show sess
ou show sess <id>
periodicamente para observar o estado de cada conexão tcp, embora não tenha certeza se você obteria qualquer informação mais útil.
O estado da terminação cD
é a informação mais útil que você tem. O que significa exatamente é que uma conexão estabelecida com o cliente foi esgotada. Isso é controlado no haproxy por meio do parâmetro timeout client
na configuração, definido globalmente ou em uma seção frontent ou listen.
Você disse que não vê conexões simultâneas em 7, e essa entrada de log mostra que a falha ocorreu quando havia apenas 3 conexões, por isso duvido que você tenha um problema de limite de conexão (mesmo fora do controle do haproxy).
Então, o que parece que está acontecendo é que, ocasionalmente, o pool adiciona uma nova conexão, que lida com algumas consultas e fica inativa. Quando essa conexão fica ociosa por mais tempo do que a configuração timeout client
no haproxy, o haproxy terminará a conexão em si. Da próxima vez que a conexão for usada no pool, você receberá o erro acima.
O haproxy tem um tempo limite padrão de 10 segundos (e o exemplo de configuração tem 50 segundos). Eu não estou muito familiarizado com o JDBC, mas indo de documentos do Tomcat, há uma configuração minEvictableIdleTimeMillis
, que irá despejar conexão ociosa do pool, e padrão de 60 segundos, e pode ser de até 65 segundos, porque o timeBetweenEvictionRunsMillis
é 5 segundos por padrão. Basicamente, você precisa garantir que o tempo limite de haproxy seja alto o suficiente para considerar essas conexões ociosas no pool.
Outra abordagem seria usar testWhileIdle
e valildationQuery
para manter as conexões ativas, já que alguns pacotes de tráfego a cada poucos segundos provavelmente aliviam o problema também.
[edit] Em resposta a informações adicionais do @quanta:
Embora o tempo limite haproxy seja agora de 75 segundos, você ainda está recebendo tempos limite da sessão. Pode haver alguma reprodução adicional no tempo de vida total de uma conexão JDBC da qual não conheço. Como há muito poucas conexões necessárias para esse tipo de serviço, também não há nada de errado em aumentar os tempos limite para algo extremamente alto, na ordem de uma hora ou mais. Se o pool JDBC realmente está tendo problemas para liberar conexões antigas, isso estaria apenas mascarando o problema, mas também poderia ser uma correção fácil.