Replicação do PostgreSQL com Slony

Autor: Marlon Petry

Licença: GPL

Slony é um replicador assícrono que trabalha através de triggers, para instala-lo é necessário possuir os fontes do postgreSql neste tutorial mostrarei como configurar o slony para que ele replique uma base de dados. O slonik é um interpretador dos scripts do slony.



Primeiros Comandos:

Os primeiros comandos de um script slonik devem identificar o nome do cluster, servidores envolvidos e parâmetros para conectar a cada base de dados no cluster. Um script slonik é geralmente escrito em shell script. No script abaixo é identificado o cluster e os nodos de conexão

#!/bin/bash
slonik <<_EOF_
cluster name = 'cluster_name';
node 1 admin conninfo = 'dbname=db host=julius user=postgres password=secreto';
node 2 admin conninfo = 'dbname=db host=ceasar user=postgres password=secreto';
_EOF_



Nodos de Rede:

Um nodo é uma combinação de uma base de dados e um processo slon pertencente a base de dados. Um cluster é a cooperação de um nodo com um esquema de replicação. Para isto funcionar é necessário que todos os nodos conheçam o caminho para outros nodos.

Nosso primeiro script slonik servirá para inicializar o cluster, definindo cada nodo e os caminhos dos outros nodos. Os nodos possuem um id (um número único). O cluster é definido no primeiro nodo como o comando init cluster ou seja este será o master, e cada nodo subseqüente é definido como store node.

O super usuário slony, neste caso é definido como postgres.

O path (caminho) é definido como um nodo sendo o master e outro como slave. Esta terminologia não relata o esquema de replicação, porém referencia um possível caminho para os nodos sendo as informações de conexão pertencentes a cada nodo, estas informações serão usadas pelo daemon slon para se conectar ao nodo.

#!/bin/bash

slonik << _EOF_
#
#Definindo o nome do cluster e informações sobre conexão
#

cluster name = repl;
node 1 admin conninfo = 'dbname=db host=julius user=postgres password=senha';
node 2 admin conninfo = 'dbname=db host=ceasar user=postgres password=senha';
echo 'Caminhos definidos';

# Inicializando o cluster
init cluster(id=1, comment = 'Master Node 1');
store node(id=2, comment = 'Store Node 2');
echo 'Nodos Definidos';

#Criando os Caminhos
store path(server = 1, client = 2, conninfo='dbname=db host=julius user=postgres password=senha');
store path(server = 2, client = 1, conninfo='dbname=db host=ceasar user=postgres password=senha');
echo 'Caminhos definidos';
_EOF_

Os erros de sintaxe são comuns com um script pelo menos na fase de desenvolvimento uma boa prática é usar o comando echo para isolarmos os erros que possam vir a surgir.



Escutando os Eventos:

Todos os eventos que acorrerão devem ser informados ao cluster, para que isto seja possível devemos dizer ao slony quais nodos escutaram e quais transmitem.

Neste exemplo só temos dois nodos, então habilitamos os dois a escutar, para configurar devemos informar quem será o origin, receiver, provider.

A origin diz que todo os eventos seram gerados neste nodo, já o receiver será o nodo que receberá os eventos, e o provider é quem repassa o evento, se tivessimos tres nodos poderíamos configurar o nodo 3 para escutar os eventos ocorridos no nodo 1 e estes serem fornecidos pelo nodo 2.

#!/bin/bash

slonik << _EOF_
#
#Definindo o nome do cluster e informações sobre conexão
#

cluster name = repl;
node 1 admin conninfo = 'dbname=db host=julius user=postgres password=senha';
node 2 admin conninfo = 'dbname=db host=ceasar user=postgres password=senha';
echo 'Caminhos definidos';

#Quem escuta quem
store listen(origin=1,receiver =2,provider=1);
store listen(origin=2,receiver =1,provider=2);
echo 'Quem escuta quem definido';
_EOF_



Iniciando um processo slon:

Uma vez que os nodos estejam configurados, e escutando por eventos, o processo slon pode ser iniciado. Um processo slon deve ser iniciado em cada base de dados que participa da replicação.

#!/bin/bash
slon "dbname=db host=julius user=postgres password=senha" > slonJulius.out 2>&1 &;
slon "dbname=db host=ceasar user=postgres password=senha" > slonCeasar.out 2>&1 &;
sleep 40;



Infomando o que será replicado:

Um esquema de replicação com slony deve ser informado quais são as tabelas e seqüências que serão replicadas.

Primeiramente deve ser criado um set informando o nodo de origem, depois basta adicionar as tabelas e sequëncias ao set, informando o set de origem, um id para tabela, e o full qualified name de cada tabela ou sequencia e opcionalmente uma chave alternativa.

O id de cada tabela deve-se ter uma certa preocupação pois isto definrá a ordem de travamento da tabelas. Isto significa que as tabelas mestras devem ter o id mais baixo. A modelagem de seu banco deve ajudar-lhe a determinar a ordem dos ids. Quando requisitar uma tabela que esteja com id errado ou inverso pode haver problemas com o postgres e o processo slon.

Um set deve ser criado apenas uma vez e não ter nenhum subsciber ativo. Para adicionar novas tabelas para serem replicadas, um novo set deve ser criado e depois os dois set devem ser combinados com o comando merge set.

#!/bin/bash

slonik <<_EOF_
#
#Definindo o nome do cluster e informações sobre conexão
#

cluster name = repl;
node 1 admin conninfo = 'dbname=db host=julius user=postgres password=senha';
node 2 admin conninfo = 'dbname=db host=ceasar user=postgres password=senha';
echo 'Caminhos definidos';

#Criando o Set
create set (id=1, origin=1, comment='gb tables');
echo 'Set created';
set add table (set id=1, origin=1, id=1, full qualified name = 'public.funcionario', comment='Tabela Funcionarios');
set add table (set id=1, origin=1, id=2, full qualified name = 'public.carros', comment='Tabela Carros');
set add table (set id=1, origin=1, id=3, full qualified name = 'public.getom'', comment='Tabela Getom');
set add sequence (set id = 1, origin = 1, id = 4,full qualified name = 'public.id_getom_seq',
comment = 'Sequence id getom');
set add sequence (set id = 1, origin = 1, id = 5,full qualified name = 'public.id_func_seq', comment = 'Sequence id func');
set add sequence (set id = 1, origin = 1, id = 6,full qualified name = 'public.id_car_seq', comment = 'Sequence id car');
echo 'set 1 tables created';
_EOF_



Subscribers para o set

Com o set criado já é possível criar um subscriber. Para criar um subscriber para um set, devemos identificar o set, o nodo que fornece o set, o receptor do set ou se não for receptor deste set pode envia-lo para outro nodo.

Neste caso o nodo de origem é o mesmo que forneceu as informações a serem subscritas, mas para subscrição em cascata este não é o caso.

Mesmo que haja somente dois nodos neste sistema de replicação, nõs estamos definindo que o nodo de recepção pode enviar o set para outro nodo, isto serve caso inserirmos outro nodo ou trocarmos o mestre.

Aqui o nodo 2 é subscrito pelo set 1 que é originado no nodo 1 e fornecido pelo nodo 1.

#!/bin/bash
slonik << _END_
#
# Define cluster namespace and node connection information
#
cluster name = repl;
node 1 admin conninfo = 'dbname=db host=julius user=postgres passwd=senha';
node 2 admin conninfo = 'dbname=db host=ceasar user=postgres passwd=eamf285';
echo 'Cluster definido, nodes identificados';
subscribe set (id=1, provider=1, receiver=2, forward=yes);
echo 'set 1 of repl tables subscribed by node 2';
_END_

A partir deste momento sua base de dados já deve estar sendo replicada.



Como Desfazer :

A maneira mais simples para desfazer é terminar todos processos slon que estejam rodando, e remover completamente de sua base de dados todas alterações feitas pelo slony.

#!/bin/bash
cluster name = repl;
node 1 admin conninfo = 'dbname=gb host=julius user=postgres password=senha';
node 2 admin conninfo = 'dbname=gb host=ceasar user=postgres password=senha';
echo 'Cluster definido';
#
# UnInstall ambos nodos
#
uninstall node (id=1);
uninstall node (id=2);
echo 'Nodes 1 and 2 Removidos';
_END_

Comentários, Dúvidas:

Envie seus comentários e dúvidas para meu e-mail marlonpetry at gmail.com

Referências:

The Slony-I Project Documentation on Gborg - http://gborg.postgresql.org/slony1

Database Replication with Slony - http://www.linuxjournal.com/article/7834

Linux Today – ONLamp: Introducing Slony - http://linuxtoday.com/infrastructure/2004112200226OSHL

Slony-I: Example of Replicating A Small Database - http://www.varlena.com/varlena/GeneralBits/85.php

Jan Wieck's Original Slony-I Talk and Scripts July 2004 in Portland, OR sponsored by Afilias Global Registry Services