Was ist die moderne Methode, um PostgreSQL auf mehreren Rechnern zu partitionieren, wenn die Daten „natürlich partitionierbar“ sind?

22

Nach einigen Jahren im "NoSQL" -Raum habe ich jetzt ein Problem, das seiner Natur nach ziemlich "relational" ist. Heute sehe ich Datenspeicher mit ganz anderen Augen als zuvor. Dinge wie Riak haben mich auf eine Weise verwöhnt, dass ich einzelne Fehlerpunkte, Wartungsarbeiten usw. nicht mehr tolerieren kann. Natürlich (oder ich hoffe) habe ich meine geistige Gesundheit nicht völlig verloren. Dies ist ein persönliches Projekt, an das (noch) keine extrem hohen Anforderungen gestellt werden.

Die meisten der Sharding-Lösungen geben mir nicht das, was ich will (zumindest auf einen Blick), wahrscheinlich, weil mein Problem ziemlich "einfach" zu lösen ist. Zumindest auf konzeptioneller Ebene (Ignorieren der Einschränkungen, die RDBMs selbst auf den Tisch bringen).

  1. Ich habe eine kleine Menge "geteilter" Daten, die frei vervielfältigt werden können. Es gibt keine Anforderungen an die Konsistenz. Dies kann in einer dynamoähnlichen Datenbank gespeichert werden und wird unendlich skaliert. Aber ich würde immer noch gerne mit einer einzigen Datenbank arbeiten, wenn möglich.

  2. Ich habe viele "Pro-Benutzer" -Daten. Das heißt - viele Benutzer, bei denen jeder Benutzer Daten von absolut angemessener Größe hat, können wirklich auf einem einzelnen PostgreSQL-Knoten gespeichert werden. Wir sprechen von maximal Zehntausenden von Datensätzen.

  3. Ich muss niemals benutzerübergreifende Fragen stellen und ich brauche keine benutzerübergreifende Atomarität.

Das klingt sehr einfach zu erreichen. Zumindest, wenn ich es mit meinen "NoSQL-Augen" betrachte.

Hier sind meine naiven Einstiegsideen:

  1. Im Extremfall könnte ich einfach den gesamten Benutzer als einen einzelnen Schlüssel / Wert in Riak serialisieren. Natürlich wird die ständige De- / Serialisierung von mehreren Megabyte Daten langsam sein und deshalb erwäge ich die Verwendung von PostgreSQL. Viele Riak K / Vs sind ein No-Go, da ich Atomizität / Transaktionen in den Daten jedes Benutzers benötige.

  2. Ich könnte eine SQLite-Datenbank pro Benutzer verwenden und so etwas wie GlusterFS für die Redundanz / Verfügbarkeit verwenden. Dies ist wahrscheinlich die Lösung, die ich wählen werde, wenn ich mit PostgreSQL nicht das Gleiche finde. Vorteile: Kann sehr gut hoch / runter skalieren; Nachteile: Ich würde es vorziehen, PostgreSQLs Typen und Strenge gegenüber SQLite zu haben

Also, was würde ich im Idealfall von einer PostgreSQL-Sharding-Lösung verlangen:

  1. Bewahren Sie automatisch mehrere Kopien der Daten jedes Benutzers auf (auf verschiedenen Computern). Sie können den Masterknoten dynamisch pro Benutzer / Shard wechseln (wenn der vorherige Master ausfällt).
  2. Sie können die Skalierung dynamisch erhöhen / verringern, indem Sie Serverknoten hinzufügen / entfernen. Meistens so, wie Riak es kann.
  3. Meine Anwendung muss nicht wissen, mit welchen Knoten und wann gesprochen werden soll.
Lachse
quelle
Hi loxs, wie hast du dieses Problem letztendlich gelöst?
Dikla
Partitionierung auf Anwendungsebene mit mehreren Datenspeichern. Eigentlich ein ziemliches Durcheinander :(. Wirklich
schade,

Antworten:

5

Postgres-XL versucht, dieses Problem ab 2014 zu lösen. Sie zielen direkt auf Big Data in PostgreSQL ab und haben Entwickler von Stado an Bord.

Mike Burton
quelle
Das sieht super interessant aus.
John Powell
Und dann gibt es noch Postgres-XC: sourceforge.net/projects/postgres-xc
a_horse_with_no_name
4

Ich denke, die beste Option ist pgpool-II . Sie können bis zu 128 Knoten und haben

  1. Es ist möglich, komplexe Partitionierungs- und Datenverteilungsregeln einzurichten
  2. Unterstützt "Online Provisioning". Schreibvorgänge werden nicht skaliert, der Lesevorgang ist jedoch skalierbar
  3. Nein, wenn möglich sofort. Möglicherweise müssen Sie LVS verwenden

Eine andere Option könnte Stado sein

mys
quelle