Markus Rechberger / slony
 
StartSeite | MarkusRechberger/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Slony Postgresql "Replication

Fehlerquellen

Slony ist absolut nicht geeignet zum schnellen installieren, also einige Stunden müssen hierfür schon investiert werden. Man muss das jeweilige Script welches von dem Perl Setup erstellt wird ziemlich genau kennen um das ganze funktionierend über die Bühne zu bringen. Ein vacuum analyze kann unter umständen eine slony replikation unbrauchbar machen.

Jede Datenbank muss einen eigenen Clusternamen haben, ansonsten schießen sich die slons gegenseitig ab (Problem Stand V1.0)

Sicherheitshalber mal den Output von ldd psql ankucken ob vielleicht irgendwoher alte Libs angezogen werden, dies kann bei Slony merkwürdige Fehler anrichten (Bsp.: Statement: Select 1; FATAL: <breche Transaktion ab> .. Grund falsche Lib version (ist aber nur mittels strace ersichtlich!)

slonik vielleicht einmal mit strace -s1000 starten man sieht dort auch etwaige Fehler welche sich nicht in der Postgres Logfile wiederspiegeln/siehe vorigen Punkt.

node löschen (wäre das selbe wie {{{ drop schema "_T2" cascade }}} auf masterhost und slavehost:
slonik <<_EOF_ 2>> /db/slony_setup.log 1>> /db/slony_setup.log
        cluster name = T2;
        node 1 admin conninfo = 'dbname=databasex host=masterhost.de port=5432 user=slony password=xxxx';
        node 2 admin conninfo = 'dbname=databasex host=slavehost.de port=5432 user=slony password=xxxx';
        try {
        uninstall node (id = 1);
    }
    on error {
        echo 'Could not uninstall Slony-I on node 1';
        exit -1;
    }
        try {
        uninstall node (id = 2);
    }
    on error {
        echo 'Could not uninstall Slony-I on node 2';
        exit -1;
    }
        echo 'Slony-I successfully uninstalled on database databasex';
_EOF_

anschließend Datenbank erstellen und Struktur clonden mittels createdb und pg_dump -s(für schema only) databasex | psql ...

Nächster Schritt Node initialisieren:

slonik <<_EOF_ 2>> /db/slony_setup.log 1>> /db/slony_setup.log
        cluster name = T2;
        node 1 admin conninfo = 'dbname=databasex host=masterhost.de port=5432 user=slony password=xxxx';
        node 2 admin conninfo = 'dbname=databasex host=slavehost.de port=5432 user=slony password=xxxx';
        try { # schema auf dem master server zu erstellen
        echo 'Initializing the cluster';
        init cluster (id = 1, comment = 'Node 1');
    }
    on error {
        echo 'Could not initialize the cluster!';
        exit -1;
    }
    echo 'Database cluster initialized as Node 1';
    try { # schema auf dem slave server zu erstellen
        echo 'Storing node 2';
        store node (id = 2, comment = 'Node 2');
    }
    on error {
        echo 'Could not create Node 2!';
        exit -1;
    }
    echo 'Node 2 created';
    try {
        echo 'Creating store paths';
                store path (server = 1, client = 2, conninfo = 'dbname=databasex host=brutus2.infosys.de port=5432 user=slony password=');
                store path (server = 2, client = 1, conninfo = 'dbname=databasex host=brutus1.infosys.de port=5432 user=slony password=');
        }
    on error {
        echo 'Could not create store paths!';
        exit -1;
    }
    echo 'Store paths created';
    try {
        echo 'Storing listen network';
                store listen (origin = 1, provider = 1, receiver = 2);
                store listen (origin = 2, provider = 2, receiver = 1);
        }
    on error {
        echo 'Could not store listen network!';
        exit -1;
    }
    echo 'listen network stored';
    try {
        create set (id = 1, origin = 1, comment = 'databasex tables');
    }
    on error {
        echo 'Could not create subscription set!';
        exit -1;
    }
    echo 'Subscription set created';
    # anschließend tabellen hinzufügen

Zu guter letzt noch die slon daemons starten und mit slonik folgenden Befehl ausführen um die Hauptdaten mittels COPY auf den Slave zu transferieren.

slonik <<_EOF_ 2>> /db/slony_setup.log 1>> /db/slony_setup.log
        cluster name = T2;
        node 1 admin conninfo = 'dbname=databasex host=masterhost.de port=5432 user=slony password=xxxx';
        node 2 admin conninfo = 'dbname=databasex host=slavehost.de port=5432 user=slony password=xxxx';

        try {
                subscribe set (id = 1, provider = 1, receiver = 2, forward = no);
        }
    on error {
        echo 'Could not subscribe the set to the slaves';
        exit -1;
    }
    echo 'Database databasex subscribed to slaves';
_EOF_

Slony start/stopscript (gekürzt)

#!/bin/sh
prefix="postgresql bin pfad"

SLONUSER=slony
SLONDB="T1:dbname bis Tn:DBn" #diese Zeile ist die wichtigste Konfiguration des Skripts
SLONSTDERRLOG="/var/log/slony/slon.err"
SLONSTDOUTLOG="/var/log/slony/slon.out"

PIDFILE="/var/run/slony.pid"

if echo '\c' | grep -s c >/dev/null 2>&1 ; then
    ECHO_N="echo -n"
    ECHO_C=""
else
    ECHO_N="echo"
    ECHO_C='\c'
fi

DAEMON="$prefix/slon"

test -f $DAEMON || exit 0

case $1 in
     start)
           echo "Starting Slony: "
           for CONFIG in $SLONDB; do
                   REPLICA=${CONFIG:0:2}
                   DATABASE=${CONFIG:3}
                   test -f $PIDFILE.$DATABASE
                   if [ "$?" = "0" ]; then
                        printf "| %18s | %12s |\n" $DATABASE "running"
                   else
                           su - $SLONUSER -c "$DAEMON -b -p $PIDFILE.$DATABASE $REPLICA dbname=$DATABASE 2>$SLONSTDERRLOG.$DATABASE 1>$SLONSTDOUTLOG."$DATA
BASE" </dev/null"
                           printf "| %18s | %12s |\n" $DATABASE "ok"
                   fi
           done
           echo "-------------------------------------"
           ;;
     stop)
           echo "Stopping Slony: "$ECHO_C
           echo "-------------------------------------"
           echo "| DATABASE           |       STATUS |"
           echo "-------------------------------------"
           for CONFIG in $SLONDB; do
                   REPLICA=${CONFIG:0:2}
                   DATABASE=${CONFIG:3}
                   test -f $PIDFILE."$DATABASE" # might change since it's optional
                   if [ "$?" = "0" ]; then
                        read slonypid < $PIDFILE.$DATABASE
                        kill $slonypid
                        if [ "$?" = "0" ]; then
                             printf "| %18s | %12s |\n" $DATABASE "shutdown"
                             rm $PIDFILE.$DATABASE
                        else
                             printf "| %18s | %12s |\n" $DATABASE "failed"
                        fi
                   else
                        printf "| %18s | %12s |\n" $DATABASE "notrunning"
                   fi
           done
           echo "-------------------------------------"
           ;;
     *)
           echo "Usage $0 {start|stop|restart|switchover|failover}" 1>&2
           exit 1
           ;;
esac
exit 0


StartSeite | MarkusRechberger/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 13. Mai 2005 13:32 (diff))
Suchbegriff: gesucht wird
im Titel
im Text