Angesichts der steigenden Anzahl von Benutzern und der sprunghaft ansteigenden täglichen Aktivitäten und Spitzenwerte steht die Datenbankverarbeitungsleistung vor großen Herausforderungen. Teilen wir den Datenbankoptimierungsplan für die tatsächliche Plattform mit einem Spitzenwert von 100.000+. Diskutieren Sie mit allen und lernen Sie voneinander, um sich zu verbessern!
Fall: Spielplattform.
1. Lösung hoher Parallelität
Wenn die Anzahl der Clientverbindungen ihren Höhepunkt erreicht, ist die Aufrechterhaltung und Verarbeitung der Verbindungen durch den Server nicht möglich hier vorerst besprechen. Wenn mehrere Schreibanforderungen an die Datenbank gesendet werden, müssen zu diesem Zeitpunkt mehrere Tabellen eingefügt werden, insbesondere einige Ausdrücke, in denen mehrere zehn Millionen Daten pro Tag gespeichert werden. Mit der Zeit ist die herkömmliche Methode zum synchronen Schreiben von Daten offensichtlich nicht ratsam. Nachdem Experimente durch asynchrones Einfügen erheblich verbessert wurden, müssen gleichzeitig einige Abstriche bei der Echtzeitleistung beim Lesen von Daten gemacht werden.
Es gibt viele asynchrone Methoden. Die aktuelle Methode besteht darin, die Daten durch den Job in regelmäßigen Abständen (5 Minuten, 10 Minuten ... abhängig von den Anforderungseinstellungen) zu übertragen.
1. Es gibt die Originaltabelle A, die auch tatsächlich beim Lesen verwendet wird.
2. Erstellen Sie B und C mit der gleichen Struktur wie die ursprüngliche Tabelle A für die Datenübertragungsverarbeitung.
3. Erstellen Sie den Job Job1, der die Daten synchronisiert, und die Tabelle, die den laufenden Status von Job1 aufzeichnet. Das Wichtigste während der Synchronisierung ist, den aktuellen Status von Job1 zu überprüfen zu A, dann Die Daten vom Server werden in C gespeichert und dann werden die Daten nach B importiert. Dieser Datenstapel wird an A übertragen, wenn der nächste Job ausgeführt wird. Wie in Abbildung 1 dargestellt:
Gleichzeitig sollte zur Gewährleistung der Sicherheit und zur Erleichterung der Fehlerbehebung eine gespeicherte Prozedur verwendet werden, die die gesamte Datenbankinstanz aufzeichnet, um die zu überprüfen Die Auftragsausführung erfolgt in kürzerer Zeit. Wenn ein ungewöhnlicher Fehler auftritt, sollten die zuständigen Mitarbeiter umgehend auf andere Weise benachrichtigt werden. Schreiben Sie beispielsweise in die E-Mail- und SMS-Tabelle, lassen Sie ein Tcp-Benachrichtigungsprogramm regelmäßig lesen und senden usw.
Hinweis: Wenn die Daten pro Tag Dutzende G erreichen und für diese Tabelle Abfrageanforderungen bestehen (Partitionierung wird unten erwähnt), ist eine der besten Strategien:
Sie kann B mit mehreren Servern synchronisieren, die den Abfragedruck teilen und den Ressourcenwettbewerb verringern. Da die Ressourcen der gesamten Datenbank begrenzt sind, z. B. bei einem Einfügevorgang, wird zunächst eine gemeinsame Sperre abgerufen, dann wird eine bestimmte Datenzeile über den Clustered-Index lokalisiert und dann auf eine Absichtssperre aktualisiert, die SQL Server benötigt Je nach Speichergröße muss eine unterschiedliche Sperrenwartung beantragt werden, was zu einem Wettbewerb um Ressourcen führt. Daher sollten Lesen und Schreiben so weit wie möglich getrennt werden und je nach Geschäftsmodell oder festgelegten Regeln aufgeteilt werden können. Bei Plattformprojekten sollte der Schwerpunkt darauf gelegt werden, dass Daten effektiv eingefügt werden können.
Das Abfragen großer Datenmengen verbraucht auf jeden Fall viele Ressourcen. Wenn Sie auf eine Stapellöschung stoßen, können Sie zu einer zyklischen Stapelmethode wechseln (z. B. 2000 Elemente gleichzeitig), um dieses Problem nicht zu verursachen. Der Prozess führt dazu, dass sich die gesamte Bibliothek aufhängt, was zu einigen unvorhersehbaren Fehlern führt. Nach einiger Zeit ist es effektiv und machbar, aber es geht nur mit Stauraum einher. Felder mit einer großen Datenmenge in der Tabelle können je nach Abfrageanforderungen auch in neue Tabellen aufgeteilt werden. Diese sollten natürlich entsprechend den Anforderungen jedes Geschäftsszenarios festgelegt werden, und es kann eine geeignete, aber nicht auffällige Lösung entworfen werden.
2. Lösen Sie das Speicherproblem
Wenn die Daten in einer einzelnen Tabelle jeden Tag Dutzende Gigabyte erreichen, ist es selbstverständlich, die Speicherlösung zu verbessern. Jetzt möchte ich meinen eigenen Plan mitteilen, trotz der verheerenden Datenflut an vorderster Front zu bleiben! Hier ist ein Beispiel, um meine bescheidene Meinung zu meiner eigenen Umgebung zu teilen:
Bestehende Datentabelle A, eine einzelne Tabelle fügt jeden Tag 30 GB Daten hinzu und verwendet während der Speicherung die asynchrone Datensynchronisierung Durch die Partitionierung können Sie die Dateigruppen auch in Dateigruppen aufteilen und die Dateigruppen verschiedenen Festplatten zuweisen, um die Konkurrenz um E/A-Ressourcen zu verringern und den normalen Betrieb vorhandener Ressourcen sicherzustellen. Kombinieren Sie nun die Anforderungen für die Aufbewahrung historischer Daten für 5 Tage:
1 Zu diesem Zeitpunkt müssen Sie den Job verwenden, um einen Partitionsplan basierend auf der Partitionsfunktion zu generieren, z. B. eine Partitionierung basierend auf Benutzer-ID oder Zeitfeld ;
2. Verschieben Sie die Tabelle. Nach der Partitionierung kann die Abfrage schnell eine bestimmte Partition über den entsprechenden Index finden.
3 Durch den Auftrag werden Partitionen zusammengeführt und anschließend die Daten in dieser Tabelle gelöscht.
Wie in Abbildung 2 gezeigt:
Erfassen Sie lange Abfragezeiten durch SQL-Abfrageverfolgung und verwenden Sie die SQL-eigene gespeicherte Prozedur sp_lock oder die Ansichten dm_tran_locks und dblockinfo Typ und Granularität der Sperren, die auf der aktuellen Instanz vorhanden sind.
Nachdem Sie die spezifische Abfrageanweisung oder gespeicherte Prozedur gefunden haben, verschreiben Sie das richtige Medikament! Das Medikament heilt die Krankheit!
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels jedem beim Lernen oder Arbeiten helfen kann. Ich hoffe auch, die PHP-Chinese-Website zu unterstützen.
Weitere Artikel zu Sqlserver-Lösungen für hohe Parallelität und Big-Data-Speicherung finden Sie auf der chinesischen PHP-Website!