Entwurf von hoch gleichzeitigem Schreiben in MySQL

WBOY
Freigeben: 2016-08-04 09:19:37
Original
1510 Leute haben es durchsucht

Kürzlich ein Projekt entwickelt. Der Client übermittelt alle 10 Sekunden 100 Datenzeilen an den Server, und der Server schreibt sie, nachdem er auf Duplikate überprüft hat.
Es gibt etwa Zehntausende von Kunden, und die übermittelten Daten sind relativ konzentriert, und das Problem des Datenlesens wird nicht berücksichtigt.
Das aktuelle Design ist:
Die Datenbank ist nach Kunden in Tabellen unterteilt. Die Datenmenge in jeder Tabelle ist nicht groß.
Nachdem der Server die Daten erhalten hat, fügt er sie zunächst in die Redis-Warteschlange ein und fügt sie dann über eine geplante Aufgabe in die Datenbank ein.
Die Frage ist:
1. Kann die vom Server zum Client bereitgestellte Schnittstelle Tausende von Clients gleichzeitig versorgen (der Client übermittelt einmal alle 10 Sekunden)?
2. Speichern Sie zuerst die Daten in der Redis-Warteschlange. Wenn es Dutzende oder Millionen von Daten gibt, ist Redis stabil?
Das grundlegende Ziel besteht darin, sicherzustellen, dass der Server Dienste normal bereitstellen kann.

---------------------- Ergänzende Inhalte----------------------- --------
Das Projekt sammelt hauptsächlich Benutzerdaten. Es wird automatisch ausgeführt, wenn Sie den Computer einschalten.
Senden Sie jedes Mal 100 Elemente, einmal alle 10 Sekunden. Im Allgemeinen übermitteln Benutzer innerhalb von 10 Mal am Tag, also innerhalb von 1.000 Daten.
Jedes Datenelement enthält fünf oder sechs Wertepaare und ist maximal 100 Zeichen lang.
Die Integrität der täglichen Daten muss sichergestellt werden. Es wird Situationen geben, in denen mehrere Clients dieselben Benutzerdaten sammeln, daher muss eine Duplizierung vermieden werden.

Bedenken Sie nun Folgendes:
Die Datentabelle ist nach Benutzern in Tabellen unterteilt.
Die vom Benutzer übermittelten Daten werden zunächst je nach Benutzer in der Redis-Warteschlange gespeichert, d. h. jeder Benutzer hat eine Warteschlange pro Tag. Nach dem Speichern in der Datenbank wird die Warteschlange gelöscht.

Antwortinhalt:

Kürzlich ein Projekt entwickelt. Der Client übermittelt alle 10 Sekunden 100 Datenzeilen an den Server, und der Server schreibt sie, nachdem er auf Duplikate überprüft hat.
Es gibt etwa Zehntausende von Kunden, und die übermittelten Daten sind relativ konzentriert, und das Problem des Datenlesens wird nicht berücksichtigt.
Das aktuelle Design ist:
Die Datenbank ist nach Kunden in Tabellen unterteilt. Die Datenmenge in jeder Tabelle ist nicht groß.
Nachdem der Server die Daten erhalten hat, fügt er sie zunächst in die Redis-Warteschlange ein und fügt sie dann über eine geplante Aufgabe in die Datenbank ein.
Die Frage ist:
1. Kann die vom Server zum Client bereitgestellte Schnittstelle Tausende von Clients gleichzeitig versorgen (der Client übermittelt einmal alle 10 Sekunden)?
2. Speichern Sie zuerst die Daten in der Redis-Warteschlange. Wenn es Dutzende oder Millionen von Daten gibt, ist Redis stabil?
Das grundlegende Ziel besteht darin, sicherzustellen, dass der Server Dienste normal bereitstellen kann.

---------------------- Ergänzende Inhalte----------------------- --------
Das Projekt sammelt hauptsächlich Benutzerdaten. Es wird automatisch ausgeführt, wenn Sie den Computer einschalten.
Senden Sie jedes Mal 100 Elemente, einmal alle 10 Sekunden. Im Allgemeinen übermitteln Benutzer innerhalb von 10 Mal am Tag, also innerhalb von 1.000 Daten.
Jedes Datenelement enthält fünf oder sechs Wertepaare und ist maximal 100 Zeichen lang.
Die Integrität der täglichen Daten muss sichergestellt werden. Es wird Situationen geben, in denen mehrere Clients dieselben Benutzerdaten sammeln, daher muss eine Duplizierung vermieden werden.

Bedenken Sie nun Folgendes:
Die Datentabelle ist nach Benutzern in Tabellen unterteilt.
Die vom Benutzer übermittelten Daten werden zunächst je nach Benutzer in der Redis-Warteschlange gespeichert, d. h. jeder Benutzer hat eine Warteschlange pro Tag. Nach dem Speichern in der Datenbank wird die Warteschlange gelöscht.

  1. Einfügungen zusammenführen, nicht einzeln einfügen. Führen Sie beispielsweise 1000 Einfügungen zusammen, die demselben Einfügevorgang entsprechen. Dies kann die Anzahl der Interaktionen verringern

  2. Wenn diese Tabelle nur einfache Einfüge- und Abfragevorgänge ausführt und keine Transaktionsunterstützung erfordert, können Sie die Verwendung der MyISAM-Engine in Betracht ziehen. Im Vergleich zu InnoDB können Sie beim Einfügen eine höhere Leistung erzielen

Erstens gibt es mehrere Überlegungen

  1. Ist die Bandbreite ausreichend

  2. Die Anzahl der CPUs, wenn 4 Kerne vorhanden sind und die Anzahl der PHP-FPM ebenfalls 4 beträgt, dauert die Verarbeitung jeder Anfrage 50–150 ms. Berechnen Sie die ungefähre Anzahl der innerhalb der Dauer verarbeiteten Anfragen.

  3. Speicher, ein Prozess belegt 10-25 MB Speicher.

Dinge, die in Betracht gezogen werden können, umfassen: Lastausgleich und DNS-Abfragen. Achten Sie auch auf die hohe Verfügbarkeit des Clusters.

Zweitens gibt es mehrere Überlegungen

  1. Datenzeile, wie lang ist eine Zeile? Bei Redis kommt es ab 1.000 zu Leistungseinbußen.

  2. Verarbeitungsgeschwindigkeit, wie viele Daten werden in der Warteschlange angesammelt und wie viel Speicher wird belegt

  3. Redis-Architektur, wie man sicherstellt, dass keine Daten verloren gehen und wie man eine hohe Verfügbarkeit erreicht

  4. Ob die aktuellen Ressourcen diese Lösung zulassen und ob es andere Lösungen gibt.

Können Sie gleichzeitig schreiben? Verwenden Sie dann den Aktiv-Aktiv-Aktiv-Aktiv-Modus, um den gleichzeitigen Schreibdruck um 50 % zu reduzieren

Verwenden Sie MyCat

Sie können Datenbank-Sharding, konsistentes Hashing oder einfaches ID-Intervall-Hashing durchführen, was ausreichen sollte. Wenn Sie es als problematisch empfinden, trennen Sie Lesen und Schreiben und schauen Sie sich zuerst die Auslastung an.

Versuchen Sie es mit der Warteschlange?

Wenn man sich das Thema ansieht, ist die Datengenerierung relativ konzentriert ... Dann können Sie erwägen, Warteschlangenaufgaben zu verwenden, um den Zeitraum der konzentrierten Aufgabe etwas zu verlängern ... Versuchen Sie, das Schreiben zu glätten ... Sie müssen das Schreiben verzögern und glätten Lesen Finden Sie einfach einen angemessenen Gleichgewichtspunkt zwischen der Verarbeitungszeit ... Wenn es wirklich keinen Raum für Kompromisse gibt, verwenden Sie einfach die oben erwähnte High-End-Methode ... Wenn Sie außerdem nicht mit der Datenbank herumspielen möchten, Sie können auch versuchen, zuerst in die Dump-Datei zu schreiben ... Ein weiterer unterstützender Import ... Ich weiß nicht, ob dies als wilder Pfad angesehen wird ...

-1. Das gleichzeitige Senden von 100 Elementen und deren Verarbeitung in 10 Sekunden ist offensichtlich. Ich gehe davon aus, dass Ihre Daten teilweise verloren gehen können. Tatsächlich handelt es sich um einen riskanten Ansatz. Wenn ich beispielsweise 200 Elemente habe, übermittle ich sie alle 20 Sekunden.
-2. Der Server kann Aufgabenwarteschlangen verwenden, um Serverblockaden zu reduzieren und dadurch die Parallelität zu verbessern. (Einmal alle 10 Sekunden übermittelt, hohe Parallelität kann leicht auftreten)

-3. Darüber hinaus sollten Sie berücksichtigen, ob die Daten häufig gelesen und geschrieben werden. Andernfalls wird eine ehcache-Synchronisierung empfohlen.

-4. Ein so besonderes Unternehmen sollte sich auf keinen Fall einen Server mit anderen Unternehmen teilen

-5. Die spätere Aufteilung der Tabellen hängt von Ihrem Unternehmen ab

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage