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.

Pool de Conexões
Figure 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:

  1. 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.

  2. 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 no arquivo:

    1. 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.

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

  3. 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.

    1. Se a consulta de autenticação for bem-sucedida e a senha corresponder, o PgBouncer autentica o cliente com sucesso.

  4. 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.

    1. 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.

    2. 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).