Frage

Ich arbeite an einer Web-Anwendung, die irgendwo zwischen einem E-Mail-Dienst und einem sozialen Netzwerk ist. Ich halte es für das Potential in der Zukunft wirklich groß zu wachsen hat, also bin ich besorgt über die Skalierbarkeit.

Statt einer zentralen MySQL / InnoDB-Datenbank verwenden und Partitionieren es dann, wenn die Zeit kommt, habe ich beschlossen, eine separate SQLite-Datenbank für jeden aktiven Benutzer zu erstellen:. Einen aktiven Nutzer pro ‚Scherbe‘

Auf diese Weise die Sicherung die Datenbank würde so einfach sein wie das Kopieren jeden Benutzer kleine Datenbankdatei an einen entfernten Ort einmal pro Tag.

Scaling-up wird so einfach wie das Hinzufügen zusätzliche Festplatten die neuen Dateien zu speichern.

Wenn die App über einen einzigen Server wachsen kann ich den Server auf Dateisystemebene miteinander verbindet GlusterFS und führen Sie die App unverändert oder rig ein einfaches SQLite-Proxy-System verwenden, die jeder Server SQLite-Dateien in benachbarten Server manipulieren können.

Concurrency Probleme werden minimal sein, da jede HTTP-Anforderung nur eine oder zwei Datenbankdateien in einer Zeit, aus tausend und SQLite nur Blöcke berühren auf liest sowieso.

Ich wette, dass dieser Ansatz meiner App anmutig zu skalieren ermöglichen und unterstützen viele coole und unique Funktionen. Bin Wetten ich falsch? Bin ich etwas fehlt?

UPDATE habe ich beschlossen, mit einer weniger extremen Lösung zu gehen, die bisher in Ordnung arbeiten. Ich bin mit einer festen Anzahl von Scherben - 256 SQLite-Datenbanken, um genau zu sein. Jeder Benutzer zugeordnet ist und gebunden an einen zufälligen Scherbe durch eine einfache Hash-Funktion.

Die meisten Funktionen meiner App benötigen Zugriff auf nur einem oder zwei Scherben pro Anfrage, aber es ist eine insbesondere auf 10 bis 100 verschiedene Scherben von 256, abhängig von den Benutzern die Ausführung einer einfachen Abfrage erfordert. Tests zeigen, es würde etwa 0,02 Sekunden in Anspruch nehmen, oder weniger, wenn alle Daten im RAM zwischengespeichert werden. Ich glaube, ich kann damit leben!

Update 2.0 portierte ich die App zu MySQL / InnoDB und konnte etwa die gleiche Leistung für regelmäßige Anfragen bekommen, aber für diese eine Anforderung, die Scherbe zu Fuß erfordert, innodb ist 4-5 mal schneller . Aus diesem Grund und aus anderen Gründen, ich bin Fallenlassen dieser Architektur, aber ich hoffe, dass jemand irgendwo eine Verwendung für sie findet ... Dank.

War es hilfreich?

Lösung

Der Ort, wo dies nicht gelingen wird, wenn Sie tun, was „Scherbe walking“ genannt -, die alle Daten über einen Haufen sind, herauszufinden, von verschiedenen Benutzern. Diese besondere Art von „Abfrage“ wird programmatisch durchgeführt werden, wobei jeder der SQLite-Datenbanken wiederum zu fragen - und wird sehr wahrscheinlich die langsamste Aspekt Ihrer Website sein. Es ist ein weit verbreitetes Problem in jedem System, in dem Daten „sharded“ in separaten Datenbanken wurde.

Wenn alle der Daten wird dem Benutzer in sich geschlossene, dann sollte dies ziemlich gut skalieren - der Schlüssel, um dies eine effektive Gestaltung wissen, wie die Daten, die wahrscheinlich verwendet werden wird und wenn Daten von einer Person mit Daten aus einem anderen werden (im Kontext) interagieren.

Sie müssen möglicherweise auch für Dateisystemressourcen aufgepasst - SQLite ist groß, fantastisch, schnell, usw. - aber Sie haben einige Caching und Schreiben Vorteile erhalten, wenn eine „Standard-Datenbank“ können (dh MySQL, PostgreSQL, etc.), weil wie sie entworfen. In Ihrer vorgeschlagenen Konstruktion, werden Sie auf einige davon fehlen werden.

Andere Tipps

Klingt für mich wie ein Alptraum in Sachen Wartung. Was passiert, wenn das Schema auf all diesem DBs ändert;

Ein mögliches Problem ist, dass für jeden Benutzer eine Datenbank aufweist, wird Speicherplatz und verfügbaren RAM sehr ineffizient, und als die Benutzerbasis den Vorteil der Verwendung eines leichten und schnellen Datenbank-Engine vollständig verloren gehen wächst.

Eine mögliche Lösung für dieses Problem ist " minishards " zu schaffen, die aus vielleicht 1024 SQLite Datenbanken Gehäuse bis zu 100 Benutzern jeweils . Dies wird effizienter als die DB pro Benutzer Ansatz, da die Daten effizienter verpackt. Und leichter als der InnoDB-Datenbank-Server-Ansatz, weil wir mit SQLite.

Concurrency auch ziemlich gut, aber Anfragen werden weniger elegant (shard_id yuckiness). Was denken Sie?

http://freshmeat.net/projects/sphivedb

SPHiveDB ist ein Server für SQLite-Datenbank. Es verwendet JSON-RPC über HTTP eine Netzwerkschnittstelle zu belichten SQLite-Datenbank zu verwenden. Es unterstützt mehrere SQLite-Datenbanken in einer einzigen Datei zu kombinieren. Es unterstützt auch die Verwendung von mehreren Dateien. Es ist für das extreme sharding Schema entworfen -. Eine SQLite-Datenbank pro Benutzer

Wenn Sie eine separate Datenbank für jeden Benutzer erstellen, es klingt wie Sie nicht Beziehungen einrichten ... also warum überhaupt eine relationale Datenbank verwenden?

Ich betrachte diese gleiche Architektur wie ich im Grunde die Server-Seite SQLLite Datenbanken als Datensicherung und Synchronisierung Kopie für Kunden nutzen wollte. Meine Idee für über alle Daten, die Abfrage ist Sphinx für die Volltextsuche zu verwenden und Hadoop Arbeitsplätze von flachen Deponien aller Daten zu Scribe laufen und dann die Ergebnisse als webservies aussetzen. Dieser Beitrag gibt mir Denkpause jedoch, so dass ich hoffe, die Menschen mit ihrer Meinung reagieren, wird sich fortsetzen.

Wenn Ihre Daten sind dies einfach zu Scherbe, warum verwendet nicht nur einen Standard-Datenbank-Engine, und wenn Sie groß genug skalieren, dass die DB die Engpass wird, Scherbe die Datenbank, mit verschiedenen Benutzern in verschiedenen Instanzen? Der Effekt ist der gleiche, aber du bist nicht Noten von winzig kleinen Datenbanken.

In Wirklichkeit haben Sie wahrscheinlich zumindest einige Daten geteilt, die für jeden einzelnen Benutzer nicht gehört, und Sie wahrscheinlich häufig Daten zugreifen müssen für mehr als einen Benutzer. Dies führt dazu, Probleme mit beiden Systemen, though.

Mit einer Datenbank pro Benutzer würde es einfach einzelne Benutzer Daten natürlich wieder herzustellen, aber wie @John sagte, Schemaänderungen würden einige Arbeit erfordern.

Nicht genug, um es schwer zu machen, aber genug, um es nicht trivial.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top