Recentemente, comecei a aprender sobre o pgbouncer, mas há algumas coisas que não entendo sobre o parâmetro server_reset_query
.
Pergunta 1: Qual é o objetivo principal do server_reset_query
?
Questão 2: Existem três modos do pool_mode do pgbouncer: sessão, transação e modo de declaração. Quando o pool_mode é sessão, geralmente definimos os valores de
server_reset_query como 'DISCARD ALL'. Quando o pool_mode é uma transação, geralmente definimos os valores de server_reset_query como '',
Eu não sei os detalhes sobre isso, então alguém pode explicar isso?
Como o pgbouncer é um pooler de conexões, ele reutilizará uma conexão real com o servidor de banco de dados para potencialmente muitas conexões de clientes. Ele precisa garantir que qualquer estado de sessão criado pelo primeiro cliente seja redefinido quando o próximo cliente obtiver a conexão. Caso contrário, o primeiro cliente pode fazer algo como
SET statement_timeout = '5min'
, e isso se aplicaria a todos os clientes subsequentes que receberem essa conexão. Para evitar isso, o pgbouncer emite a "consulta de redefinição do servidor" antes de entregar a conexão do servidor a um novo cliente. Como diz a documentaçãoA principal razão pela qual essa configuração existe é que a
DISCARD ALL
instrução, que foi inventada para esse propósito, não estava disponível antes do PostgreSQL 8.3.A configuração se aplica independentemente do modo de piscina. Observe que o cliente pode emitir uma
SET
instrução ou algo parecido em qualquer modo de pool.A documentação também diz
Eu acho que esta é uma abordagem baseada na fé. Se você acha que seu código está limpo e precisa de desempenho extra, vá em frente. Eu fui mordido por isso, no entanto. Por exemplo, se você usar check_postgres para monitorar suas conexões pgbouncer, ele emitirá um
SET statement_timeout
como eu mostrei acima e bagunçará suas conexões.Eu pesquisei e pesquisei no yahoo e cheguei a esta breve definição:
server_reset_query
Apenas pelo nome do parâmetro,
server_reset_query
, é uma consulta que redefine o servidor de alguma forma. Pelas definições e exemplos que vi no google, yahoo e postgresql.org, parece ser uma diretiva que emite uma ou mais consultas para reciclar conexões e recursos associados.IMHO, não parece haver muita explicação por trás desta diretiva, exceto para ver exemplos de seu uso. Tais exemplos incluem:
Examine o máximo de exemplos dessa configuração que puder encontrar. Anote as consultas anexadas
server_reset_query
e descubra o que essas consultas individuais fazem. Então, o propósito deserver_reset_query
ficará mais claro para você.Mais exemplos disponíveis aqui: http://pgbouncer.projects.postgresql.org/doc/faq.html
Se houver algum usuário do pgBouncer por aí no DBA.SE, por favor, acione. Eu mesmo sou apenas um DBA nominal do PostgreSQL.