6 Stimmen

Kann MySQL Cluster eine Terabyte-Datenbank verarbeiten?

Ich muss nach Lösungen für die Bereitstellung einer MySQL-Datenbank suchen, die Datenmengen im Terabyte-Bereich verarbeiten kann und hochverfügbar ist (fünf Neunen). Jede Datenbankzeile wird wahrscheinlich einen Zeitstempel und bis zu 30 Float-Werte enthalten. Die erwartete Arbeitslast beträgt bis zu 2500 Inserts/Sek. Die Abfragen werden wahrscheinlich weniger häufig erfolgen, könnten aber umfangreich sein (vielleicht 100 GB Daten), obwohl wahrscheinlich nur einzelne Tabellen betroffen sind.

Ich habe mir MySQL Cluster angesehen, da dies ihr HA-Angebot ist. Aufgrund des Datenvolumens müßte ich die plattenbasierte Speicherung nutzen. Realistischerweise denke ich, dass nur die Zeitstempel im Speicher gehalten werden könnten und alle anderen Daten auf der Festplatte gespeichert werden müssten.

Hat jemand Erfahrung mit der Verwendung von MySQL Cluster für eine Datenbank dieser Größenordnung? Ist das überhaupt praktikabel? Wie wirkt sich die plattenbasierte Speicherung auf die Leistung aus?

Ich bin auch offen für andere Vorschläge, wie man die gewünschte Verfügbarkeit für diese Datenmenge erreichen kann. Wäre es zum Beispiel besser, eine Bibliothek eines Drittanbieters zu verwenden wie Sequoia um das Clustering von Standard-MySQL-Instanzen zu handhaben? Oder eine einfachere Lösung, die auf MySQL-Replikation basiert?

Die einzige Bedingung ist, dass es sich um eine MySQL-basierte Lösung handeln muss. Ich glaube nicht, dass MySQL für die Daten, mit denen wir zu tun haben, der beste Weg ist, aber es ist eine harte Anforderung.

2 Stimmen

Wenn Sie sich nach Technologien umsehen, können Sie einige Projekte in Betracht ziehen, die auf BigTable von Google basieren. HBase von Hadoop und Hypertable sind interessante Projekte, die Sie sich ansehen sollten. hadoop.apache.org/hbase et hypertable.org

0 Stimmen

Diese Frage sollte vielleicht besser auf serverfault.com gestellt werden.

3voto

Jeff Ferland Punkte 17180

Was die Geschwindigkeit betrifft, so kann sie bewältigt werden. Was die Größe betrifft, so stellt sich nicht die Frage nach der Größe der Daten, sondern vielmehr nach der Größe des Indexes, da die Indizes vollständig in den Speicher passen müssen.

Ich würde gerne eine bessere Antwort geben, aber die Arbeit mit High-End-Datenbanken ist sehr aufgabenabhängig. Ich müsste viel mehr darüber wissen, was mit den Daten passiert, um weiterhelfen zu können.

0 Stimmen

Die Datenbank speichert einen Strom von zeitgestempelten Daten, die wir mit 50 Hz für eine Reihe von Orten erhalten, daher die 2500 Einfügungen pro Sekunde. Die Konfiguration des Datenstroms kann sich jederzeit ändern, daher kann es eine variable Anzahl von Float-Werten geben. Der Zeitstempel wird der Primärschlüssel sein und einen Index haben. Wir gehen davon aus, dass sich die Zeitstempelspalte im Speicher befindet und die restlichen Daten auf der Festplatte.

0 Stimmen

Dann würde ich den Stapel einfügen. Eine Einfügung / Client / Sekunde für mehrere Zeilen. Eine einfache Master-Master-Replikation ermöglicht Ihnen eine Ausfallsicherung und kann problemlos eine Last von 50 Einfügungen pro Sekunde bewältigen. Die einzige wirkliche Frage ist, wie wichtig es ist, den Verlust einer Probe zu vermeiden, und ich schätze, dass Sie mit 2 oder 3 Sekunden Datenverlust bei einem Serverabsturz zurechtkommen. Als zusätzlicher Hinweis kann die Partitionierung Ihrer Tabelle nützlich sein, wenn Sie einen anderen Index als den Primärschlüssel haben. Möglicherweise gibt es auch Data-Warehousing-Tricks, um diese großen Abfragen zu beschleunigen.

0 Stimmen

Vielen Dank für die Kommentare. Wir dachten, Batch-Inserts wären der richtige Weg. Ich habe einige Berechnungen mit dem Skript ndb_size.pl durchgeführt, und Sie hatten Recht, was die Größe des Indexes angeht. Der benötigte Speicher macht die Verwendung von Cluster nicht praktikabel. Allerdings haben wir heute auch gelernt, dass ein gewisser Datenverlust in Ordnung ist, so dass wir, wie Sie sagten, jetzt eine einfache Replikation in Betracht ziehen.

2voto

Charlie Martin Punkte 106684

Okay, ich a fait lesen Sie den Teil über mySQL als harte Anforderung.

Lassen Sie mich zunächst darauf hinweisen, dass die Arbeitslast, von der Sie sprechen - 2500 Einfügungen/Sekunde, seltene Abfragen, Abfragen, die wahrscheinlich Ergebnismengen von bis zu 10 Prozent des gesamten Datensatzes haben - für jedes relationale Datenbanksystem geradezu pessimal ist.

(Dies erinnert mich an ein Projekt vor langer Zeit, bei dem ich die harte Anforderung hatte, 100 Megabyte Programmdaten über eine RS-422-Leitung mit 9600 Baud (ebenfalls eine harte Anforderung) in weniger als 300 Sekunden (ebenfalls eine harte Anforderung) zu laden. Die Tatsache, dass 1 KByte/Sek × 300 Sekunden = 300 KByte, schien nicht zu kommunizieren).

Dann ist da noch der Teil über "enthalten hasta 30 schwimmt". Die Formulierung deutet zumindest darauf hin, dass die Anzahl der Stichproben pro Einfügung variabel ist, was wiederum auf einige Normalisierungsprobleme hindeutet - oder darauf, dass jede Zeile 30 Einträge breit sein muss und NULLs verwendet werden.

Aber abgesehen davon, okay, Sie sprechen von 300 KByte/Sekunde und 2500 TPS (vorausgesetzt, es handelt sich wirklich um eine Sequenz von nicht zusammenhängenden Samples). Diese Reihe von Benchmarks Zumindest liegt es nicht außerhalb des Bereiches des Möglichen.

0 Stimmen

Danke für die Kommentare und dafür, dass ich ein neues Wort gelernt habe! (pessimal) Um mit der variablen Anzahl von Proben umzugehen, denken wir daran, jedes Mal eine neue Tabelle zu erstellen, wenn sich die Anzahl der Proben ändert, da dies nicht allzu oft vorkommen sollte. Wir würden dann eine Nachschlagetabelle haben, die es Ihnen ermöglicht, die entsprechende Datentabelle für einen bestimmten Zeitraum zu finden.

2voto

Ólafur Waage Punkte 66497

Dieser Artikel ist sehr hilfreich, um herauszufinden, was eine große MySQL-Datenbank verlangsamen kann.

1voto

Dean Hiller Punkte 17963

Probieren Sie vielleicht Hibernate Shards aus und lassen Sie MySQL auf 10 Knoten mit je 1/2 Terabyte laufen, so dass Sie dann 5 Terabyte handhaben können ;) gut über Ihrem Limit, denke ich?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X