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))