USABLE Multi-Master-Replikation für Postgres?

16
  1. Ich habe Postgres-XC ausprobiert und es implementiert noch kein vollständiges SQL (wie SERIAL)

  2. Postgres-R sieht interessant aus, ist aber laut Entwicklern "nicht produktionsbereit".

Also habe ich pgpool-II 3.0.1 benutzt. Ja, es funktioniert gut. Aber soweit ich das sehe, ist es nur für 2 PG-Knoten.

Gibt es irgendetwas, das tatsächlich produktionsbereit und in der Lage ist, mit mehreren PG-Knoten zu arbeiten?

mrkafk
quelle
Vor ein paar Jahren sind wir mit dem gleichen Problem aufgetaucht. Irgendwann haben wir alle unsere Sachen auf Oracle umgestellt. Hoffentlich finden Sie in diesen Tagen eine brauchbare Multimaster-Replikation, die ich nicht gesehen habe ... Viel Glück, trotzdem.
Grufftech
2
PostgreSQL ist eine eigene Dokumentation sagt eine Middleware - Anwendung verwenden :) ..“ Synchrone Multimaster - Replikation .. PostgreSQL nicht bieten diese Art der Replikation, obwohl PostgreSQL zwei-Phasen - Commit (PREPARE TRANSACTION und COMMIT VORBEREITET) können verwendet werden , um diese in implementieren Anwendungscode oder Middleware "
warren
Sie sind nicht auf zwei Knoten beschränkt.
Foocorpluser

Antworten:

6

Haben Sie über Bucardo nachgedacht ? Es ist asynchroner Multimaster. Es hat sich nicht ganz durchgesetzt und ist keine generelle Lösung, aber es könnte einen Versuch wert sein.

Peter Eisentraut
quelle
1
Anscheinend war ich nicht spezifisch genug: Ich benötige eine synchrone Replikation. Außerdem, was ist die Bedeutung davon in FAQ? "Kann Bucardo zwischen mehr als zwei Mastern replizieren? Nein. Derzeit unterstützt Bucardo nur Master-to-Master (und natürlich auch Master für viele Slaves)." Also ist es Multi-Master oder nicht?
Mrkafk
4
Nur wenn Ihre Definition von "multi" "2" ist!
Hmallett
Bitte beachten Sie, dass ab Bucardo 5 die Beschränkung von nur 2 Mastern aufgehoben wurde
Joril,
3

Ich muss Peters Einschätzung zustimmen: Derzeit gibt es keine wirklich gute Multi-Master-Replikation für Postgres. (Eine echte Multi-Master-Replikation durchzuführen ist ein sehr schwieriges Problem, und ich bin mit keiner der verfügbaren Lösungen verliebt.)

Cribbing Wikipedia Liste der möglichen Lösungen, die Sie untersuchen möchten:

PostgreSQL bietet mehrere Lösungen für die Multi-Master-Replikation, einschließlich Lösungen, die auf einem Zwei-Phasen-Commit basieren. Es gibt Bucardo, Rubyrep, PgPool und PgPool-II, PgCluster und Sequoia sowie einige proprietäre Lösungen. Ein weiterer vielversprechender Ansatz zur Implementierung einer eifrigen (synchronen) Replikation ist Postgres-R, der sich jedoch noch in der Entwicklung befindet. Ein weiteres Projekt, das die synchrone Replikation implementiert, ist Postgres-XC. Postgres-XC befindet sich ebenfalls noch in der Entwicklung.

voretaq7
quelle
Wow, nur diese Liste zu lesen, ist für mich ein Schock und ein Schrecken. :)
Peter Eisentraut
Für mich ist es Depression und Abscheu :-)
voretaq7
Ich würde denken, dass die Verwendung eines Systems ähnlich wie etcd für die Konfiguration und die Kommunikation möglich wäre und möglicherweise eine Update-Anweisung innerhalb eines zweiphasigen Commits ausgeführt würde. Ich würde wirklich eine nahezu automatische Lösung dafür lieben
Tracker1
3

Dies ist stark Java-orientiert, aber native Datenbank-Client-APIs können mit JDBC-Datenquellen überbrückt werden. Tungsten Myosotis ist ein Beispiel für das native JDBC-Bridging von MySQL.


  • Wolfram Enterpriese ist gut für asynchrone Multi-Master. Ich denke, es funktioniert für MySQL, PostgreSQL und Oracle. Es kann eigenständig oder eingebettet in eine Java-Anwendung ausgeführt werden. Ich habe gesehen, dass es für MySQL funktioniert, aber sie behaupten, PostgreSQL. Ihre Replikator-Komponente ist Open Source, aber die vollständige Lösung umfasst mehr Teile und erfordert Lizenzkosten. Ursprünglich hatte Continuent Sequoia für Multi-Master-Synchronous, aber sie haben es aufgegeben und stattdessen Tungsten für Multi-Master-Asynchronous erstellt. Wolfram ist in Java geschrieben, daher bieten sie Myosotis zur Überbrückung nativer Datenbankclients an.

  • SymmetricDS eignet sich für asynchrone Multi-Master-Anwendungen. Es ist Open Source. Es installiert / deinstalliert Trigger, um Aktualisierungen zu erfassen, anstatt die Bin-Protokollierung durchzuführen. Es kann eigenständig oder eingebettet in eine Java-Anwendung ausgeführt werden.

  • HA-JDBC eignet sich für Multi-Master-Synchron. Es ersetzt ältere nicht mehr verfügbare Software wie C-JDBC und Sequoia. Es ist Open Source. Es verwendet ein zweiphasiges Festschreiben und funktioniert für PostgreSQL, MySQL, Oracle, SQL Server, Derby, Sybase und viele andere über Dialekte. Es ist hauptsächlich für eingebettete Anwendungen gedacht, die in eine Java-Anwendung eingebettet sind, um diese mit PostgreSQL zu verbinden. Verteilte Sperren, Sequenzen, Zeit, Rand usw. werden von jGroups von Redhat / JBoss verwaltet. Eine nette Funktion ist der Transaktionsmodus "Seriell" anstelle von "Parallel", wenn Ihre App Deadlocks aufweist und kein Rollback unterstützt. Ich habe diesen "seriellen" Modus erfolgreich verwendet, um eine Legacy-App nachzurüsten, die nicht DB-Cluster-fähig war. Daher fehlte der Code für den Transaktionswiederholungsversuch. Der serielle Modus hat den Tag gerettet und ein böses Umschreiben vermieden.

  • H2 ist gut für Multi-Master-Synchron. Es ist Open Source. Es unterstützt eigenständige Datenbanken oder Cluster mit zweiphasigem Festschreiben, ähnlich der HA-JDBC-Architektur, erfordert jedoch keine zusätzliche Komponente für zweiphasiges Festschreiben. Nicht sicher, ob es selbst verteilte Sperren gibt oder von Drittanbietern wie jGroups oder Hazelcast abhängt.

Jede JDBC-basierte Replikation für PostgreSQL und andere Datenbanken benötigt eine native JDBC-Bridge, es sei denn, Ihre Anwendung ist bereits in Java geschrieben. Für MySQL bietet Tungsten Enterprise eine optionale Komponente namens Myosotis an. Ich habe dies erfolgreich verwendet, um PHP / Perl / C / mysqlclient mit JDBC zu verbinden, wobei es sich bei der JDBC-Datenquelle zufällig um eine HA-JDBC-Proxy-Datenquelle handelt, die auf einen MySQL / InnoDB-Cluster mit 4 Knoten verweist.

Tungsten unterstützt PostgreSQL in seinen Replikator- und Routerkomponenten, ist sich jedoch in Bezug auf die Myosotis-Komponente nicht sicher. Könnte sein. Wolfram-Replikator- / Router-Komponenten sind für asynchrone Multi-Master-Verbindungen vorgesehen. Myosotis kann Sie jedoch mit einem alternativen JDBC-Backend wie HA-JDBC oder H2 für synchrone Verbindungen verbinden.

Wenn es eine PostgreSQL-native JDBC-Bridge gibt, würde ich gerne davon erfahren. Theoretisch kann jede Datenbank mit einem JDBC-Treiber vom Typ 4 überbrückt werden. JDBC vom Typ 4 spricht das native Datenbankprotokoll genau wie die native Client-Schnittstelle für diese Datenbank. Daher sollte eine Eins-zu-Eins-Zuordnung von nativen Aufrufen zu JDBC-Aufrufen erfolgen.

Justin
quelle
2

Die Antwort darauf ist ein klares Nein.

Peter Eisentraut
quelle
Es ist ein paar Jahre her, seit ich recherchiert habe, aber meine Firma kam zu diesem Schluss, als wir es versuchten.
grufftech
1

Ich benutze seit 2 Jahren londiste für die Multi-Master-Replikation in postgresql.

Sie stellen Ihre Tabellen mit pg_queue in Warteschlangen und können so viele andere Datenbanken abonnieren, wie Sie möchten. Die Replikation erfolgt atomar nach Warteschlangen und ist sehr widerstandsfähig.

Sie können hier ( http://pgfoundry.org/projects/skytools/ ) über londiste lesen. Dies ist das, was die Skype-Leute für ihren Cluster verwenden. Sie haben es auch erstellt, es ist also doppelt so cool :)

Lynxman
quelle
Hmm, das ist interessant, aber laut dem, was ich hier gesehen habe: wiki.postgresql.org/wiki/… , ist Londiste Master-Slave und asynchron? Wie kann es also Multi-Master sein? Außerdem brauche ich wirklich eine synchrone Replikation: Die Transaktion sollte fehlschlagen, wenn einer der (aktiven) Clusterknoten ausfällt.
Mrkafk
Diese Replikation ist post-transaktional, sonst ist sie recht langsam
Lynxman
Ich möchte nicht wie Arschschmerz klingen (Nitpicking), aber ... 1. Ich habe pgpool-II verwendet und Transaktionen wurden ziemlich schnell durchgeführt (obwohl ich keine Benchmarks durchgeführt habe), und 2. obwohl Einzeltransaktionen sind möglicherweise langsamer. Ich sehe keinen guten Grund für den geringen Gesamttransaktionsdurchsatz. Vielleicht ist der wichtigere Punkt, wie ist Londiste Multi-Master? Kann ich auf PG-Server 1 schreiben und auf 2 replizieren lassen und auf PG-Server 2 schreiben und auf Server 1 replizieren lassen?
Mrkafk
1

Wenn Sie immer noch interessiert sind, versuchen Sie Folgendes: http://www.symmetricds.org/ (nur Java)

Herberth Amaral
quelle
-2

Ich habe ein brauchbares "Multi-Master" -Replikationssystem gefunden:

  1. Holen Sie sich RabbitMQ Sie http://www.rabbitmq.com/ - es ist eine Message Middleware.

  2. Konfigurieren Sie einen Rabbit MQ-Cluster in Rabbit.

  3. Erstellen Sie eine Warteschlange für jeden Knoten in einem Cluster und binden Sie sie an den Austausch vom Typ "Fanout".

Auf diese Weise wird eine an einen beliebigen Knoten und eine beliebige Warteschlange gesendete Nachricht an alle anderen Knoten repliziert. Ich habe einen Arbeitscode dafür!

mrkafk
quelle
2
@mrafk - würdest du den "Arbeitscode" posten / verlinken, den du hast?
Warren
2
Was hat das mit Replikation mit Postgres zu tun? Dadurch werden Nachrichten verteilt. Woher beziehen Sie die Datennachrichten / -aktualisierungen aus der Datenbank und wie werden die Knoten aktualisiert, die die Nachrichten in der Nachrichtenwarteschlange empfangen?
Monksy
3
Dies ist möglicherweise eine Lösung für das grundlegende Problem, mit dem Sie konfrontiert waren, aber keine Antwort auf diese Frage.
Tom Anderson