Replicando banco de dados PostgreSQL

Nesse artigo será descrito o processo de como fazer replicação de dados PostgreSQL usando a ferramenta Slony. O Slony inclusive suporta múltiplos masters. Também é interessante observar que a replicação de dados através dessa ferramenta pode ser feita entre versão 7 e 8 do PostgreSQL sem problemas, podendo ser usado para migrar os dados da versão 7 para 8 de forma bastante simples.

[ Hits: 68.275 ]

Por: Rafael Donato em 09/05/2006


Criando os scripts necessários



Crie o script estabelece_comunicacao_replicacao.sh, com o seguinte conteúdo, e rode no servidor master:

#!/bin/sh

slonik <<_EOF_
   #--
   # define the namespace the replication system uses in our example it is
   # slony_example
   #--
   cluster name = $CLUSTERNAME;

   #--
   # admin conninfo's are used by slonik to connect to the nodes one for each
   # node on each side of the cluster, the syntax is that of PQconnectdb in
   # the C-API
   # --
   node 1 admin conninfo = 'dbname=$MASTERDBNAME host=$MASTERHOST user=$REPLICATIONUSER';
   node 2 admin conninfo = 'dbname=$SLAVEDBNAME host=$SLAVEHOST user=$REPLICATIONUSER';

   #--
   # init the first node.  Its id MUST be 1.  This creates the schema
   # _$CLUSTERNAME containing all replication system specific database
   # objects.

   #--
   init cluster ( id=1, comment = 'Master Node');

   #--
   # Slony-I organizes tables into sets.  The smallest unit a node can
   # subscribe is a set.  The following commands create one set containing
   # all 4 pgbench tables.  The master or origin of the set is node 1.
   #--
   create set (id=1, origin=1, comment='All pgbench tables');
   set add table (set id=1, origin=1, id=1, fully qualified name = 'public.tabela1', comment='Descrição Tabela 1');
   set add table (set id=1, origin=1, id=2, fully qualified name = 'public.tabela2', comment='Descrição Tabela 2');
   set add table (set id=1, origin=1, id=3, fully qualified name = 'public.tabela3', comment='Descrição Tabela 3');
   set add table (set id=1, origin=1, id=4, fully qualified name = 'public.tabela4', comment='Descrição Tabela 4', key = serial);

   #--
   # Create the second node (the slave) tell the 2 nodes how to connect to
   # each other and how they should listen for events.
   #--

   store node (id=2, comment = 'Slave node');
   store path (server = 1, client = 2, conninfo='dbname=$MASTERDBNAME host=$MASTERHOST user=$REPLICATIONUSER');
   store path (server = 2, client = 1, conninfo='dbname=$SLAVEDBNAME host=$SLAVEHOST user=$REPLICATIONUSER');
   store listen (origin=1, provider = 1, receiver =2);
   store listen (origin=2, provider = 2, receiver =1);
_EOF_

Depois sete a permissão:

# chmod u+x estabelece_comunicacao_replicacao.sh

Note que é preciso alterar as linhas que contém "set add table" para as tabelas que fazem parte do seu banco.

Agora para estabelecer um canal de comunicação entre os servidor do cluster faça no master:

# slon $CLUSTERNAME "dbname=$MASTERDBNAME user=$REPLICATIONUSER host=$MASTERHOST"

E no slave:

# slon $CLUSTERNAME "dbname=$SLAVEDBNAME user=$REPLICATIONUSER host=$SLAVEHOST"

Nesse ponto a replicação ainda não está acontecendo, para poder dar início à replicação propriamente dita, abra outro terminal (pois o terminal do master que você estava usando estará ocupado com o último comando dado, slon) crie o script replicacao_start.sh com o seguinte conteúdo:

#!/bin/sh
slonik <<_EOF_
    # ----
    # This defines which namespace the replication system uses
    # ----
    cluster name = $CLUSTERNAME;

    # ----
    # Admin conninfo's are used by the slonik program to connect
    # to the node databases.  So these are the PQconnectdb arguments
    # that connect from the administrators workstation (where
    # slonik is executed).
    # ----
    node 1 admin conninfo = 'dbname=$MASTERDBNAME host=$MASTERHOST user=$REPLICATIONUSER';
    node 2 admin conninfo = 'dbname=$SLAVEDBNAME host=$SLAVEHOST user=$REPLICATIONUSER';

    # ----
    # Node 2 subscribes set 1
    # ----
    subscribe set ( id = 1, provider = 1, receiver = 2, forward = no);
_EOF_

Depois sete a permissão:

# chmod u+x replicacao_start.sh

Então execute esse script no servidor master e pronto! Os dados começarão a ser copiados e a replicação estará acontecendo.

Página anterior     Próxima página

Páginas do artigo
   1. Instalação
   2. Configurações necessárias
   3. Criando os scripts necessários
   4. Finalizando
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Autenticação no PostgreSQL - com exemplos

Partição de tabelas no PostgreSQL

Programando PostgreSQL + PHP

PostgreSQL básico - Testado e pronto para ser usado

PostGIS no Slackware

  
Comentários
[1] Comentário enviado por epgielow em 09/05/2006 - 16:12h

Otimo artigo, parabens!

[2] Comentário enviado por joaocosme em 09/05/2006 - 16:14h

eu vo ter q setar tabela por tabela q ira ser replicada?

[3] Comentário enviado por rdal em 09/05/2006 - 16:28h

à pergunta de joaocosme, sim.

[4] Comentário enviado por rdal em 09/05/2006 - 16:28h

No script é necessário explicitar todas as tabelas que irão participar do processo de replicação. Respondendo à pergunta de joaocosme, sim.

[5] Comentário enviado por kurt3dfx em 03/07/2006 - 14:05h

Pessoal o meu scritp estabelece_comunicacao_replicacao.sh está dando este erro :
<stdin>:43: ERROR: syntax error at or near _EOF_

Alguem sabe me explicar o que pode ser ?

[6] Comentário enviado por kurt3dfx em 03/07/2006 - 14:19h

resolvi hehe coisa de noob mesmo xD

só uma coisa agora
eu tenho um schema public e quando eu monto o script ele cria um _public com umas tabelas lá... o schema não seria o das tabelas ?

[7] Comentário enviado por kurt3dfx em 03/07/2006 - 15:55h

ja consegui tb !!! :DDDDDDDDDDD

[8] Comentário enviado por rdal em 04/07/2006 - 01:49h

Não, ele cria um esquema separado para a replicação.
:)

[9] Comentário enviado por kurt3dfx em 06/07/2006 - 11:48h

cara, como que automatiza isso na inicialização do servidor ? so o script não inicia... tem q ter o slon configurado

[10] Comentário enviado por kurt3dfx em 10/07/2006 - 12:21h

hein rdal, o ./replicacao_start é pra iniciar a replicação independente de dar um slon no console nao é ?? só que ele não inicia
dá uma luz ae :D
tranks

[11] Comentário enviado por diegotolentino em 01/08/2006 - 09:37h

Seu artigo é otimo e estou pensando em utilizalo em detrimento de uns scripts que estou tendo que manter no braço(e apanhando igual cabrito na horta). Agora algumas perguntas

1. a conexão entre o master e o slave é persistente? se sim, não tem como fazer um buffer e executar a replicação em intervalos de tempo (tipo usando o cron)? se for persistente tenho que abrir um handler para cada slave que eu quiser atualizar?

2. fazendo as minhas estruturas corretamente, mantendo um intervalo de primarykey reservadas para cada banco, eu poderia ter update/insert/delete no slave tambem?

[12] Comentário enviado por andersonaa em 30/08/2006 - 12:30h

O que pode ser este erro:
<stdin>:6: Error: namespace "_voipix" already exists in database of node 1
<stdin>:6: ERROR: no admin conninfo for node 134590736

[13] Comentário enviado por diegotolentino em 24/11/2006 - 17:00h

como eu resolveria o problema abaixo, onde devo ir?

<stdin>:6: fe_sendauth: no password supplied
<stdin>:6: ERROR: no admin conninfo for node 134594832

[14] Comentário enviado por diegotolentino em 28/11/2006 - 15:46h

Amigo voce pode me ajudar a resolver o problema abaixo?

isso da quando vou executar o replicacao_start.sh

NOTICE: truncate of "public"."sys_pessoa" failed - doing delete
libgcc_s.so.1 must be installed for pthread_cancel to work

[15] Comentário enviado por celiojs em 09/12/2006 - 19:04h

Muito bom seu artigo!!!!!!
Em partes atende uma necessidade que tenho:
Como eu resolveria o problema de um deles parar e esse problema ficar transparente para a minha aplicação?
Até mais, e parabéns!!!!
Célio

[16] Comentário enviado por juangaray em 03/01/2007 - 10:59h

como eu faço para criar as tabelas? para replicação???

[17] Comentário enviado por eltonramos em 20/08/2007 - 12:26h

A replicação é na hora?
Online?

[18] Comentário enviado por fdmarp em 27/04/2009 - 20:20h

Legal ... deveria haver mais iniciativas de se escrever sobre dicas de postgres

[19] Comentário enviado por aldoarendt em 21/05/2009 - 11:39h

Bom dia a todos quando executo o comando

slon $CLUSTERNAME "dbname=$MASTERDBNAME user=$REPLICATIONUSER host=$MASTERHOST"

2009-05-21 08:37:00 BRT ERROR cannot get sl_local_node_id - ERROR: schema "_teste" does not exist
2009-05-21 08:37:00 BRT FATAL main: Node is not initialized properly - sleep 10 s

[20] Comentário enviado por betolima em 20/08/2010 - 13:49h

qual seria o caminho correto?

--with-pgsourcetree=/path/to/source/postgresql-x.y.z/

path/to/source

não sei o path correto

valeu


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts