Wie verwalte ich Millionen von Benutzern?

17

Ich bin dabei, etwas wirklich Großes auf den Weg zu bringen. Ich muss meinen Server und meine Datenbank vorbereiten.

Ich möchte jede Gruppe von 100.000 Benutzern in separaten Benutzertabellen gruppieren, kann jedoch keinen Benutzer zuordnen, der versucht, sich bei der entsprechenden Benutzertabelle anzumelden.

Woher weiß ich beispielsweise, dass der Benutzer [email protected]mit der Benutzertabelle # 36 in Beziehung steht?

Wäre es dasselbe, 10 Millionen Benutzer in einer Benutzertabelle oder 100 von 100.000 zu haben?

Wie geht Facebook? Ich kann nicht glauben, dass sie eine globale Benutzertabelle mit 950 Millionen Einträgen haben würden.

JNK
quelle
I can't believe they would have one global user table with 950 million entries.Ich kann, es ist nicht so groß. Ich habe mit größeren Tischen gearbeitet. Es ist ziemlich häufig. Die andere Option, die ich in Betracht ziehen würde, wenn Sie viele andere Daten haben, ist eine NoSQL- Datenbank.
NimChimpsky
5
Wenn Sie vorhaben, eine große Anzahl von Benutzern und eine große Datenmenge zu haben, müssen Sie einen Datenbankspezialisten beauftragen, um dies zu entwerfen. Ich würde niemanden anschauen, der nicht mindestens zehn Jahre Erfahrung im Datenbankdesign und mindestens fünf Jahre Erfahrung im Datenbankdesign hat. Dies ist ein komplexes Teilprojekt, das umfangreiche Kenntnisse erfordert.
HLGEM

Antworten:

30

Sie werden morgen keine Milliarde Benutzer haben und MySQL kann problemlos mehrere Millionen Zeilen verarbeiten. Ich habe 5 Millionen Benutzer in meiner Benutzertabelle und vertraue mir, es ist nicht einmal mein Radar der Dinge, über die ich mir Sorgen machen muss.

Kümmere dich nicht um Sharding , bis Sie brauchen , es zu tun. Sie versuchen, vorzeitig eine Optimierung für ein Problem durchzuführen, das möglicherweise nicht vorhanden ist, und dabei wird die Innovationsrate erheblich beeinträchtigt. Seien Sie schnell zu starten und finden Sie die Probleme, wie sie kommen. Sie können Ihre Skalierungsherausforderungen nicht im Voraus vorhersagen.

Wann und wann immer Sie diese Größenordnung erreichen, haben Sie eine Menge Geld und Ressourcen, um diese Art von Problem zu lösen.

Aaron Brown
quelle
4
Be fast to launch and find the problems as they comeDieser Teil ist ausgezeichnet. Das ist richtig. Wenn wir Probleme feststellen, wird es zu einem späteren Zeitpunkt keine ernsthaften Probleme geben. +1
ALH
16

Ich bin mir nicht sicher, ob externe Berater die bessere Unterstützung für Ihr Unternehmen darstellen, wenn Sie mit sehr großen Datenmengen arbeiten und von Grund auf neu beginnen müssen. Verstehen Sie mich bitte nicht falsch, aber wenn jemand ein Projekt mit so vielen Kunden vermasselt, hat dies PR-Auswirkungen auf Ihr Unternehmen.

In Bezug auf 10 Millionen Tupel in einer Tabelle ist es in Ordnung, wenn Sie eine gute Indizierung haben. Wir müssen hier mehrere 100 Millionen Tupel in einer Tabelle aufbewahren (verkaufte Artikel), was auf einem großen Orakel 11 g gut funktioniert

Hier ist ein Beitrag aus dem Jahr 2010 mit einer Karte von Facebooks DB Design: Facebook-Datenbank-Design

Vielleicht möchten Sie die MySQL-Dokumentation zu Partitionstypen wie folgt lesen: MySQL-Dokumentation: Partitionierung

MySQL unterstützt folgende Typen:

RANGE- Partitionierung. Diese Art der Partitionierung weist Partitionen Zeilen zu, die auf Spaltenwerten basieren, die in einen bestimmten Bereich fallen. Siehe auch Abschnitt 18.2.1, „RANGE-Partitionierung“.

LIST- Partitionierung. Ähnlich wie bei der Partitionierung nach RANGE, mit der Ausnahme, dass die Partition basierend auf Spalten ausgewählt wird, die einem Satz diskreter Werte entsprechen. Siehe auch Abschnitt 18.2.2, „LIST-Partitionierung“.

HASH- Partitionierung. Bei dieser Art der Partitionierung wird eine Partition basierend auf dem Wert ausgewählt, der von einem benutzerdefinierten Ausdruck zurückgegeben wird, der Spaltenwerte in Zeilen verarbeitet, die in die Tabelle eingefügt werden sollen. Die Funktion kann aus einem beliebigen in MySQL gültigen Ausdruck bestehen, der einen nichtnegativen ganzzahligen Wert ergibt. Eine Erweiterung dieses Typs, LINEAR HASH, ist ebenfalls erhältlich. Siehe auch Abschnitt 18.2.3, „HASH-Partitionierung“.

KEY Partitionierung. Diese Art der Partitionierung ähnelt der HASH-Partitionierung, mit der Ausnahme, dass nur eine oder mehrere auszuwertende Spalten angegeben werden und der MySQL-Server eine eigene Hashing-Funktion bietet. Diese Spalten können andere als ganzzahlige Werte enthalten, da die von MySQL bereitgestellte Hashing-Funktion unabhängig vom Spaltendatentyp ein ganzzahliges Ergebnis garantiert. Eine Erweiterung dieses Typs, LINEAR KEY, ist ebenfalls verfügbar. Siehe auch Abschnitt 18.2.4, „KEY-Partitionierung“.

Gans
quelle
7

Teilen Sie Benutzer zunächst nicht in separate Tabellen auf. Es wird die Dinge komplex und sinnlos machen. Datenbanken wie MySQL und andere können problemlos mit den Datenbanken von Millionen von Datensätzen in derselben Tabelle arbeiten (mit den richtigen PRIMARY KEYS). Verwenden Sie das eindeutige Datenbank-Schlüsselfeld AUTO_INCREMENT AND PRIMARY für jeden Benutzer (in der Hauptbenutzertabelle), damit jeder Datensatz eindeutig ist (UID). Dann referenzieren Sie in den anderen Tabellen mit dieser eindeutigen ID. Stellen Sie dann sicher, dass in jeder Tabelle, die Sie als PRIMARY KEY festgelegt haben, die Verarbeitung der Informationen auf dem Datenbankserver beschleunigt wird. Sie können von Drupal CMS lernen, wie die Benutzerinformationen gespeichert werden. In mehr als 10 Jahren von Millionen von Anwendern und sehr großen Unternehmen getestet (von großen Medienunternehmen, Behörden, sogar den größten Banken der Welt). Auf www.drupal. In einer Tabelle sind mehr als 1,6 Millionen Seiten (Knoten) gespeichert, und es werden monatlich mehr als Millionen eindeutige Besucher gezählt. Die Website funktioniert einwandfrei. Alles dreht sich um die richtige Optimierung und Konfiguration.

Wenn Sie nach 10 Millionen Datensätzen mit der Leistung nicht zufrieden sind (nach einer ordnungsgemäßen Optimierung und Änderungen der Datenbankkonfiguration), können Sie entscheiden, ob Sie Benutzer wirklich nach verschiedenen Tabellen trennen möchten. Sie können die Funktionalität also tatsächlich erweitern, indem Sie eine neue Tabelle hinzufügen, die Informationen darüber enthält, wo die Benutzerdatensätze gespeichert sind: UID und Tabellenname. Fordern Sie dann in einer beliebigen anderen Tabelle diese Informationen an, sucht diese Tabelle nach der richtigen Tabelle. Aber ich rate Ihnen wirklich, einen großen Tisch für Benutzer zu haben, es sei denn, Sie haben mehr als 10-100 Millionen Datensätze. Die Leistung wird dadurch jedoch nicht wesentlich verbessert (Datenbanken sind so konzipiert, dass sie mit den großen Datenmengen umgehen können). Es ist besser, die Informationen einfach zu halten. Normalerweise entscheiden sich Unternehmen einfach für einen anderen Datenbankserver (Master und Slaves) und einen anderen. Arbeiten mit der Lastausgleichsfunktion zusammen. Wenn Sie diese 10 Millionen Benutzer haben, könnten Sie für einen anderen Datenbankserver bezahlen, oder?

Siehe das Beispiel des userTabellenschemas in der Datei user.install .

Kenorb
quelle
3

Wie die anderen Antworten andeuten, ist es keine gute Idee, die Benutzer in mehrere Tabellen aufzuteilen. Die meisten Datenbanken mit Indizes auf der Benutzer-ID können Millionen Zeilen verarbeiten. Die Wartezeit pro Abfrage kann sich jedoch in Abhängigkeit von der Gesamtzahl der Einträge im Index erhöhen. Solange das Dataset klein ist, können Sie mit einer einzelnen Tabelle in normalen Datenbanken arbeiten.

Ich werde versuchen, auch für Ihre künftige Überlegung eine andere Idee einzubringen, wenn Sie weit über eine Million Datensätze hinauswachsen. Bei solch einer großen Anzahl von Kunden möchten Sie keine Ausfallzeiten usw. Also gibt es eine Reihe von NOSQL-Datenbanken, die Sie sich ansehen möchten. Sie erledigen das Sharding für Sie, anstatt dass Sie das Sharding selbst aus der Anwendung heraus verwalten. Sie sorgen außerdem für Datenredundanz und damit für eine längere Betriebszeit. Facebook und alle verwenden Memcache usw. für ihren Cache. Aber ich bin mir nicht sicher, was sie für ihren permanenten Laden verwenden.

Eine wichtige Sache, die Sie beachten sollten, ist, dass Sie keine Joins usw. mit NOSQL-Datenbanken ausführen können. Planen Sie also Ihren Verwendungszweck und entscheiden Sie. Wenn Verknüpfungen und Transaktionen mit mehreren Datensätzen für Sie eine Notwendigkeit sind, sind NOSQL-Datenbanken nichts für Sie.

sunil
quelle
-3

Warum nicht anhand des alphabetischen Bereichs teilen? Wenn Sie Millionen von Benutzern haben, erstellen Sie für jeden Buchstaben oder für jedes Buchstabenpaar eine separate Tabelle (Tabelle 'a' für Benutzer, deren Benutzername mit 'a' beginnt). Anfangs wird es viel Aufwand bedeuten, aber da Sie eine große Datenbank erwarten und in der Lage sein möchten, zu unterscheiden, welche Tabelle für einen bestimmten Benutzer verwendet werden soll, ist die alphabetische Reihenfolge die naheliegende und einfachste Wahl.

mnmnc
quelle
9
Das ist eine super schlechte Idee. Beispielsweise muss Ihre Software Zeilen automatisch migrieren, wenn Benutzer den Nachnamen ändern ... es sei denn, Sie kümmern sich nicht mehr um die Konsistenz. Diese Strategie lädt diese Arten von Eventualverbindlichkeiten ein.
Randomx