Pool de conexões do Snowflake Postgres

Um pool de conexões é um cache de conexões de banco de dados que podem ser reutilizadas. Quando uma solicitação vem de um cliente, uma conexão disponível do pool é fornecida para essa solicitação ou transação.

Por outro lado, sem nenhum pool de conexões, o cliente precisa entrar acessar o banco de dados para estabelecer uma conexão. A abertura de novas conexões pode afetar a disponibilidade e o desempenho. No PostgreSQL, o servidor «bifurca» ou cria um novo processo e pode utilizar os recursos disponíveis e impedir o estabelecimento de novas conexões. O pool de conexões ajuda a atenuar esses problemas e garantir que seus aplicativos possam ser dimensionados.

Eu preciso de um pool de conexões?

O pool de conexões é especialmente útil quando você tem um alto número de conexões do seu aplicativo, muitas vezes em um pool do lado do cliente ou por meio de vários threads/processos do seu servidor web.

Você pode executar a seguinte consulta em sua instância do Snowflake Postgres para determinar se o pool de conexões é útil no seu caso:

SELECT count(*),
       state
FROM pg_stat_activity
GROUP BY 2;
Copy
 count |             state
-------+-------------------------------
     7 | active
    69 | idle
    26 | idle in transaction
    11 | idle in transaction (aborted)
(4 rows)

Se você observar um alto número de conexões ociosas em relação às ativas, o uso do pool de conexões é altamente recomendado.

Pool de conexões com PgBouncer

O Snowflake Postgres usa o pgBouncer para o pool de conexões. Por padrão, o PgBouncer é disponibilizado em todas as instâncias do Snowflake Postgres para facilitar o gerenciamento de conexões por meio da multiplexação das conexões nativas do Postgres através de suas próprias conexões «virtuais». Por padrão, as instâncias do PgBouncer no Snowflake Postgres são executadas no modo de pool de transações.

Entretanto, para usar o serviço PgBouncer, você deve executar uma etapa extra em cada banco de dados no qual deseja usá-lo instalando a extensão snowflake_pooler.

Ativando o PgBouncer com a extensão snowflake_pooler

Como usuário snowflake_admin Postgres, execute o seguinte comando no banco de dados para instalar a extensão snowflake_pooler:

CREATE EXTENSION snowflake_pooler;
Copy

O que é snowflake_pooler?

snowflake_pooler é uma extensão simples que cria um usuário chamado snowflake_pooler. Esse usuário tem acesso a uma única função chamada user_lookup que permite ao PgBouncer autenticar conexões recebidas. Dessa forma, quando um cliente faz uma conexão com o PgBouncer, ele verifica se as credenciais do cliente são válidas consultando o repositório de usuários canônicos do Postgres.

Nota

A extensão snowflake_pooler deve ser instalada individualmente em cada banco de dados em que você deseja se conectar através do PgBouncer. Se snowflake_pooler não tiver sido instalado, você poderá receber um erro como:

failed: FATAL: bouncer config error

Para resolver o erro, conecte-se ao banco de dados e execute: CREATE EXTENSION snowflake_pooler;.

Conectando ao PgBouncer

Os clientes se conectam ao PgBouncer usando a mesma cadeia de conexão usada para o banco de dados Postgres principal, com exceção da porta 5431 em vez da 5432 habitual:

psql postgres://my_application_user:my_application_password@p.43lmodgbqvdmlpbjirv22dfciu.db.postgresbridge.com:5431/mydb
Copy

Somente funções sem privilégios de superusuário ou replicação podem se conectar por meio do PgBouncer. Você pode se conectar ao PgBouncer usando a função application, uma função de usuário individual criada para membros da equipe, ou qualquer função de usuário personalizada que você possa ter criado (por exemplo, usando o comando CREATE ROLE do Postgres). No entanto, a função user_lookup criada por snowflake_pooler negará pesquisas em funções de superusuários e de replicação. Consulte Funções do Snowflake Postgres para saber mais sobre usuários e funções do Postgres no Snowflake Postgres.

Dica

Os termos «usuário» e «função» no Postgres são em grande parte sinônimos. Uma pequena diferença é que CREATE USER (em comparação com CREATE ROLE) implica no atributo LOGIN, por exemplo, CREATE ROLE myuser LOGIN;.

Modos de pool

O PgBouncer oferece suporte a três modos de pool diferentes: transação, sessão e instrução. Cada um está detalhado brevemente abaixo e em mais detalhes na Documentação do PgBouncer.

Transação

Por padrão, as instâncias do Snowflake Postgres executam o PgBouncer no modo de pool de transações, já que esse é o modo que recomendamos à maioria das pessoas.

Nota

Quando o PgBouncer está no modo de pool de transações, as instruções preparadas no nível do SQL criadas com PREPARE e executados com EXECUTE em transações diferentes não funcionam, pois elas podem ser executadas em conexões de servidor distintas. O PgBouncer, porém, oferecerá suporte a transações preparadas no nível do protocolo se o driver Postgres do aplicativo for compatível com elas. Para obter mais detalhes sobre como o PgBouncer faz isso, consulte a documentação sobre max_prepared_statements.

Para usar o suporte do PgBouncer para instruções preparadas no nível do protocolo, a configuração de max_prepared_statements do PgBouncer deve ser definida como um valor maior que 0. O padrão no Snowflake Postgres é 250, mas é possível defini-lo com outro valor, se desejar.

Sessão

O modo de pool de sessões é compatível com o Snowflake Postgres, se você precisar dele. Para usar esse modo de pool, defina a configuração pool_mode como session em seu cluster.

Instrução

O modo de pool de instruções também está disponível. No entanto, observe que as transações com múltiplas instruções emitirão erros. Para usar esse modo de pool, defina a configuração pool_mode como statement em seu cluster.

Desativação da PgBouncer

Descartar a extensão snowflake_pooler de um banco de dados desabilitará as funções do PgBouncer, pois ele não poderá mais autenticar:

DROP EXTENSION snowflake_pooler;
Copy