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).
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.
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.
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:
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.
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:
- 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).
- Sie können die Skalierung dynamisch erhöhen / verringern, indem Sie Serverknoten hinzufügen / entfernen. Meistens so, wie Riak es kann.
- Meine Anwendung muss nicht wissen, mit welchen Knoten und wann gesprochen werden soll.
Antworten:
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.
quelle
Ich denke, die beste Option ist pgpool-II . Sie können bis zu 128 Knoten und haben
Eine andere Option könnte Stado sein
quelle