Acabei de configurar um servidor de banco de dados PostgreSQL 9.1.2 no debian squeeze. Configurei um servidor standby (hot standby) em um segundo servidor idêntico (squeeze, PG 9.1.2).
No master eu defino estes parâmetros (postgresql.conf):
wal_level = hot_standby
archive_mode = on
archive_command = 'test ! -f /mnt/pg_replication/myserver/%f && cp %p /mnt/pg_replication/myserver/%f'
archive_timeout = 30
max_wal_senders = 3
wal_keep_segments = 100
No slave, defino os seguintes parâmetros (postgresql.conf):
hot_standby = on
No escravo (recovery.conf):
standby_mode = 'on'
primary_conninfo = 'host=master_ip port=5432 user=repluser password=xxxx'
restore_command = 'pg_standby -d -s 2 -r 30 -t /tmp/pgsql.trigger.5442 /mnt/pg_replication/myserver/ %f %p %r 2>>/var/log/standby.log'
recovery_end_command = 'rm -f /tmp/pgsql.trigger.5442'
archive_cleanup_command = '/usr/lib/postgresql/9.1/bin/pg_archivecleanup /mnt/pg_replication/myserver/ %r'
Isso funciona bem, mas notei que o atraso da replicação pode levar até 1 minuto. Existe uma maneira de reduzir o atraso para que as alterações sejam aplicadas no modo de espera para alguns segundos? Reduzi archive_timeout para 30 segundos, mas não sei se esse é o caminho certo para tornar a replicação mais rápida ...
Outra pergunta: como posso monitorar o atraso de replicação entre os dois servidores? Eu tentei a seguinte consulta no mestre, mas ela retorna 0 linhas... :-?
postgres=# SELECT * from pg_stat_replication;
(Aucune ligne)
Eu perdi alguma coisa?
obrigado Nicolas
EDIT 2012-01-03: mudei meu recovery.conf para este e agora está funcionando bem:
restore_command = 'cp /mnt/pg_replication/myserver/%f %p'
standby_mode = on
primary_conninfo = 'host=master_ip port=5432 user=repluser password=xxxx
application_name=mycluster'
trigger_file = '/tmp/trig_mycluster'
O fato de você não ter linhas em pg_stat_replication no mestre indica que sua replicação de streaming não está funcionando - e, em vez disso, caiu na replicação baseada em arquivo, que tem mais atraso.
Verifique seus logs no mestre e no escravo, eles devem informar por que não está iniciando no modo de streaming.
Além disso, seu arquivo recovery.conf está incorreto - você não deve usar pg_standby junto com standby_mode. Isso é uma sobra de pré-9,0 dias.