Utilizar o pool de conexões

O Lakebase inclui um pooler de ligações PgBouncer incorporado que mantém um pool de ligações de servidor e as partilha entre várias ligações de clientes. O agregador de ligações suporta até 10 000 ligações simultâneas de clientes, sendo por isso uma boa solução para funções serverless, APIs da Web e outras aplicações que abrem muitas ligações de curta duração.

O agrupamento de ligações requer autenticação por palavra-passe nativa do Postgres. Não está disponível para funções OAuth.

Como funciona o pool de conexões

Cada ligação Postgres consome recursos do servidor porque o Postgres cria um processo separado para cada cliente. À medida que as ligações simultâneas crescem, podem esgotar rapidamente o limite de ligação do servidor.

O pooler de conexão fica entre a tua aplicação e o Postgres. Os clientes ligam-se ao pooler, e o pooler encaminha as consultas para um pool mais pequeno de ligações reais ao servidor. O Lakebase executa o PgBouncer em modo de transação, pelo que uma ligação ao servidor é mantida apenas durante a duração de uma única transação e depois devolvida ao pool. Isto permite que muitos clientes partilhem um pequeno conjunto de ligações ao servidor.

Pools de conexões

O PgBouncer cria um pool separado para cada base de dados e combinação de utilizadores. Dois utilizadores que se ligam à mesma base de dados obtêm pools independentes. O tamanho de cada pool é aproximadamente 90% do limite do Postgres max_connections , que varia consoante o tamanho do cálculo.

Quando todas as ligações de um pool estão em uso, novos pedidos de clientes aguardam numa fila. Se uma ligação ao servidor não ficar disponível dentro de 2 minutos, o cliente recebe um erro de timeout.

Diagrama mostrando múltiplas ligações de cliente a encaminhar através do PgBouncer para pools separados por utilizador e por base de dados, que partilham um número limitado de ligações diretas Postgres limitadas por max_connections.

O diagrama mostra como múltiplas ligações de clientes de diferentes utilizadores passam por pools PgBouncer separados (uma por combinação utilizador/base de dados), que partilham um número limitado de ligações Postgres reais.

Limites de ligação

Três limites regem o agrupamento de ligações:

Limite Value O que controla
Ligações com clientes (max_client_conn) 10.000 Ligações máximas da sua aplicação com o PgBouncer
Tamanho da piscina (default_pool_size) ~90% de max_connections Ligações ativas de servidor por par (utilizador, base de dados)
Ligações diretas (max_connections) Varia consoante o tamanho do cálculo Ligações diretas máximas da Postgres

O limite de ligação direta depende do tamanho do seu cálculo. Por exemplo, uma unidade de computação de 8 CU suporta 1.678 ligações diretas e uma unidade de computação de 16 CU suporta 3.357. Para a lista completa, veja Especificações de Computação.

O limite de 10.000 ligações de clientes não significa 10.000 resultados simultâneos de consultas. Representa o número máximo de ligações de clientes que o PgBouncer aceita. O número de transações ativas concorrentes é limitado pelo tamanho do pool, que é aproximadamente 90% de max_connections.

Permitir o agrupamento de ligações

Pré-requisitos

  • O seu projeto de Autoscaling da Lakebase tem de estar ativo.
  • É necessário ter uma função de senha nativa do Postgres no projeto. Para instruções, consulte Criar uma palavra-passe nativa do Postgres.
  • Para usar o agrupamento de ligações com instâncias de computação só de leitura, tem de ter um endpoint de alta disponibilidade com Permitir acesso a instâncias de computação só de leitura ativado. Ver Alta disponibilidade.

Steps

  1. Na aplicação Lakebase, aceda ao seu projeto e clique em Conectar.
  2. Seleciona o ramo e a computação a que te queres ligar.
  3. No menu suspenso de Funções , selecione uma função nativa de palavra-passe Postgres. O comutador de agrupamento de ligações só é visível quando é selecionado um perfil com palavra-passe. Está oculto para as funções OAuth.
  4. Ativar pool de conexões.
  5. Copia a cadeia de ligação e usa-a na tua aplicação.

Diálogo de ligação que mostra a opção de conjunto de ligações ativada para uma função nativa de palavra-passe do Postgres.

Formatos de cadeia de conexão

As cadeias de ligação do pooler usam um nome de host diferente das ligações diretas à base de dados. O nome do host inclui -pooler , após o ID do endpoint, para computação de leitura-escrita, ou -ro-pooler para computação apenas de leitura:

Tipo de computação Formato do nome do anfitrião Quando utilizar
Computação de leitura e escrita <endpoint-id>-pooler.<region>.<cloud>.databricks.com Todo o tráfego de escrita e de leitura
Computação só de leitura <endpoint-id>-ro-pooler.<region>.<cloud>.databricks.com Leia apenas trânsito. Requer um endpoint de alta disponibilidade com acesso de leitura ativado.

Ambos usam a porta 5432.

Note

Copie o seu pooler cadeia de ligação diretamente do diálogo Connect na aplicação do Lakebase para obter o nome de host correto para o endpoint, região e nuvem.

Configuração do PgBouncer

A Lakebase gere o PgBouncer com as seguintes definições. Estas definições são fixas e não podem ser personalizadas.

[pgbouncer]
pool_mode=transaction
max_client_conn=10000
default_pool_size=0.9 * max_connections
max_prepared_statements=1000
query_wait_timeout=120
Setting Descrição
pool_mode=transaction As ligações ao servidor regressam ao pool após cada transação. Ver modo de transação.
max_client_conn=10000 Número máximo de ligações simultâneas de clientes aceites pelo PgBouncer.
default_pool_size=0.9 * max_connections Ligações ativas ao servidor por par (utilizador, base de dados). Varia consoante o tamanho do cálculo.
max_prepared_statements=1000 Permite instruções preparadas ao nível do protocolo em modo de transação. Limita as instruções rastreadas a 1.000 por ligação de cliente.
query_wait_timeout=120 Número de segundos que um cliente espera por uma conexão ao servidor antes de ocorrer um erro de tempo limite.

Modo de transação

O modo de transação melhora a eficiência da ligação, mas restringe certas funcionalidades do Postgres que requerem uma ligação persistente ao servidor. As seguintes funcionalidades não estão disponíveis ao usar o connection pooler:

  • Instruções preparadas ao nível SQL: PREPARE e DEALLOCATE instruções não são suportadas em modo de transação. As instruções preparadas ao nível do controlador (usadas internamente por psycopg, node-postgres, JDBC e bibliotecas semelhantes) funcionam corretamente através do suporte de protocolo do PgBouncer. Para JDBC, se vires erros relacionados com instruções preparadas, configura prepareThreshold=0 para desativar a cache de instruções preparadas nomeadas do lado do servidor.

  • Definições ao nível da sessão: SET os comandos não persistem entre transações porque cada transação pode usar uma ligação diferente ao servidor. Por exemplo:

    BEGIN;
    SET search_path TO myschema;
    SELECT * FROM mytable; -- works in this transaction
    COMMIT;
    -- connection returns to pool after COMMIT
    SELECT * FROM mytable; -- ERROR: relation "mytable" does not exist
    

    Para aplicar uma definição permanentemente, use ALTER ROLE em vez disso:

    ALTER ROLE myrole SET search_path TO myschema, public;
    
  • Tabelas temporárias realizadas em sessões: Tabelas temporárias que persistem entre transações não estão disponíveis. Uma ligação devolvida ao pool pode ser atribuída a um cliente diferente na próxima transação.

  • WITH HOLD cursores: Os cursores declarados com WITH HOLD requerem uma ligação persistente e não são suportados.

  • Bloqueios de aviso: O PgBouncer não suporta bloqueios de aviso. Os bloqueios de aviso exigem uma ligação persistente ao servidor, que não está disponível no modo de transação.

  • LISTEN/NOTIFY: Não suportado. Utilize uma ligação direta (não partilhada) para aplicações que requerem mensagens de publicação/assinatura.

  • pg_dump e migrações de esquema: Use uma ligação direta para pg_dump, migrações de esquema e outras ferramentas que dependam do estado ao nível da sessão.

Note

Para aplicações que requerem funcionalidades do Postgres ao nível da sessão, use uma cadeia de ligação direta da caixa de diálogo Connect, sem ativar o interruptor Connection pooling.