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 25/03/2009 14:23:15

simson
Membre

Slony

Bonjour,
Je viens voir un peu la communauté histoire d'avoir quelques infos.
Je suis en train de travailler sur un cluster de base de donnée avec réplication asynchrone utilisant slony en version 1.

J'ai installé 3 serveurs.
J'ai une premiere base de donnée répliquée sans problème. Tout mes prérequis sont en place en ce qui concerne ma base de donnée avec clé primaire déclarée explicitement.
J'ai bien compris le système avec le slon.conf et slon_tools.conf qui sont par défaut dans /etc/slony1/ ainsi que le numéro du noeud qui se trouve dans /etc/default/slony1

Quand je lance mes démons a la main avec slon_start 1 , 2 , et 3 sur chaqu'un de mes serveurs pas de problème.

Maintenant je me suis penché sur la problèmatique de mettre une deuxieme base de donné et d'avoir un système entierement automatisé grace au script de démarrage/etc/init.d/slony1. Je précise que ma distribtion est une Débian Lenny

Apres avoir étudié un peu le script je me suis appercu que l'on pouvait avoir plusieurs fichiers de configurations de slon_tools pour chacun des clusters. J'en ai déduit  en regardant qu'il s'appuyait sur un sous répertoire de /etc/slony1/X/slon_tools.conf mais qu'il s'appuyait toujours sur un seul et unique slon.conf toujours present dans /etc/slony1 a sa racine. Je me suis dit que deja la y avait peut etre un problème. En effet meme pour le démon on s'appuie sur quand meme 2 variables qui sont cluster_name et conn_info, qui changes si on a 2 base de données différente a répliquer ( a moins que je n'ai pas bien compris wink )

Ma question est donc deja dans un premier temps pour chacune des bases de donnée que je veux répliquer faut-il bien 2 slon.conf et slon_tools.conf différents?

Ensuite j'ai un peu poussé ce qui se passait avec le scrip perl, Slon_start. En le disséquant je me suis appercu que pour gerer le fichier contenant le process mémoire correspondant a slon j'avais en passage de parametre le Numéro du noeud. Or si j'ai bien 2 bases a répliqués avec le meme numéro de noeud mon fichier pid contenant les numéros de process sont ecrasés. Je n'ai que le dernier de lancé. Cela entraine un gros problème lorsque je veux arreter mes process apparement.

Ma deuxième question est donc la suivante, est-ce que si j'ai 2 base de donnée a répliquer, est-ce que je dois avoir donc 2 clusters avec 3 noeuds?

serveur 1
cluster n°1
noeud 1
etc/slony/1/slon.conf
/etc/slony/1/slon_tools.conf

cluster n°2
noeud 1
etc/slony/2/slon.conf
/etc/slony/2/slon_tools.conf


server 2
cluster n°1
noeud 2
etc/slony/1/slon.conf
/etc/slony/1/slon_tools.conf

cluster n°2
noeud 2
etc/slony/2/slon.conf
/etc/slony/2/slon_tools.conf

server 3
cluster n°1
noeud 3
etc/slony/1/slon.conf
/etc/slony/1/slon_tools.conf

cluster n°2
noeud 3
etc/slony/2/slon.conf
/etc/slony/2/slon_tools.conf

Voila j'espere avoir été clair. j'attends d'avoir un peu de bille pour mieux comprendre comment tout cela fonctionne.
Cordialement,

Hors ligne

#2 25/03/2009 16:50:56

SAS
Membre

Re : Slony

Bonjour,

Apparemment, votre problème se situe plus dans l'utilisation des outils perl livrés avec Slony que dans Slony lui-même.

Au niveau de Slony, rien ne vous interdit de définir plusieurs clusters dont la numérotation des noeuds suit la même logique.

Ainsi, vous pouvez avoir sur le serveur 1 :

Cluster 1, noeud 1
Cluster 2, noeud 1

Sur le serveur 2
Cluster 1, noeud 2
Cluster 2, neud 3

Sur le serveur 3
Cluster 1, noeud 3
Cluster 3, noeud 2

Malheureusement, je ne connais pas les outils perl, et ne saurais vous aider à les déboguer et/ou améliorer.


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

Hors ligne

#3 25/03/2009 17:48:00

simson
Membre

Re : Slony

J'ai un peu progressé sur le sujet entre temps.
En fait effectivement il y a 2 petits soucis.
Le premier est directement le /etc/init.d/slony1 qui est le script bash qui lance de facon automatique les differents cluster.
Ensuite le deuxieme est directement lié aux outils perl en effet, ou il se trouve que le slon_start créé un fichier pid avec le nom du noeud.
Pour bien faire les choses il aurait fallu qu'il puisse prendre en parametre non seulement le noeud mais aussi le cluster ce qui n'est pas le cas smile
J'ai donc modifié  avec mes connaissances bien faible le script bash /etc/init.d/slony1  pour qu'il prenne en compte le lancement automatique de l'ensemble des clusters (tant pis pour le fichier pid ecrasé).  Apres installation de ce dernier sur l'ensemble de mes serveur,  j'arrive a avoir mes 2 clusters de bases de données synchronisées. Pour stopper correctement les processus je kill directement apres avoir cherché avec un ps c'est pas élégant mais c'est la seul facon vu que le script perl ne génere qu'il seul fichier pid pour mes 2 clusters.

Pas evident toutefois de comprendre qu'il faut 1 cluster / base de donnée a répliquer... surtout quand on a pris l'habitude de démarer a la main avec des slon_starts smile

Enfin tout a l'air de fonctionner comme il faut pour le moment.

Y a t-il un endroit ou je peux le posterle script si ca peut servir a quelqu'un?

Hors ligne

#4 25/03/2009 18:48:54

SAS
Membre

Re : Slony

simson a écrit :

Y a t-il un endroit ou je peux le posterle script si ca peut servir a quelqu'un?

Dans ce fil de discussion, ce serait un bon début.


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

Hors ligne

#5 26/03/2009 10:53:48

simson
Membre

Re : Slony

Voila le script modifié smile
Comme je ne suis pas un pro des scripts j'ai modifié celui d'origine livré avec la Débian. Il prend en compte l'ensemble des clusters maintenant.
Le code est surement perfectible mais bon au moins ca marche smile
bye.

#!/bin/bash

### BEGIN INIT INFO
# Provides:          slony1
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Should-Start:      $time postgresql
# Should-Stop:       $time postgresql
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: start Slony-I daemon
# Description: Slony-I is a replication system for PostgreSQL.
### END INIT INFO


PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/slon


if [ -r /etc/default/slony1 ]; then
    . /etc/default/slony1
fi

instances() {
    ls /etc/slony1/*/slon.conf 2>/dev/null | sed -n 's,^/etc/slony1/\(.*\)/slon.conf$,\1,p'
}

conffile() {
    echo "/etc/slony1/$1/slon.conf"
}

conffiletool() {
    echo "/etc/slony1/$1/slon_tools.conf"
}

pidfile() {
    echo "/var/run/slony1/node$1.pid"
}

prepare_start() {
    mkdir -p /var/run/slony1 \
    && chown postgres:postgres /var/run/slony1/ \
    && chmod 2775 /var/run/slony1/
}

d_start() {
    slon_start --config=$(conffiletool $1) --nowatchdog $SLON_TOOLS_START_NODES >/dev/null
}

d_stop() {
    ps -edf | grep node$SLON_TOOLS_START_NODES | grep -v "grep" | cut -d " " -f7
}

case $1 in
    start)
    status=0
    echo "Starting Slony-I daemon"
    prepare_start
    if [ -f $(pidfile $SLON_TOOLS_START_NODES) ]; then
        echo "Deamon Slony is already running clusters node $SLON_TOOLS_START_NODES"
    else
        for x in $(instances); do
            echo "Deamon Slony is running cluster $x node $SLON_TOOLS_START_NODES"
            d_start $x
            status=$(($status || $?))
            sleep 1
        done
    fi
    ;;
    stop)
    status=0
    echo "Stopping Slony-I daemon"
        if [ -f $(pidfile $SLON_TOOLS_START_NODES) ]; then   
                for i in $(d_stop); do
                    kill $i 1>/dev/null 2>/dev/null
                done
                status=$(($status || $?))
                echo "Deamon Slony is stopping all clusters for node $SLON_TOOLS_START_NODES"
                sleep 1
        else
            echo "Deamon Slony no current job running on cluster"
        fi
    ;;
    status)
    status=0
        if [ -f $(pidfile $SLON_TOOLS_START_NODES) ]; then
            echo "Slony-I daemon clusters on node $SLON_TOOLS_START_NODES are running."
        else
            echo "Slony-I daemon clusters on node $SLON_TOOLS_START_NODES aren't running."
        fi
                status=$(($status || $?))
        sleep 1
    ;;
    restart)
    status=0
    echo "Restarting Slony-I daemon"
        if [ -f $(pidfile $SLON_TOOLS_START_NODES) ]; then
           
            for i in $(d_stop); do
                kill $i 1>/dev/null 2>/dev/null
            done
            sleep 1
            for x in $(instances); do
                echo "Deamon Slony is restarting cluster $x node $SLON_TOOLS_START_NODES"
                d_start $x
                status=$(($status || $?))
                sleep 1
            done
            echo "Done"
            status=$(($status || $?))
        else
            echo "Deamon Slony is not running, try to start..."
            for x in $(instances); do
                echo "Deamon Slony is running cluster $x node $SLON_TOOLS_START_NODES"
                d_start $x
                status=$(($status || $?))
                sleep 1
            done
            echo "Done"
        fi
    ;;
    *)
    echo "Usage: $0 {start|stop|status|restart}"
    exit 2
    ;;
esac

Hors ligne

Pied de page des forums