Pular para o conteúdo principal

Pool de Conexões

O processo de abertura de conexões em um Banco de Dados envolve custos significativos em termos de recursos computacionais e tempo. Uma estratégia eficaz para mitigar esses custos é a utilização de um pool de conexões, que mantém um número de conexões abertas e prontas para serem reutilizadas, reduzindo assim a sobrecarga associada à abertura e fechamento frequente de conexões.

Figura 1 - Pool de Conexões
Figura 1 - Pool de Conexões

PgBouncer

O PgBouncer é o componente de gerenciamento de conexões de Banco de Dados do PostgreSYS. Atuando como um intermediário entre os clientes e a instância de Banco de Dados PostgreSQL.

Suas principais características envolvem:

  • Flexibilidade: Em um mesmo servidor podemos ter pools de conexões para bancos de dados de hosts diferentes.
  • Disponibilidade: Possibilita a alteração de configurações e atualizações sem a interrupção das conexões clientes ativas nos pools.
  • Otimização: Reduz a sobrecarga decorrente de conexões no servidor PostgreSQL, promovendo um melhor aproveitamento dos recursos disponíveis.
  • Facilidade: Configuração simples e eficiente.
  • Segurança: Suporte a vários métodos de autenticação.
  • Desempenho: Ideal para ambientes com alto número de clientes simultâneos.

Reutilização de Conexões

O PgBouncer reutiliza conexões, otimizando a eficiência e o desempenho do sistema. Existem três modos de reutilização de conexões:

  1. Session: A conexão é atribuída ao cliente durante toda a sessão. Ao se desconectar, a conexão retorna para o pool. Este é o modo padrão.
  2. Transaction: A conexão é utilizada apenas durante uma transação. Quando esta é finalizada, através de um COMMIT ou ROLLBACK, a conexão é devolvida ao pool.
  3. Statement: A conexão é devolvida ao pool imediatamente após a execução de um comando SQL. Este modo não admite transações com várias instruções.

Autenticação

O PgBouncer atua como um intermediário entre as aplicações clientes e o servidor PostgreSQL, autenticando e gerenciando as conexões. O processo de autenticação garante que apenas os clientes autorizados tenham acesso aos bancos de dados da instância.

Este componente suporta os mesmos mecanismos de autenticação suportados pelo PostgreSQL, incluindo a configuração de acesso baseada em host.

O processo de autenticação para uma solicitação de conexão a um pool do PgBouncer envolve as seguintes etapas:

  • Verificação dos dados fornecidos: Quando um cliente faz uma solicitação de conexão com o PgBouncer, o PgBouncer verifica se os dados fornecidos pelo cliente, incluindo o nome de usuário e, opcionalmente, a senha, são suficientes para autenticar o cliente.

  • Verificação no userslist.txt: O PgBouncer verifica o arquivo de configuração userslist.txt (ou outro arquivo definido em sua configuração), onde estão especificadas as tuplas de autenticação, que consistem no nome de usuário e senhas correspondentes. O PgBouncer procura neste arquivo pelo nome de usuário fornecido pelo cliente:

    • Se o nome de usuário for encontrado e a senha fornecida pelo cliente coincidir com a senha correspondente no arquivo userslist.txt, a autenticação é bem-sucedida. Neste caso, nenhuma conexão adicional com o PostgreSQL é estabelecida, e o PgBouncer direciona o cliente para uma conexão existente no pool, se disponível.

    • Se o nome de usuário não for encontrado no arquivo userslist.txt, o PgBouncer continua o processo de autenticação.

  • Autenticação de Passagem (Pass-through): Se o mecanismo de autenticação de passagem (também conhecido como authentication pass-through) estiver configurado e o nome de usuário não for encontrado no arquivo userslist.txt, o PgBouncer procura por uma query de autenticação (auth query) definida em sua configuração. O PgBouncer então se conecta ao servidor PostgreSQL como um usuário predefinido (cuja senha é especificada no arquivo userslist.txt) e executa a consulta de autenticação para localizar e verificar a senha do usuário em relação à senha fornecida pelo cliente.

    • Se a consulta de autenticação for bem-sucedida e a senha corresponder, o PgBouncer autentica o cliente com sucesso.
  • Conexão ao Pool: Após a autenticação bem-sucedida, o PgBouncer verifica se existe uma conexão em cache no pool de conexões com a mesma combinação de nome de usuário e Banco de Dados solicitados pelo cliente.

    • Se uma conexão correspondente for encontrada na cache, o PgBouncer a recupera e a atribui ao cliente, economizando recursos de criação de conexões.

    • Se não houver uma conexão correspondente disponível na cache, o PgBouncer criará uma nova conexão com o servidor PostgreSQL, desde que isso não ultrapasse os limites de conexões definidos nas configurações do PgBouncer (como o número máximo de conexões permitidas).