Eu tenho a seguinte configuração do postgresql 9.4 bdr:
- servidor upstream com db chamado "bdrdemo" rodando em 10.1.1.1
- servidor downstream(1) com banco de dados chamado bdrdemo rodando em 10.2.2.2 (replica com 10.1.1.1)
- servidor downstream(2) com banco de dados chamado "newname" rodando em 10.3.3.3 (replica com 10.1.1.1)
Quando configurei o servidor downstream 2, usei propositadamente um nome de banco de dados diferente para testar se os nomes dos bancos de dados são importantes. Parece que todos os dados do bdrdemo em execução no 10.1.1.1 foram copiados corretamente, mas quando faço novas alterações no upstream ou no downstream2, nada é replicado entre os dois.
Vejo um erro nos logs no servidor upstream que diz:
30 de março 19:44:38 testbox postgres[2745]: [339-1] d= p=2745 a=FATAL: 3D000: banco de dados "novo nome" não existe
O que verifiquei até agora:
Eu verifiquei a tabela bdr.bdr_nodes e ela mostra 3 entradas agora em vez das duas antes de criar o novo servidor downstream.
select * from bdr.bdr_nodes
node_sysid | node_timeline | node_dboid | node_status ---------------------+---------------+------------+------------- 6127254639323810674 | 1 | 16385 | r 6127254604756301413 | 1 | 16384 | r 6132048976759969713 | 1 | 16385 | r (3 rows) bdrdemo=#
o arquivo postgresql.conf no servidor upstream tem as seguintes configurações:
#------------------------------------------- # BDR connection configuration for upstream #------------------------------------------- bdr.connections = 'bdrdownstream,bdrdownstream2' bdr.bdrdownstream_dsn = 'dbname=bdrdemo host=10.2.2.2 user=postgres port=5432' bdr.bdrdownstream2_dsn='dbname=newname host=10.3.3.3 user=postgres port=5432'
Editar 1
Configuração do servidor downstream 1 (este servidor/nó está funcionando)
# BDR connection configuration for upstream node.
#-------------------------------------------
bdr.connections = 'bdrupstream'
bdr.bdrupstream_dsn = 'dbname=bdrdemo host=10.1.1.1 user=postgres port=5432'
bdr.bdrupstream_init_replica = on
bdr.bdrupstream_replica_local_dsn = 'dbname=bdrdemo user=postgres port=5432'
Configuração do servidor downstream 2 (este servidor/nó NÃO está funcionando)
# BDR connection configuration for upstream node.
#-------------------------------------------------
bdr.connections = 'bdrupstream'
bdr.bdrupstream_dsn = 'dbname=bdrdemo host=10.1.1.1 user=postgres port=5432'
bdr.bdrupstream_init_replica = on
bdr.bdrupstream_replica_local_dsn = 'dbname=newname user=postgres port=5432'
EDITAR 2
Depois de adicionar o nome do banco de dados local à configuração do downstream 2, reiniciei o banco de dados no downstream 2. A replicação não estava funcionando. Então eu reiniciei o servidor upstream. Ainda não vai. Então eu verifiquei os logs no downstream 2 e vejo isso:
d=newname p=16791 a=pg_restore NOTICE: 42710: extension "btree_gist" already exists, skipping
d=newname p=16791 a=pg_restore LOCATION: CreateExtension, extension.c:1208
d=newname p=16791 a=pg_restore NOTICE: 42710: extension "bdr" already exists, skipping
d=newname p=16791 a=pg_restore LOCATION: CreateExtension, extension.c:1208
d=newname p=16791 a=pg_restore NOTICE: 42710: extension "plpgsql" already exists, skipping
d=newname p=16791 a=pg_restore LOCATION: CreateExtension, extension.c:1208
d=newname p=16791 a=pg_restore ERROR: 42P07: relation "newtable" already exists
d=newname p=16791 a=pg_restore LOCATION: heap_create_with_catalog, heap.c:1056
d=newname p=16791 a=pg_restore STATEMENT: CREATE TABLE newtable (
id integer NOT NULL,
fname character varying(60),
lname character varying(60)
);
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 191; 1259 17130 TABLE newtable postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "newtable" already exists
Command was: CREATE TABLE newtable (
id integer NOT NULL,
fname character varying(60),
lname character varying(60)
);
pg_restore to dbname=newname user=postgres port=5432 fallback_application_name='bdr (6132048976759969713,1,16384,): bdrupstream: init_replica restore' options='-c bdr.do_not_replicate=on -c bdr.permit_unsafe_ddl_commands=on -c bdr.skip_ddl_replication=on -c bdr.skip_ddl_locking=on' failed, aborting
d= p=16780 a=FATAL: XX000: bdr: /usr/bin/bdr_initial_load exited with exit code 2
Quando configurei inicialmente o downstream2, ele copiou todos os dados do upstream, mas simplesmente não estava participando da replicação de novos dados/novas alterações. Então, acho que posso entender por que está falhando ao tentar criar objetos que já existem. Mas preciso excluir os dados do banco de dados do assinante e reiniciar para que a replicação funcione?
Estas informações se aplicam ao BDR 0.8 e anteriores; no BDR 0.9 o método de configuração mudou.
Se o nome do banco de dados local não for igual ao nome do banco de dados especificado no
_dsn
parâmetro para a conexão de um nó com seu upstream, você deverá especificá-lo com a_local_dbname
opção de conexão.Veja a entrada do wiki que acabei de adicionar para este parâmetro, que não estava anteriormente nos documentos.
No seu caso, no downstream 2, adicione: