Slony-I Replikation

Hallo Forum!

Ich habe mich schon - wie ich meine - intensiv mit Slony-I befasst und komme jetzt einfach nicht mehr weiter.

Ich wollte eigentlich 2 Datenbanken auf unterschiedlichen Rechnern (Windows 2003 Server und Suse Linux) synchron halten. Leider gelingt es mir immer nur in eine Richtung.

Hier ist mein Script:

	cluster name = slonycluster;

	node 1 admin conninfo = 'dbname=datenbank1 host=ip1 user=slony';
	node 2 admin conninfo = 'dbname=datenbank2 host=ip2 user=slony';


	try { # schema auf dem master server erstellen
    echo 'Initializing the cluster Master';
    init cluster (id = 1, comment = 'Master');
  }
  on error {
     echo 'Could not initialize the cluster!';
     exit -1;
  }
  echo 'Database cluster initialized as Node 1 Master';

  try { # schema auf dem slave server erstellen
     echo 'Storing node 2';
     store node (id = 2, comment = 'Slave');
  }
  on error {
     echo 'Could not create Node 2!';
     exit -1;
  }
  echo 'Node 2 created Slave';

	try {
        echo 'Creating store paths';
        store path ( server = 1, client = 2,
		    conninfo = 'dbname=datenbank1 host=ip1 user=slony');
	      store path ( server = 2, client = 1,
		    conninfo = 'dbname=datenbank2 host=ip2 user=slony');
	}
  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 = 'Alle Tabellen' );
    }
    on error {
        echo 'Could not create subscription set!';
        exit -1;
    }
    echo 'Subscription set created';
    set add table ( set id = 1, origin = 1, id = 1, 
      full qualified name = 'public.t1', comment = 't1' );
    set add table ( set id = 1, origin = 1, id = 2, 
      full qualified name = 'public.t2', comment = 't2' );
    set add table ( set id = 1, origin = 1, id = 3, 
      full qualified name = 'public.t3', comment = 't3' );
    set add table ( set id = 1, origin = 1, id = 4, 
      full qualified name = 'public.t4', comment = 't4' );

Wenn ich dann im pgAdmin ein Abo erstelle

Bereitsteller: 1 - Master
Empfänger: 2 - Slave

dann werden die Daten vom Master auf den Slave übertragen. Läuft wunderbar. Nur leider kann ich nichts am Slave verändern.

Wenn ich kein Abo einstelle, dann kann ich verändern was ich will, aber die Server sind unterschiedlich!

Leider klappt das ganze auch noch nicht über einen Dienst bzw. Daemon. Deswegen Starte ich (zumindest denke ich das) die Replikation so:

Windows:

slon slonycluster "dbname=datenbank1 host=localhost user=slony

Linux:

slon slonycluster "dbname=datenbank2 host=localhost user=slony

Ich hoffe ihr könnt mir helfen.

Vielen Dank!

David

Slony ist Master->Slave - Replikation. So, wie Du das beschreibst, arbeitet es auch.

Andreas

Also schaffe ich das, was ich vorhabe nicht mit Slony-I?

Hast du eine Idee wie ich das sonst umsetzen könnte? Muss ich mit Triggern arbeiten?

Oder ist pgpool eine Alternative für mich?

Vielen Dank!

Master-Master - Replikation? Angeblich hat Cybertec sowas.

Andreas

Cybertec hat und imho scrollt hier auch ab und zu Werbung dafür durch. Dem Vortrag von Cybertec in Italien und dem vorhergehenden Vortrag eines Japaners über die Grundlagen der gleichen Technologie würde ich das Thema jedoch mit Vorsicht behandeln und erst sehr eingehend evaluieren.

Aber wie kann man z. B. folgendes Szenario umsetzen:

Standort A hat mehr Mitarbeiter und die meisten Daten werden hier verarbeitet.

Standort B hat nur einen Mitarbeiter (z. B. Lagerist), es werden wenige Daten verarbeitet.

Standort A ist mit Standort B über ADSL verbunden.

Sowohl an Standort A und auch Standort B werden unterschiedliche Daten erfasst. Dabei sollen aber natürlich Mitarbeiter egal an welchem Standort die gleichen Daten sehen.

Funktioniert das nur mit einem Im/Export?

Wenn an B nur wenig anfällt, dann kann B remote auf die DB am Standort A zugreifen. Zur Erinnerung: ein PG-Server ist via TCP/IP erreichbar und SSH bereits erfunden.

Andreas

Um der Nachfrage bzgl. Zugriffsgeschwindigkeit via DSL etc. gleich zuvor zu kommen: bei einer Replikation via DSL hättest Du ganz andere Probleme mit Zugriffsgeschwindigkeiten…

Andreas

Solange man sicher sein kann, dass nicht an zwei Standorten Mitarbeiter die gleichen Daten ändern, kann man so etwas auch anders lösen.

Mir schwebt da ein Szenario, auch ala Slony, vor, das die Änderungen spoolt und dann überträgt. Das wird zwar nie in Echtzeit klappen, aber Slony ist hier vielleicht auch etwas viel Aufwand.

Eure Probleme, die Slony nicht lösen kann sind so Sachen wie: neue Datensätze einfügen (eindeutige IDs, lösbar mit globalen IDs), Updates migrieren ect.

Wie akretschmer schon schreibt, gibt es zwar die Möglichkeit remote auf die Datenbank zuzugreifen, aber ich habe festgestellt, das dies auch nicht schnell genug läuft. Ich wollte die Einbuchung ins Lager über ein “Webformular” lösen.
Leider ist die Geschwindigkeit nicht die, die ich erwartet hätte. Der Server ist über eine 3456/448 kBit/s Leitung verbunden.

Wenn ich pgpool richtig verstanden habe, funktioniert die Software als eine Art Y-Kabel. Sie verteilt die Daten auf die zwei Datenbanken. Ist das korrekt? Aber selbst dann hätte ich das Problem, dass mir der Benutzer des Webformulares “warten” muss, bis der zweite Server auch seine Daten hat.

Wie machen das z. B. Benutzer eines Shops? Die haben doch auch eine Datenbank irgendwo im Netz bei einem Provider und sicherlich eine Lokale auf ihrem Server in der Firma. Wie kommen z. B. die Bestellungen in ihre lokale Datenbank?

Was genau geht denn über die Leitung? Ein simples INSERT eines einzelnen Datensatzes sollte doch kein Problem darstellen.

Andreas

Ich habe das Webfrontend mit PHP gemacht. Es handelt sich dabei um eine Einbuchung in einer Matrix.
Es werden also in einer Tabelle bestimmte Koordinaten angesprochen die unsere Produkte darstellen. Dort werden dann Mengen eingetragen. Dann wird das Formular abgeschickt. Es können hier bis zu 784 Koordinaten belegt werden. Was meist natürlich nicht der Fall ist, aber es könnte vorkommen.
Das Abschicken dauert mir zu lange.
Das Formular wird sehr langsam verarbeitet!

Ich dachte über Slony-I könnte ich das verarbeiten des Formulares beschleunigen. Der könnte dann im Hintergrund die Daten in unseren Server “kopieren”.

Das möchtest du nicht wirklich wissen!
Da habe ich schon die krankesten Lösungen gesehen, angefangen von stündlichen oder täglichen Imports bis hin zu irgendwelchen kranken Scripten, die das auflösen sollen … und doch irgendwann scheitern.

Sowas habe ich mir schon gedacht :wink:
Wie genau wäre dann eine schöne Lösung? Nur eine Datenbank benutzen?

Nein, aber etwas angepasstes entwickeln, was auf eure Probleme eingeht.

Ich dachte das würde ich gerade tun.
Oder bin ich hier in diesem Forum falsch?
Ich möchte/muss PostgreSQL einsetzen.

Wieviel KByte oder MByte sind das, wieviel über die Leitung geht? Was genau dauert, hast Du mal mit EXPLAIN geschaut?

Andreas

store listen (origin = 1, provider = 1, receiver = 2);
store listen (origin = 2, provider = 2, receiver = 1);

Was genau sagt eigentlich diese Zeile aus?

Nach der Anleitung von dieser Seite Slony konfigurieren

Abschließend können wir mit ‘store listen’ festlegen, welcher Server auf welchen Server hören soll. Wir definieren sozusagen, die möglichen Datenhighways für die Replikation. In unserem Beispiel wollen wir, dass sowohl von Node 1 an Node 2 als auch von Node 2 an Node 1 Daten geschickt werden können. Bei manchen Installationen ist es nicht notwendig, dass jeder mit jedem sprechen muss - ‘store listen’ trägt diesem Umstand Rechnung.

habe ich das so verstanden, dass beide Server Daten schreiben können. Oder verstehe ich das einfach falsch?

Hi,

Da ich mich auch lange mit Slony gespielt habe und nicht recht glücklich geworden bin mit dieser Lösung hab ich nach Alternativen gesucht…

Da mein System in einer Java Umgebung läuft und ich JDBC benutze hab ich ein tolles (sehr günstiges) Produkt gefunden: a8cjdbc, sehr schnell, einfache Integration in das bestehende System (5 minuten benötigt…) und nun habe ich 2 synchrone PostgresDBs auf 2 Server und noch dazu Lastverteilung beim Lesen…

Falls es jemanden interessiert: (Kurzbericht + Link zur Seite des Herstellers)

Externe Projekte: Wolfgang Koppenberger - SOFTWARE artist - Datenbank Clustering via JDBC - a8cjdbc


lg
Markus

If you have one of these:

  • Savepoints
  • Clobs
  • Blobs
  • CallableStatements
  • Sequences

Ich füge mal noch Probleme mit Timestamps aller Art hinzu und sage, das solche Lösungen nur sehr begrenzt und in einem wohldefiniertem Umfeld einsetzbar sind.