PgBouncer - Banco de Dados do Azure para PostgreSQL - servidor flexível

APLICA-SE A: Banco de dados do Azure para PostgreSQL – Servidor Flexível

O servidor flexível do Banco de Dados do Azure para PostgreSQL oferece o PgBouncer como uma solução interna de pooling de conexões. PgBouncer é um recurso opcional que você pode habilitar por servidor por banco de dados. Ele tem suporte em camadas de computação com Uso Geral e Otimizado para Memória em redes de acesso público e de acesso privado.

O PgBouncer é executado na mesma VM (máquina virtual) que o servidor de banco de dados do servidor flexível do Banco de Dados do Azure para PostgreSQL. O Postgres usa um modelo baseado em processo para conexões, portanto, manter muitas conexões ociosas é caro. O Postgres é executado em restrições de recurso quando o servidor executa mais de alguns milhares de conexões. O principal benefício do PgBouncer é melhorar conexões ociosas e conexões de curta duração no servidor de banco de dados.

PgBouncer usa um modelo leve que utiliza E/S assíncrona. Ele usa conexões Postgres somente quando necessário, ou seja, quando dentro de uma transação aberta ou quando uma consulta está ativa. Esse modelo permite dimensionar até 10.000 conexões com baixa sobrecarga.

O PgBouncer é executado na porta 6432 no servidor de banco de dados. Você pode alterar a configuração de conexões de banco de dados do aplicativo para usar o mesmo nome de host, mas alterar a porta para 6432 para começar a usar o PgBouncer e se beneficiar de um dimensionamento aprimorado de conexões ociosas.

O servidor flexível PgBouncer no Banco de Dados do Azure para PostgreSQL dá suporte à Autenticação do Microsoft Entra (Azure AD).

Habilitando e configurando o PgBouncer

Para habilitar o PgBouncer, acesse o painel Parâmetros do servidor no portal do Azure, pesquise por PgBouncer e altere a configuração pgbouncer.enabled para true. Não é necessário reiniciar o servidor.

Você pode definir as configurações do PgBouncer usando esses parâmetros.

Observação

A lista a seguir de parâmetros de servidor PgBouncer ficará visível no painel Parâmetros do servidor somente se o parâmetro do servidor pgbouncer.enabled estiver definido como true. Caso contrário, eles estão deliberadamente escondidos.

Nome do Parâmetro Descrição Padrão
pgbouncer.default_pool_size Defina esse valor de parâmetro para o número de conexões por par usuário/banco de dados. 50
pgbouncer.ignore_startup_parameters Insira uma lista separada por vírgulas de parâmetros que o PgBouncer pode ignorar. Por exemplo, você pode permitir que PgBouncer ignore o parâmetro extra_float_digits. Alguns parâmetros são permitidos; todos os outros geram um erro. Essa capacidade é necessária para tolerar o excesso de entusiasmo do JDBC (Conectividade de Banco de Dados Java excessiva) em querer definir extra_float_digits=2 incondicionalmente em pacotes de inicialização. Use essa opção se a biblioteca que você usa relata erros como pq: unsupported startup parameter: extra_float_digits.
pgbouncer.max_client_conn Definir esse valor de parâmetro como o número mais alto de conexões de cliente para PgBouncer que você deseja dar suporte. 5.000
pgbouncer.max_prepared_statements Quando isso é definido como um valor diferente de zero, o PgBouncer acompanha os comandos relacionados às instruções nomeadas preparadas no nível do protocolo enviadas pelo cliente no modo de instruções e pooling de instruções. 0
pgbouncer.min_pool_size Adicione mais conexões de servidor ao pool se estiver abaixo desse número. 0
pgbouncer.pool_mode Definir esse valor de parâmetro como TRANSACTION para pooling de transações (que é a configuração recomendada para a maioria das cargas de trabalho). transação
pgbouncer.query_wait_timeout Tempo máximo (em segundos) que as consultas podem levar aguardando a execução. Se a consulta não for atribuída a um servidor durante esse período, o cliente será desconectado. 120
pgbouncer.server_idle_timeout Se uma conexão de servidor estiver ociosa mais do que esses muitos segundos, ela será descartada. Se 0, o tempo limite será desabilitado. 600
pgbouncer.stats_users Lista separada por vírgulas de usuários de banco de dados que têm permissão para se conectar e executar consultas somente leitura no console do PgBouncer.

Para obter mais informações sobre as configurações do PgBouncer, consulte a documentação do pgbouncer.ini.

Versão do PgBouncer

Atualmente, a versão do PgBouncer implantada em todas as versões principais com suporte do mecanismo (16, 15, 14, 13, 12, 11) no Servidor Flexível do Banco de Dados do Azure para PostgreSQL é 1.22.1.

Benefícios

Usando o recurso PgBouncer interno com o servidor flexível do Banco de Dados do Azure para PostgreSQL, você pode obter estes benefícios:

  • Conveniência da configuração simplificada: como o PgBouncer é integrado ao servidor flexível do Banco de Dados do Azure para PostgreSQL, não há necessidade de uma instalação separada ou configuração complexa. Você pode configurá-lo diretamente dos parâmetros do servidor.

  • Confiabilidade de um serviço gerenciado: o PgBouncer oferece as vantagens dos serviços gerenciados do Azure. Por exemplo, o Azure gerencia atualizações do PgBouncer. As atualizações automáticas eliminam a necessidade de manutenção manual e garantem que o PgBouncer permaneça atualizado com os recursos mais recentes e os patches de segurança.

  • Suporte para vários tipos de conexão: o PgBouncer no servidor flexível do Banco de Dados do Azure para PostgreSQL oferece suporte para conexões públicas e privadas. Você pode usá-lo para estabelecer conexões seguras em redes privadas ou se conectar externamente, dependendo de seus requisitos específicos.

  • Alta disponibilidade em cenários de failover: se um servidor em espera for promovido à função primária durante um failover, o PgBouncer será reiniciado perfeitamente em espera recém-promovido. Você não precisa fazer nenhuma alteração na cadeia de conexão do aplicativo. Essa capacidade ajuda a garantir a disponibilidade contínua e minimiza a interrupção no pool de conexões do aplicativo.

Monitorando as Métricas do PgBouncer

Métricas

O servidor flexível do Banco de Dados do Azure para PostgreSQL fornece seis métricas para monitorar o pooling de conexões PgBouncer:

Nome de exibição ID da métrica Unidade descrição Dimensão Padrão: habilitada
Conexões de cliente ativo (versão prévia) client_connections_active Count Conexões de clientes associados a uma conexão do servidor flexível do Banco de Dados do Azure para PostgreSQL DatabaseName Não
Aguardando conexões do cliente (versão prévia) client_connections_waiting Count Conexões de clientes que estão aguardando uma conexão do servidor flexível do Banco de Dados do Azure para PostgreSQL para atendê-los DatabaseName Não
Conexões de servidor ativo (versão prévia) server_connections_active Count Conexões com o servidor flexível do Banco de Dados do Azure para PostgreSQL que uma conexão de cliente está usando DatabaseName Não
Conexões de servidor ocioso (versão prévia) server_connections_idle Count Conexões com o servidor flexível do Banco de Dados do Azure para PostgreSQL que estão ociosas e prontas para atender a uma nova conexão de cliente DatabaseName Não
Total de conexões em pool (versão prévia) total_pooled_connections Count Número atual de conexões em pool DatabaseName Não
Número de pools de conexões (versão prévia) num_pools Count Número total de pools de conexão DatabaseName Não

Para saber mais, confira as métricas do PgBouncer.

Console de administração

O PgBouncer também fornece um banco de dados interno chamado pgbouncer. Ao se conectar a esse banco de dados, você pode executar SHOW comandos que fornecem informações sobre o estado atual do PgBouncer.

Para se conectar ao banco de dados pgbouncer:

  1. Defina o parâmetro pgBouncer.stats_users como o nome de um usuário existente (por exemplo, myUser), e aplique as alterações.

  2. Conecte-se ao banco de dados pgbouncer como este usuário e defina a porta como 6432:

    psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=pgbouncer user=myUser password=myPassword sslmode=require"
    

Depois de se conectar ao banco de dados, use comandos SHOW para exibir estatísticas do PgBouncer:

  • SHOW HELP: listar todos os comandos SHOW disponíveis.
  • SHOW POOLS: mostrar o número de conexões em cada estado para cada pool.
  • SHOW DATABASES: mostrar os limites atuais de conexão aplicada para cada banco de dados.
  • SHOW STATS: mostrar estatísticas sobre solicitações e tráfego para cada banco de dados.

Para obter mais informações sobre os comandos SHOW do PgBouncer, consulte console do Administrador.

Alternando seu aplicativo para usar PgBouncer

Para começar a usar PgBouncer, siga estas etapas:

  1. Conecte-se ao servidor de banco de dados, mas use a porta 6432 em vez da porta regular 5432. Verifique se essa conexão funciona.

    psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=postgres user=myUser password=myPassword sslmode=require"
    
  2. Teste seu aplicativo em um ambiente de QA em relação ao PgBouncer para garantir que você não tenha problemas de compatibilidade. O projeto PgBouncer fornece uma matriz de compatibilidade e recomendamos o pooling de transações para a maioria dos usuários.

  3. Altere seu aplicativo de produção para se conectar à porta 6432 em vez de 5432. Monitore os erros do lado do aplicativo que possam apontar para problemas de compatibilidade.

PgBouncer em alta disponibilidade com redundância de zona

Em servidores com redundância de zona e alta disponibilidade (HA), o servidor primário executa o PgBouncer. Você pode se conectar ao PgBouncer no servidor primário pela porta 6432. Após um failover, o PgBouncer é reiniciado em espera recém-promovido, que agora é o servidor primário. Portanto, a cadeia de conexão do aplicativo permanece a mesma após o failover.

Usando PgBouncer com outros pools de conexão

Em alguns casos, talvez você já tenha um pool de conexões do lado do aplicativo ou tenha o PgBouncer configurado no lado do aplicativo (por exemplo, um sidecar do Serviço de Kubernetes do Azure). Nesses casos, o recurso interno do PgBouncer ainda pode ser útil porque oferece os benefícios do dimensionamento de conexão ocioso.

O uso de um pool do lado do aplicativo junto com o PgBouncer no servidor de banco de dados pode ser benéfico. Aqui, o pool do lado do aplicativo traz o benefício da latência de conexão inicial reduzida (porque a viagem de ida e volta para inicializar a conexão é muito mais rápida) e o PgBouncer do lado do banco de dados fornece dimensionamento de conexão ocioso.

Limitações

  • No momento, não há suporte para o recurso PgBouncer com a camada de computação do servidor com capacidade de intermitência. Se você alterar a camada de computação de Uso Geral ou Otimizado para Memória Otimizada para Com capacidade de intermitência, perderá a funcionalidade interna do PgBouncer.

  • Sempre que o servidor é reiniciado durante operações de escala, failover de HA ou uma reinicialização, o PgBouncer e a VM também são reiniciados. Em seguida, você precisa restabelecer as conexões existentes.

  • O portal não mostra todos os parâmetros PgBouncer. Depois de habilitar o PgBouncer e salvar os parâmetros, você precisará fechar o painel Parâmetros do servidor (por exemplo, selecione Visão Geral) e, em seguida, volte para o painel Parâmetros do servidor.

  • Você não pode usar os modos de pool de instruções junto com instruções preparadas. A versão atual do PgBouncer adicionou suporte para instruções preparadas dentro do modo de transação. Esse suporte pode ser habilitado e configurado por meio do parâmetro max_prepared_statements. A definição desse parâmetro acima do valor padrão de 0 ativará o suporte para instruções preparadas. Esse suporte só se aplica às instruções preparadas de nível do protocolo. Na maioria das linguagens de programação, isso significa que estamos usando a função libpq do PQprepare no cliente, enviando comandos de nível de protocolo que o PgBouncer pode interceptar, em vez de emitir um comando SQL dinâmico semelhante a PREPARE proc AS, que envia textos que o PgBouncer não interpretará corretamente. Para verificar outras limitações do modo de pool escolhido, consulte a documentação do PgBouncer.

  • Se o PgBouncer for implantado como um recurso, ele se tornará um possível ponto único de falha. Se o recurso PgBouncer estiver inativo, ele poderá interromper todo o pool de conexões de banco de dados e causar tempo de inatividade para o aplicativo. Para atenuar o único ponto de falha, você pode configurar várias instâncias PgBouncer por trás de um balanceador de carga para alta disponibilidade em VMs do Azure.

  • Restrição de Tamanho de Token com Autenticação do AAD – os usuários com um grande número de associações de grupo não poderão se conectar por meio do PgBouncer devido a uma restrição de tamanho de token. Aplicativos, serviços e usuários com um pequeno número de grupos funcionam.

  • PgBouncer é um aplicativo leve que usa uma arquitetura de thread único. Esse design é ótimo para a maioria das cargas de trabalho do aplicativo. Mas em aplicativos que criam um grande número de conexões de curta duração, esse design pode afetar o desempenho do PgBouncer e limitar sua capacidade de dimensionar seu aplicativo. Talvez seja necessário experimentar uma destas abordagens:

    • Distribua a carga de conexão entre várias instâncias do PgBouncer em VMs do Azure.
    • Considere soluções alternativas, incluindo soluções multithreaded como PgCat, em VMs do Azure.

Importante

O parâmetro pgbouncer.client_tls_sslmode para o recurso PgBouncer interno foi preterido no servidor flexível do Banco de Dados do Azure para PostgreSQL.

Quando o TLS/SSL para conexões com o servidor flexível do Banco de Dados do Azure para PostgreSQL é imposto por meio da configuração do parâmetro de servidor require_secure_transport como ON, o TLS/SSL é automaticamente imposto para conexões com o recurso Interno PgBouncer. Essa configuração está ativada por padrão quando você cria uma nova instância de servidor flexível do Banco de Dados do Azure para PostgreSQL e habilita o recurso interno PgBouncer. Para obter mais informações, consulte Visão geral de rede do Banco de Dados do Azure para PostgreSQL – Servidor Flexível com acesso privado.

Para clientes que desejam gerenciamento simplificado, alta disponibilidade interna, conectividade fácil com aplicativos em contêineres e a capacidade de usar os parâmetros de configuração mais populares, o recurso Interno PgBouncer é uma boa opção. Para clientes que desejam escalabilidade multithreaded, controle total de todos os parâmetros e uma experiência de depuração, configurar o PgBouncer em VMs do Azure pode ser uma alternativa.

Próximas etapas