Par jerome le 09/06/2006 - 14:57
Bonjour,
J'essaye de configurer Slony v1.5.15 avec 2 noeuds PostgreSQL 8.1.4. Globalement, j'arrive Ă mes fins, sauf dans le cas du failover "d'urgence".
Si la base maître était sur $MASTERHOST, et que $MASTERHOST ne répond plus, en exécutant la commande suivante de $SLAVEHOST, tout se passe bien: $MASTERHOST est retiré et la base maître "passe" sur $SLAVEHOST
#!/bin/sh
slonik <<_EOF_
cluster name= $CLUSTERNAME;
node 1 admin conninfo='dbname=$MASTERDBNAME host=$MASTERHOST port=5432 user=$REPLICATIONUSER password=slony';
node 2 admin conninfo='dbname=$SLAVEDBNAME host=$SLAVEHOST port=5432 user=$REPLICATIONUSER password=slony';
failover (id=1, backup node=2);
drop node (id=1, event node=2);
_EOF_
Une fois $MASTERHOST rétabli, à partir de ce dernier, je lance la commande suivante, et $MASTERHOST est réintégré au cluster, et redevient la base maître:
#!/bin/sh
slonik << _EOF_
cluster name= $CLUSTERNAME;
node 1 admin conninfo= 'dbname=$MASTERDBNAME host=$MASTERHOST port=5432 user=$REPLICATIONUSER password=slony';
node 2 admin conninfo= 'dbname=$SLAVEDBNAME host=$SLAVEHOST port=5432 user=$REPLICATIONUSER password=slony';
echo 'Creation Noeud 1';
try {
store node (id=1, comment= 'Noeud 1', event node=2);
}
on error {
echo 'Erreur creation Noeud 1';
exit -1;
}
echo 'OK';
try {
store path (server=2, client=1, conninfo='dbname=$SLAVEDBNAME host=$SLAVEHOST port=5432 user=$REPLICATIONUSER password=slony');
store path (server=1, client=2, conninfo='dbname=$MASTERDBNAME host=$MASTERHOST port=5432 user=$REPLICATIONUSER password=slony');
}
on error {
echo 'Erreur creation des chemins';
exit -1;
}
echo 'Creation des chemins OK';
try {
echo 'Creation des ecoutes';
store listen (origin=2, provider=2, receiver=1);
store listen (origin=1, provider=1, receiver=2);
}
on error {
echo 'Erreur creation des ecoutes';
exit -1;
}
echo 'OK';
subscribe set (id=1, provider=2, receiver= 1, forward= no);
lock set (id=1, origin=2);
move set (id=1, old origin=2, new origin=1);
_EOF_
C'est le résultat escompté. Parfait !!!
Mon problème est dans l'autre sens. Si, pour une raison quelconque, la base maître se trouvait sur $SLAVEHOST, et que celle-ci tombe, alors je lance de $MASTERHOST la commande suivante:
#!/bin/sh
slonik <<_EOF_
cluster name= $CLUSTERNAME;
node 1 admin conninfo='dbname=$MASTERDBNAME host=$MASTERHOST port=5432 user=$REPLICATIONUSER password=slony';
node 2 admin conninfo='dbname=$SLAVEDBNAME host=$SLAVEHOST port=5432 user=$REPLICATIONUSER password=slony';
failover (id=2, backup node=1);
drop node (id=2, event node=1);
_EOF_
A priori, tout semble OK. Je peux travailler sur $MASTERHOST, et le noeud 2 semble bien exclus du cluster. Mais impossible de le réintégrer. Voici le script que je lance (à partir de SLAVEHOST)
#!/bin/sh
slonik << _EOF_
cluster name= $CLUSTERNAME;
node 1 admin conninfo= 'dbname=$MASTERDBNAME host=$MASTERHOST port=5432 user=$REPLICATIONUSER password=slony';
node 2 admin conninfo= 'dbname=$SLAVEDBNAME host=$SLAVEHOST port=5432 user=$REPLICATIONUSER password=slony';
echo 'Creation Noeud 2';
try {
store node (id=2, comment= 'Noeud 2', event node=1);
}
on error {
echo 'Erreur creation Noeud 2';
exit -1;
}
echo 'OK';
try {
store path (server=2, client=1, conninfo='dbname=$SLAVEDBNAME host=$SLAVEHOST port=5432 user=$REPLICATIONUSER password=slony');
store path (server=1, client=2, conninfo='dbname=$MASTERDBNAME host=$MASTERHOST port=5432 user=$REPLICATIONUSER password=slony');
}
on error {
echo 'Erreur creation des chemins';
exit -1;
}
echo 'Creation des chemins OK';
try {
echo 'Creation des ecoutes';
store listen (origin=2, provider=2, receiver=1);
store listen (origin=1, provider=1, receiver=2);
}
on error {
echo 'Erreur creation des ecoutes';
exit -1;
}
echo 'OK';
#subscribe set (id=1, provider=1, receiver= 2, forward= no);
lock set (id=1, origin=1);
move set (id=1, old origin=1, new origin=2);
_EOF_
Aucun message d'erreur n'apparait à l'exécution du script, mais Slony ne redémarre que sur un des 2 noeuds (a priori, le 1er lancé). Sur l'autre, j'obtiens le message suivant: FATAL localListenThread "select "_T1".cleanupNodeLock(): insert into "_T1".sl_nodeLock values (1,0,"pg_catalog".pg_backend_pid());" - ERREUR: une clé dupliquée rompt la contrainte unique "sl_nodelock-pkey"
Et tout est cassé ! Je n'arrive plus à redémarrer Slony sans dropper une des bases. Supprimer les schéma du Cluster et tout reprendre depuis le début.
Et je sèche, et je sèche.
Toute aide serait la bienvenue.
Cordialement,
JĂ©rĂ´me