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