Isso pode ser porque o pgpool vê essa consulta como somente leitura, mas como está realmente chamando uma função (que pode conter INSERT
UPDATE
ou DELETE
instruções) ela quebra durante a conexão com o servidor somente leitura.
Eu tenho dois nós postgres AWS RDS que fazem o backup de uma configuração pgpool no modo paralelo no EC2. Depois de usar o pgbench para preencher as tabelas de teste, obtenho um comportamento estranho das consultas de teste. Qualquer consulta que usa uma função produz o erro mencionado na linha de assunto, enquanto outras consultas funcionam conforme o esperado. Três exemplos mostrando sucesso, falha esperada e falha inesperada:
Sucesso - Fornece o conjunto de registros esperado:
psql -c "SELECT aid FROM pgbench_accounts" "host=localhost port=9999 user=pgpool password=pass dbname=bench_parallel"
# Giant record set is returned here.
Como os nós de apoio estão no RDS, a autenticação md5 é necessária. A autenticação parece estar funcionando bem no caso de consultas sem função, como pode ser visto substituindo a senha correta por uma incorreta.
Falha na autenticação esperada:
psql -c "SELECT aid FROM pgbench_accounts" "host=localhost port=9999 user=pgpool password=notmypass dbname=bench_parallel"
psql: FATAL: password authentication failed for user "pgpool"
Aqui está a parte que me confundiu - Se eu colocar uma função como min () ou count () na consulta, obtenho problemas de autenticação:
psql -c "SELECT count(aid) FROM pgbench_accounts" "host=localhost port=9999 user=pgpool password=pass dbname=bench_parallel"
ERROR: password is required
DETAIL: Non-superusers must provide a password in the connection string.
Como pode ser visto nesta última consulta, a senha é fornecida na string de conexão (para o fronteado, de qualquer forma) e é a senha correta, conforme mostrado na primeira consulta.
Por que minha primeira consulta funciona bem sem problemas de autenticação, mas a terceira falha? Eu ignorei um cenário em algum lugar?
Editar 2014-10-23: Adicionar mais informações.
Eu adicionei privilégios de superusuário ao usuário pgpool no banco de dados do sistema (frontend) e não obtenho mais Non-superusers must provide a password in the connection string
como erro. Agora eu recebo:
ERROR: could not establish connection
DETAIL: fe_sendauth: no password supplied
Ligando a depuração para pgpool e procurando no log, vejo a consulta sendo reescrita como a seguinte, que, na chamada dblink, não contém a senha especificada na string de conexão original:
2014-10-23 19:59:10 DEBUG: pid 1643: OneNode_do_command: Query: SELECT
sum(pool_g$0) AS count FROM
dblink('host=ip-10-1-2-17 dbname=bench_parallel port=9999 user=pgpool',
'SELECT pool_parallel("SELECT count(aid) FROM pgbench_accounts")',false)
AS pool_t$0g (pool_g$0 bigint )
Isso pode ser porque o pgpool vê essa consulta como somente leitura, mas como está realmente chamando uma função (que pode conter INSERT
UPDATE
ou DELETE
instruções) ela quebra durante a conexão com o servidor somente leitura.
Existe o Citus (pgShard) que deve funcionar com instâncias padrão do Amazon RDS. Tem capturas embora. Você terá um único ponto de falha se usar a versão de código aberto. O nó coordenador não é duplicado.
Você pode obter uma versão completa do failover do HA, mas é necessário comprar a licença corporativa, mas ela é muito cara. Custará facilmente US $ 50.000 a US $ 100.000 ou mais por ano.
Eles também estão REALMENTE empurrando sua versão para a nuvem agora, o que é ainda mais insanamente caro.
Existe também o Postgres-XL, mas também não tem failover. Se você perder algum nó, você perderá tudo.
Tags postgresql amazon-rds