PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Pool de conexões do PostgreSQL:Parte 2 – PgBouncer

Quando se trata de pool de conexões no mundo PostgreSQL, PgBouncer é provavelmente a opção mais popular. É um utilitário muito simples que faz exatamente uma coisa – fica entre o banco de dados e os clientes e fala o protocolo PostgreSQL, emulando um servidor PostgreSQL. Um cliente se conecta ao PgBouncer com exatamente a mesma sintaxe que usaria ao se conectar diretamente ao PostgreSQL – o PgBouncer é essencialmente invisível.

O PgBouncer é suportado por quase todos os fornecedores de DBaaS PostgreSQL e amplamente utilizado em toda a comunidade. Nesta postagem do blog, explicaremos como o PgBouncer funciona, os prós e contras de usá-lo e como configurar o pool de conexões. Se você quiser saber mais sobre o pool de conexões em geral, ou se quiser saber se é adequado para sua implantação, confira nosso PostgreSQL Connection Pooling:Part 1 – Pros &Contras post.

Série de pool de conexões PostgreSQL

  • Parte 1 – Prós e contras
  • Parte 2 – PgBouncer
  • Parte 3 – Pgpool-II
  • Parte 4 – PgBouncer vs. Pgpool-II

Como funciona o PgBouncer?

Quando o PgBouncer recebe uma conexão de cliente, ele primeiro realiza a autenticação em nome do servidor PostgreSQL. O PgBouncer suporta todos os mecanismos de autenticação que o servidor PostgreSQL suporta, incluindo uma configuração de acesso baseado em host (nota:não podemos rotear conexões de replicação através do PgBouncer). Se uma senha for fornecida, a autenticação pode ser feita de duas maneiras:

  1. O PgBouncer primeiro verifica o arquivo userslist.txt – este arquivo especifica um conjunto de tuplas (nome de usuário, senhas criptografadas md5). Se o nome de usuário existir neste arquivo, a senha será comparada com o valor fornecido. Nenhuma conexão com o servidor PostgreSQL é feita.
  2. Se a autenticação de passagem estiver configurada e o usuário não for encontrado no arquivo userslist.txt, o PgBouncer procurará uma auth_query. Ele se conecta ao PostgreSQL como um usuário predefinido (cuja senha deve estar presente no arquivo userslist.txt) e executa a auth-query para encontrar a senha do usuário e combiná-la com o valor fornecido.

Quando a autenticação for bem-sucedida:

  1. O PgBouncer verifica se há uma conexão em cache, com a mesma combinação de nome de usuário+banco de dados.
  2. Se uma conexão em cache for encontrada, ela retornará a conexão ao cliente.
  3. Se uma conexão em cache não for encontrada, ela cria uma nova conexão, desde que a criação de uma nova conexão não:
    • Aumente o número de conexões para> pool_size
    • Aumente o número de conexões do cliente para> max_client_connections
    • Aumente o número de conexões com o banco de dados para> max_db_connections
    • Aumentar o número de conexões do usuário para> max_user_connections
  4. Todos esses valores podem ser definidos nas configurações do PgBouncer.
  5. Se a criação de uma nova conexão violar qualquer uma das configurações, o PgBouncer enfileira a conexão até que uma nova possa ser criada, exceto se violar a restrição max_client_connections.
    Observação – O tempo das etapas de pós-autenticação difere ligeiramente com base no modo PgBouncer. No modo de pool de transações ou instruções, as etapas de pós-autenticação são executadas somente quando o cliente começa a executar uma transação/instrução. Discutimos mais sobre os modos de agrupamento abaixo.
  6. Se violar a restrição max_client_connections, abortará a conexão.

Com base no agrupamento modo, o PgBouncer aguarda uma oportunidade para retornar a conexão ao banco de dados:

  • No modo de pool de sessão, uma conexão é retornada ao pool somente quando um cliente fecha a sessão.
  • No modo de pool de transações, uma conexão é retornada ao pool somente quando um cliente conclui uma transação (normalmente um rollback ou um commit é executado). Como resultado, os recursos baseados em sessão não são suportados neste modo. Não há garantia de que duas transações executadas na mesma conexão do cliente PgBouncer serão executadas na mesma conexão do servidor PgBouncer.
  • No modo de agrupamento de instruções, uma conexão é retornada ao conjunto assim que uma instrução é executada. Aqui, o autocommit está sempre ativado.

Antes de retornar a conexão ao banco de dados, o PgBouncer executa uma consulta de redefinição para remover todas as informações da sessão – isso torna seguro compartilhar conexões entre clientes. É possível configurar esta consulta com base nas necessidades da aplicação.

O modo de pool de transações é usado com mais frequência, embora o modo de pool de sessões possa ser útil para cargas de trabalho específicas. Você pode ler mais sobre o PgBouncer em sua página Wiki.
Pool de conexões do PostgreSQL:Parte 2 – PgBouncerClick To Tweet

Por que escolher o PgBouncer?

Há muitas razões pelas quais o PgBouncer é a escolha mais popular quando se trata de pool de conexões no PostgreSQL. Aqui estão alguns dos melhores recursos e profissionais que o PgBouncer oferece:

  • Modos de agrupamento – Ao dar aos usuários o poder de decidir quando uma conexão é retornada ao pool, o PgBouncer é capaz de oferecer suporte a uma vasta gama de casos de uso. E, como essa configuração está em um nível de pool, você pode usar o modo de transação (melhor desempenho) para suas conexões de banco de dados usuais e o modo de sessão somente quando precisar de recursos como instruções preparadas!
  • Configuração e uso fáceis – O PgBouncer é um dos poolers de conexão PostgreSQL mais fáceis de configurar e também não requer alterações no código do lado do cliente.
  • Autenticação de passagem – O PgBouncer é um dos poucos poolers de conexão “middleware” que podem autenticar com segurança um usuário sem ter acesso às suas senhas (em texto simples ou criptografado). Isso torna o PgBouncer mais seguro e muito mais fácil de manter – você não precisa atualizar o PgBouncer toda vez que um usuário atualizar sua senha.
  • Leve – É um processo único, e todos os comandos do cliente e respostas do servidor passam pelo PgBouncer sem nenhum processamento. Portanto, ele não precisa "ver" todo o conteúdo de uma só vez e, portanto, mantém uma pegada de memória muito pequena.
  • Escalabilidade e desempenho – Como discutiremos com mais detalhes na parte final de nossa série, o PgBouncer pode melhorar significativamente as transações por segundo que seu servidor PostgreSQL pode suportar e se adapta muito bem a um número muito grande de clientes.

O que o PgBouncer não faz?

O PgBouncer, embora seja um ótimo pool de conexões, não suporta balanceamento de carga automatizado ou alta disponibilidade. Ele recomenda o uso de outras ferramentas comuns do Linux, como o HAProxy, para criar uma arquitetura que suporte esses recursos.

Dê uma olhada no exemplo de arquitetura do PostgreSQL para leituras com balanceamento de carga abaixo:

Observação – O nó mestre (que todos esses escravos estaria replicando) não é mostrado no diagrama.

Como configurar o PgBouncer

Se você tiver uma implantação do PostgreSQL do ScaleGrid, poderá configurar o PgBouncer com apenas alguns cliques. Vá para a visualização de detalhes do seu cluster PostgreSQL e clique no ícone PgBouncer. Depois de selecionar "Ativar PgBouncer", você verá opções de configuração para personalizar seu modo de pool e tamanho do pool - você pode aceitar os padrões (não se preocupe, você pode alterá-los a qualquer momento sem tempo de inatividade) e clique em Ativar!


E é isso! Você está pronto para ir.

Se você tiver uma implantação não ScaleGrid, o PgBouncer é distribuído como parte do repositório PostgreSQL e pode ser instalado usando os respectivos gerenciadores de pacotes. Para obter instruções mais detalhadas ou para criar a partir da fonte, você pode seguir as instruções do blog.

Depois de instalado, o PgBouncer exige apenas que você defina alguns parâmetros de configuração para começar a funcionar:

  1. Uma lista de (nome de usuário, senha criptografada md5) para autenticar clientes ou uma configuração de autenticação de passagem para uma implantação mais segura.
  2. Interfaces/IP:ports para escutar conexões de entrada.
  3. Definições do conjunto. Um 'pool' é um nome que os clientes usam como um nome de banco de dados ao se conectar ao PgBouncer - ele pode ser mapeado para uma string de conexão completa (host, porta, dbname e usuário). A definição mais simples é da forma:
    * = host=
    Isso criará pools dinâmicos para cada combinação dbname+user e conectará ao host definido usando a porta, dbname e username fornecidos pelo usuário.

E é isso! Você pode começar a trabalhar muito rapidamente com o PgBouncer. No entanto, existem muitas outras configurações que devem ser ajustadas para qualquer distribuição de produção – essas estão além do escopo desta postagem no blog, mas você pode ler mais sobre elas nesta visão geral das configurações do PgBouncer.

PgBouncer, no entanto, não é a única opção para o pool de conexões do PostgreSQL – em nosso próximo post, discutiremos o Pgpool-II, que provavelmente é o principal concorrente do PgBouncer. Fique atento ao nosso quarto post nesta série de quatro partes onde comparamos PgBouncer vs. Pgpool-II.