Pular para o conteúdo principal

Utilize o agrupamento de conexões.

info

Beta

A partir de 15 de junho, o Lakebase está disponível em Beta no GCP. Consulte Disponibilidade regional para regiões compatíveis.

Lakebase inclui um gerenciador de conexões PgBouncer integrado que mantém um pool de conexões de servidor e as compartilha entre várias conexões de clientes. O pool de conexões suporta até 10.000 conexões simultâneas de clientes, sendo uma boa opção para funções serverless , APIs da web e outras aplicações que abrem muitas conexões de curta duração.

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

Como funciona o agrupamento de conexões​

Cada conexão Postgres consome recursos do servidor porque o Postgres cria um processo separado para cada cliente. À medida que o número de conexões simultâneas aumenta, o limite de conexões do servidor pode se esgotar rapidamente.

O gerenciador de conexões fica entre sua aplicação e o Postgres. Os clientes se conectam ao pooler, e o pooler encaminha as consultas para um pool menor de conexões reais do servidor. Lakebase executa o PgBouncer em modo transacional, portanto, uma conexão com o servidor é mantida apenas durante a duração de uma única transação e, em seguida, devolvida ao pool. Isso permite que muitos clientes compartilhem um pequeno pool de conexões de servidor.

Piscina de conexões​

O PgBouncer cria um pool separado para cada combinação de banco de dados e usuário. Dois usuários que se conectam ao mesmo banco de dados obtêm pools independentes. O tamanho de cada pool é aproximadamente 90% do limite do Postgres max_connections , que varia de acordo com o tamanho compute .

Quando todas as conexões em um pool estão em uso, as novas solicitações do cliente ficam aguardando em uma fila. Se uma conexão com o servidor não estiver disponível em 2 minutos, o cliente recebe um erro de tempo limite excedido.

Diagrama mostrando o roteamento de múltiplas conexões de clientes através do PgBouncer para pools separados por usuário e por banco de dados, que compartilham um número limitado de conexões diretas com o Postgres, limitado por max_connections.

O diagrama mostra como várias conexões de clientes de diferentes usuários são roteadas por meio de pools PgBouncer separados (um para cada combinação de usuário/banco de dados), que compartilham um número limitado de conexões Postgres reais.

Limites de conexão​

Três limites regem o agrupamento de conexões:

Limite

Valor

O que ele controla

Conexões de clientes (max_client_conn)

10.000

Conexões máximas do seu aplicativo para o PgBouncer

tamanho da piscina (default_pool_size)

~90% de max_connections

Conexões de servidor ativas por par (usuário, banco de dados)

Conexões diretas (max_connections)

Varia de acordo com o tamanho compute .

Número máximo de conexões diretas com o Postgres

Limite

Valor

O que ele controla

Conexões de clientes (max_client_conn)

10.000

Conexões máximas do seu aplicativo para o PgBouncer

tamanho da piscina (default_pool_size)

~90% de max_connections

Conexões de servidor ativas por par (usuário, banco de dados)

Conexões diretas (max_connections)

Varia de acordo com o tamanho compute .

Número máximo de conexões diretas com o Postgres

O limite de conexões diretas depende da capacidade compute da sua empresa. Por exemplo, um compute 8 CUs suporta 1.678 conexões diretas e um compute 16 CUs suporta 3.357. Para a lista completa, consulte as especificações de computação.

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

Ativar o agrupamento de conexões​

Pré-requisitos​

  • Seu projeto Lakebase deve estar ativo.
  • Você precisa ter uma função nativa de senha do Postgres no projeto. Para obter instruções, consulte Criar uma função de senha nativa do Postgres.
  • Para usar o pool de conexões com instâncias compute somente leitura, você precisa ter um endpoint de alta disponibilidade com a opção "Permitir acesso a instâncias compute somente leitura" habilitada. Veja Alta disponibilidade.

os passos​

  1. No aplicativo Lakebase, acesse seu projeto e clique em Conectar .
  2. Selecione a filial e compute aos quais deseja se conectar.
  3. Na lista suspensa "Função" , selecione uma função de senha nativa do Postgres. A opção de agrupamento de conexões só fica visível quando uma função de senha é selecionada. Está oculto para funções OAuth.
  4. Ative o agrupamento de conexões .
  5. Copie as strings de conexão e utilize-as em sua aplicação.

Diálogo de conexão mostrando a opção de agrupamento de conexões ativada para uma função de senha nativa do Postgres.

Formatos de cadeias de conexão​

strings de conexão do Pooler usam um hostname diferente das conexões diretas com o banco de dados. O hostname inclui -pooler após o ID endpoint para compute de leitura e gravação, ou -ro-pooler para compute somente leitura:

Tipo de Compute

formato de nome de host

Quando usar

computede leitura e escrita

<endpoint-id>-pooler.<region>.<cloud>.databricks.com

Todo o tráfego de leitura e escrita

computesomente leitura

<endpoint-id>-ro-pooler.<region>.<cloud>.databricks.com

Somente leitura de tráfego. Requer um endpoint de alta disponibilidade com acesso de leitura habilitado.

Tipo de Compute

formato de nome de host

Quando usar

computede leitura e escrita

<endpoint-id>-pooler.<region>.<cloud>.databricks.com

Todo o tráfego de leitura e escrita

computesomente leitura

<endpoint-id>-ro-pooler.<region>.<cloud>.databricks.com

Somente leitura de tráfego. Requer um endpoint de alta disponibilidade com acesso de leitura habilitado.

Ambos utilizam a porta 5432.

nota

Copie as strings de conexão do pooler diretamente da caixa de diálogo Conectar no aplicativo Lakebase para obter o hostname correto para seu endpoint, região e cloud.

Configuração do PgBouncer​

Lakebase gerencia PgBouncer com as seguintes configurações. Essas configurações são fixas e não podem ser personalizadas.

ini
[pgbouncer]
pool_mode=transaction
max_client_conn=10000
default_pool_size=0.9 * max_connections
max_prepared_statements=1000
query_wait_timeout=120

Contexto

Descrição

pool_mode=transaction

As conexões do servidor retornam ao pool após cada transação. Consulte o modo de transação.

max_client_conn=10000

Número máximo de conexões simultâneas de clientes que o PgBouncer aceita.

default_pool_size=0.9 * max_connections

Conexões ativas do servidor por par (usuário, banco de dados). Varia de acordo com o tamanho compute .

max_prepared_statements=1000

Permite instruções preparadas em nível de protocolo no modo de transação. Limita o número de declarações rastreadas a 1.000 por conexão de cliente.

query_wait_timeout=120

Segundos que um cliente aguarda por uma conexão com o servidor antes de receber um erro de tempo limite.

Contexto

Descrição

pool_mode=transaction

As conexões do servidor retornam ao pool após cada transação. Consulte o modo de transação.

max_client_conn=10000

Número máximo de conexões simultâneas de clientes que o PgBouncer aceita.

default_pool_size=0.9 * max_connections

Conexões ativas do servidor por par (usuário, banco de dados). Varia de acordo com o tamanho compute .

max_prepared_statements=1000

Permite instruções preparadas em nível de protocolo no modo de transação. Limita o número de declarações rastreadas a 1.000 por conexão de cliente.

query_wait_timeout=120

Segundos que um cliente aguarda por uma conexão com o servidor antes de receber um erro de tempo limite.

Modo de transação​

O modo de transação melhora a eficiência da conexão, mas restringe certos recursos do Postgres que exigem uma conexão persistente com o servidor. Os seguintes recursos não estão disponíveis ao usar o pool de conexões:

  • Instruções preparadas em nível SQL : as instruções PREPARE e DEALLOCATE não são suportadas no modo de transação. As instruções preparadas em nível de driver (usadas internamente pelo psycopg, node-postgres, JDBC e bibliotecas similares) funcionam corretamente graças ao suporte em nível de protocolo do PgBouncer. Para JDBC, se você vir erros relacionados a instruções preparadas, defina prepareThreshold=0 para desativar o cache de instruções preparadas nomeadas do lado do servidor.

  • Configurações de nível de sessão : o comando SET não persiste entre transações porque cada transação pode usar uma conexão de servidor diferente. Por exemplo:

    SQL
    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 configuração permanentemente, use ALTER ROLE em vez disso:

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

  • CursoresWITH HOLD : Cursores declarados com WITH HOLD requerem uma conexão persistente e não são suportados.

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

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

  • pg_dump e migrações de esquema : Use uma conexão direta para pg_dump, migrações de esquema e outras ferramentas que dependem do estado em nível de sessão.

nota

Para aplicações que requerem recursos do Postgres em nível de sessão, utilize strings de conexão diretas a partir da caixa de diálogo Conectar , sem habilitar a opção de pool de conexões .