PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 10/06/2011 10:47:18

IsaBd
Membre

slony replication 1 maitre 2 esclaves avec des schémas différents help

Bonjour
j'ai une réplication avec 1 maitre 1 esclave ( déclaration des tables et des séquences avec add séquence en particulier  ) cela fonctionne trés bien
Je souhaite rajouter un autre esclave sur le maitre  qui comprendra moins de tables répliquées .
Comment dois je faire ?
- 1 cluster ou 2 clusters sur le maitre (j'ai testé les2 mais j'ai le même problème)
- si j'ai bien compris pour le cas 1 cluster ; faire 2 sets 1 avec la partie commune aux 2 esclaves et  l'autre avec le reste

Mon souci a lieu avec les séquences  quand la synchronisation arrive , j'obtiens l'erreur
"select "_replication2".setAddSequence_int(1, 1, '"article"."obs_kobs_seq"', 'table obs_kobs_seq')" PG
RES_FATAL_ERROR ERROR:  Slony-I: setAddSequence_int(): sequence ID 1 has already been assigned
En regardant la doc effectivement les séquences ne doivent être déclarées qu'une fois ..
mais comment dois je faire ?
J'ai l'impression de passer à coté de quelque chose d'essentiel mais quoi ...?

les différentes étapes que je suis
cas 1 cluster :
déclaration de 3 nœuds
création de 2 sets avec affectation des tables et séquences : set add table et sequence
enregistrement des nœuds 2 et 3 en esclave store node (id=2 ..) et store node (id=3 ..)
les store path
store path (server = 1, client = 2, conninfo=
        store path (server = 2, client = 1,
        store path (server = 1, client = 3,
        store path (server = 3, client = 1,
les store listen
        store listen (origin=1, provider = 1, receiver =2);
        store listen (origin=2, provider = 2, receiver =1);
        store listen (origin=1, provider = 1, receiver =3);
        store listen (origin=3, provider = 3, receiver =1);
les souscriptions
subscribe set (id = 1, provider = 1, receiver = 2, forward = no);
         subscribe set (id = 1, provider = 1, receiver = 3, forward = no);
         subscribe set (id = 2, provider = 1, receiver = 2, forward = no);

Qu'en pensez vous ?

Hors ligne

#2 10/06/2011 11:45:15

gleu
Administrateur

Re : slony replication 1 maitre 2 esclaves avec des schémas différents help

si j'ai bien compris pour le cas 1 cluster ; faire 2 sets 1 avec la partie commune aux 2 esclaves et  l'autre avec le reste

Exact.

Normalement, il faut déclarer 3 noeuds, et deux sets. Chaque set doit contenir des tables et séquences différentes. Il faut bien faire attention aux id de départ des tables et séquences. L'id ne doit pas être 1 car l'id 1 est certainement déjà utilisé par le set 1. L'id de départ pour le set 2 en ce qui concerne les tables doit correspondre au minimum au nombre de tables du set 1 + 1. Si vous n'avez pas envie de vous embêter il peut être plsu simple de dire que le set 1 commence à l'id 1 et le set 2 commence à l'id 10000 (ce n'est qu'un exemple). Ça devrait corriger le problème du message d'erreur que vous indiquez. Le noeud maître des deux sets est le même. Par contre, vous devez abonner un des noeuds esclaves aux deux sets et l'autre qu'au set commun.

À priori, ça devrait fonctionner sans aucun problème.


Guillaume.

Hors ligne

#3 10/06/2011 11:57:06

IsaBd
Membre

Re : slony replication 1 maitre 2 esclaves avec des schémas différents help

Merci pour votre réponse rapide et pour l'astuce !
En fait, les id dans mon deuxième set  sont différents et donc corrects ; à vrai dire pour mon test , dans le 2 eme set je n'ai qu'une table sans séquence ..
les instructions 'set add sequence' qui font partie du set commun  ne fonctionne que sur un esclave pas sur l'autre .
en effet sur le 2eme esclave, l'erreur de mon premier message est renvoyée.
"select "_replication2".setAddSequence_int(1, 1, '"article"."obs_kobs_seq"', 'table obs_kobs_seq')" PG
RES_FATAL_ERROR ERROR:  Slony-I: setAddSequence_int(): sequence ID 1 has already been assigned
En regardant la doc effectivement les séquences ne doivent être déclarées qu'une fois ..
mais comment dois je faire ?
J'ai l'impression de passer à coté de quelque chose d'essentiel mais quoi ...?
(mes versions postgresql 8.3.8 slony 2.0.2

Hors ligne

#4 10/06/2011 14:22:04

gleu
Administrateur

Re : slony replication 1 maitre 2 esclaves avec des schémas différents help

Je vous conseille très vivement de passer à la version 2.0.6, les anciennes versions 2.0 étaient suffisamment buggées pour que même l'équipe de développement de Slony indique de ne pas les utiliser en production.

Pouvez-vous nous donner les étapes exactes que vous réalisez ? ainsi que la config ?


Guillaume.

Hors ligne

#5 10/06/2011 16:05:37

IsaBd
Membre

Re : slony replication 1 maitre 2 esclaves avec des schémas différents help

Je vais suivre votre conseil car j'ai l'impression que ce fonctionnement n'est pas normal
- mes étapes

cluster name =replication;
node 1 admin conninfo = 'dbname=bdt host=machine1 user=postgres port=';
        node 2 admin conninfo = 'dbname=bdt host=machine2 user=postgres port=';
        node 3 admin conninfo = 'dbname=bdtr host=machine3 user=postgres port=';
init cluster ( id=1, comment = 'Master Node');

set add table (set id=1, origin=1, id=1, fully qualified name = 'bd.table1', comment='table table1');
....
create set (id=2, origin=1, comment='bdt');
set add table (set id=2, origin=1, id=10001

set add sequence (set id=1, origin=1, id=1,
.......
store node (id=2, comment = 'Slave node ', event node=1);
        store node (id=3, comment = 'Slave node replication', event node=1);
        store path (server = 1, client = 2, conninfo='dbname=bdtrprod host=machine1 user=postgres port=');
        store path (server = 2, client = 1, conninfo='dbname=bdtrprod host=machine2 user=postgres port=');
        store path (server = 1, client = 3, conninfo='dbname=bdtrprod host=machine1 user=postgres port=');
        store path (server = 3, client = 1, conninfo='dbname=bdtrprod host=machine3 user=postgres port=');
        store listen (origin=1, provider = 1, receiver =2);
        store listen (origin=2, provider = 2, receiver =1);
        store listen (origin=1, provider = 1, receiver =3);
        store listen (origin=3, provider = 3, receiver =1);

conf spécifique  du maitre , le reste est en commentaire
pid_file='/var/bd/run/pidreplicationNode1.pid'

cluster_name='replication'

conn_info='dbname=bdt host=machine1 .....
desired_sync_time=60000

conf des esclaves est la même aux chaines de connexion prés.

dans le fichier de démarrage :
CLUSTERS="replication"

prog="bd-slon-3"

CONFIGFILE=$SLHOME/${CLUSTERS}-node${NODENUM}.conf
LOGFILE=$LOGHOME/${CLUSTERS}-node${NODENUM}.log

rien d'exceptionnel ...

Hors ligne

#6 10/06/2011 19:50:31

gleu
Administrateur

Re : slony replication 1 maitre 2 esclaves avec des schémas différents help

Vous n'en mettez que des bouts, il est donc difficile de savoir vraiment d'où vient le problème. J'ai fait un test de mon côté. J'ai créé trois bases (isadb1, isadb2 et isadb3). J'ai le schéma suivant sur ses trois bases :

CREATE PROCEDURAL LANGUAGE plpgsql;

CREATE TABLE t1 (
    c1 serial PRIMARY KEY,
    c2 text
);

CREATE TABLE t2 (
    c1 serial PRIMARY KEY,
    c2 boolean,
    c3 text
);

CREATE TABLE t3 (
    c1 integer PRIMARY KEY,
    c2 integer
);

Trois tables, toutes avec des clés primaires, les deux premières ont des colonnes auto-incrémentés pour que des séquences soient associées.

Ensuite, j'ai écrit la configuration suivante pour Slony :

if ($ENV{"SLONYNODES"}) {
    require $ENV{"SLONYNODES"};
} else {

    # Parameters

    $CLUSTER_NAME = 'replication';
    $LOGDIR = '/opt/slony-2.0/var/log/slony1';
    $MASTERNODE = 1;
    $DEBUGLEVEL = 2;

    # Nodes

    add_node(node     => 1,
	     host     => 'localhost',
	     dbname   => 'isadb1',
	     port     => 5432,
	     user     => 'guillaume',
         password => '');

    add_node(node     => 2,
	     host     => 'localhost',
	     dbname   => 'isadb2',
	     port     => 5432,
	     user     => 'guillaume',
         password => '');

    add_node(node     => 3,
	     host     => 'localhost',
	     dbname   => 'isadb3',
	     port     => 5432,
	     user     => 'guillaume',
         password => '');
}

$SLONY_SETS = {

    # Set commun

    "set1" => {
	    "set_id" => 1,
	    "origin" => 1,
	    "table_id"    => 1,
	    "sequence_id" => 1,
        "pkeyedtables" => [
              "public.t1",
              "public.t2",
	    ],
	    "sequences" => [
                 "t1_c1_seq",
                 "t2_c1_seq",
	    ],
    },

    # Set supplementaire

    "set2" => {
	    "set_id" => 2,
	    "origin" => 1,
	    "table_id"    => 10,
	    "sequence_id" => 10,
        "pkeyedtables" => [
              "public.t3",
	    ],
	    "sequences" => [
	    ],
    },
};

if ($ENV{"SLONYSET"}) {
    require $ENV{"SLONYSET"};
}

# Please do not add or change anything below this point.
1;

Je vais donc avoir mes trois noeuds (un noeud pour chaque base) et deux sets (le premier avec les tables t1 et t2, et le deuxième set avec la table t3. Avec les scripts altperl, ça me donne ceci :

[guillaume@laptop bin]$ ./slonik_init_cluster --config ../etc/slon_tools.isadb.conf | ./slonik
<stdin>:12: Set up replication nodes
<stdin>:15: Next: configure paths for each node/origin
<stdin>:22: Replication nodes prepared
<stdin>:23: Please start a slon replication daemon for each node

[guillaume@laptop bin]$ ./slonik_create_set --config ../etc/slon_tools.isadb.conf 1 | ./slonik
<stdin>:17: Subscription set 1 created
<stdin>:18: Adding tables to the subscription set
<stdin>:22: Add primary keyed table public.t1
<stdin>:26: Add primary keyed table public.t2
<stdin>:29: Adding sequences to the subscription set
<stdin>:33: Add sequence public.t1_c1_seq
<stdin>:37: Add sequence public.t2_c1_seq
<stdin>:38: All tables added

[guillaume@laptop bin]$ ./slonik_create_set --config ../etc/slon_tools.isadb.conf 2 | ./slonik
<stdin>:17: Subscription set 2 created
<stdin>:18: Adding tables to the subscription set
<stdin>:22: Add primary keyed table public.t3
<stdin>:25: Adding sequences to the subscription set
<stdin>:26: All tables added

[guillaume@laptop bin]$ ./slonik_subscribe_set --config ../etc/slon_tools.isadb.conf 1 2 | ./slonik
<stdin>:11: Subscribed nodes to set 1

[guillaume@laptop bin]$ ./slonik_subscribe_set --config ../etc/slon_tools.isadb.conf 2 2 | ./slonik
<stdin>:11: Subscribed nodes to set 2

[guillaume@laptop bin]$ ./slonik_subscribe_set --config ../etc/slon_tools.isadb.conf 1 3 | ./slonik
<stdin>:11: Subscribed nodes to set 1

Autrement dit, tout se passe comme on pouvait s'y attendre. Je n'ai pas d'erreur dans mon cas. Il doit donc y avoir un soucis avec votre configuration.


Guillaume.

Hors ligne

#7 16/06/2011 21:10:46

IsaBd
Membre

Re : slony replication 1 maitre 2 esclaves avec des schémas différents help

Bonjour,

Merci pour cet exemple que j'ai reporté sur mes environnements et qui fonctionne .. super !
Donc ce n'est peut être pas slony qui est en tort ..

Par contre, malgré tout je ne vois pas où je me suis trompée dans mon environnement réel ..
quelques 130 tables numérotées de 1 à 130  et 30 séquences numérotées de 1 à 30.
De toute façon ma configuration fonctionne déjà entre un maitre et un esclave donc ce ne devrait pas être la numérotation des séquences qui est en cause .
mais j'ai des tables partitionnées qui possèdent des séquences ....
Je vais écouter vos conseils et migrer en slony 2.0.6 et réflèchir éventuellement plus tard aux numérotations.

Encore merci !

Hors ligne

#8 19/06/2011 20:28:02

SAS
Membre

Re : slony replication 1 maitre 2 esclaves avec des schémas différents help

Bonjour,

Dans votre exemple, vous n'indiquez pas le moment où vous effectuez les souscriptions.

Petite précision, le store listen n'est plus nécessaire. Il est induit par le store path depuis la version 1.2 de slony.

Si vous nous donnez l'intégralité de votre script, nous pourrons éventuellement vous aider à comprendre à quel endroit se situe la difficultée que vous rencontrez.

Pour finir, je vous conseille de regarder les outils d'aide à l'administration de Slony, scripts perl ou slony1-ctl. Ils simplifient grandement la gestion des réplications Slony.


Stéphane Schildknecht
Conseil, formations et support PostgreSQL
http://www.loxodata.com

Hors ligne

#9 21/06/2011 13:48:56

IsaBd
Membre

Re : slony replication 1 maitre 2 esclaves avec des schémas différents help

Bonjour

Comme convenu j'ai installé une version slony 2.0.6 
Et je me  suis rendue compte aussi qu'une de mes  bases esclave avait perdu toutes ses contraintes clés etc ... étonnant ....
Donc j'ai rétabli son  schéma
et j'ai enfin pu mettre en place ma réplication à 3 ! Et ça marche ! Yes !!

J'ai eu un souci pour installer slony 2.0.6
En effet sur des environnements redhat le configure de slony  demandait de compiler postgresql avec l'option enable-thread-safety mais ne prenait pas en compte cette nouvelle compilation donc impossible de réaliser uneconfigure de slony sur redhat , j'ai détourné le problème en faisant une  compilation de postgresql avec enable-threéad-safety  sur centos et en récupérant la librairie libpq.so ..
Je ne suis pas très fière de moi mais je n'ai pas trouvé autre chose pour faire aboutir mes installations de slony 2.0.6 sur redhat ...
Mon problème de réplication est résolu , c'est déjà ça !!
Maintenant  il faudrait que je trouve une installation de slony 2.0.6 un peu plus académique pour la suite ....

A suivre ....

Hors ligne

#10 21/06/2011 15:26:21

SAS
Membre

Re : slony replication 1 maitre 2 esclaves avec des schémas différents help

Bonjour,

Il existe des paquets RPM de Slony pour RedHat.

Vous pouvez jeter un oeil sur le site http://yum.pgrpms.org.


Stéphane Schildknecht
Conseil, formations et support PostgreSQL
http://www.loxodata.com

Hors ligne

Pied de page des forums