Heim  >  Artikel  >  Datenbank  >  Wie kann MySQL die Reaktionsgeschwindigkeit verbessern?

Wie kann MySQL die Reaktionsgeschwindigkeit verbessern?

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-07-19 13:57:261749Durchsuche

MySQL hat seine eigenen Einschränkungen. Viele Websites haben die klassische Architektur von MySQL+Memcached übernommen, und einige haben sogar MySQL aufgegeben und NoSQL-Produkte übernommen. Es ist unbestreitbar, dass viele NoSQL-Produkte bei einigen einfachen Abfragen (insbesondere PK-Abfragen) viel schneller sind als MySQL.

Wie kann MySQL die Reaktionsgeschwindigkeit verbessern?

1. Überblick

2. Anwendungsszenarien

MySQL hat seine eigenen Einschränkungen. Viele Websites haben die klassische Architektur von MySQL+Memcached übernommen, und einige haben sogar MySQL aufgegeben und NoSQL-Produkte wie Redis übernommen / MongoDB usw. Es ist unbestreitbar, dass viele NoSQL-Produkte bei einigen einfachen Abfragen (insbesondere PK-Abfragen) viel schneller sind als MySQL und mehr als 80 % der Abfragen auf der Front-End-Website einfache Abfragedienste sind.

MySQL bietet eine API-Zugriffsschnittstelle über das HandlerSocket-Plug-in. In unserem Benchmark-Test erreichte die normale R510-Server-Einzelinstanz 72 W+QPS (reines Lesen), wenn eine leistungsstärkere CPU verwendet wird, um weitere Netzwerkkarten hinzuzufügen. Theoretisch können höhere Leistungen erzielt werden. Unter den gleichen Bedingungen hat Memcached nur 40 W+QPS (reines Lesen) und eine einzelne Instanz von Memcached auf R510 kann die Leistung nicht verbessern, da Memcached eine große Speichersperre hat, die seine Parallelitätsfähigkeiten einschränkt.

Innodb-Engine, Suche nach Primärschlüssel, eindeutigem Schlüssel oder Index (d. h. ihre SQL-Bedingung muss diese sein), unterstützt Limit-Anweisung, IN, INSERT/UPDATE/DELETE.

  • Eine Suche ohne Primärschlüssel, eindeutigen Schlüssel oder Index funktioniert nicht!

  • Die Tabelle muss eine Innodb-Engine sein

Die Hauptverwendungsszenarien von HandlerSocket und NoSQL sind unterschiedlich. HandlerSocket wird hauptsächlich zur Verbesserung von MySQL, zur Optimierung von Vorgängen wie Tabellenergänzungen, Löschungen, Änderungen und Änderungen der Tabellenstruktur verwendet und unterstützt intensive CPU-Vorgänge, während NoSQL als Cache-Funktion intensive E/A-Vorgänge unterstützt.

Daher können beides bei Bedarf kombiniert werden, um zusammenzuarbeiten.

3. Prinzip

HandlerSocket ist ein Plug-in für MySQL, das in den mysqld-Prozess integriert ist. Komplexe Abfragen und andere Vorgänge, die NoSQL nicht implementieren kann, werden weiterhin mithilfe der MySQL-eigenen relationalen Datenbank implementiert. Auf der Betriebs- und Wartungsebene spielt die weit verbreitete Erfahrung der MySQL-Master-Slave-Replikation weiterhin eine Rolle. Im Vergleich zu anderen NoSQL-Produkten ist die Datensicherheit wie in der Abbildung dargestellt:

Es Es ist ersichtlich, dass HandlerSocket MySQLs SQL umgeht. Die Analyseschicht (SQL-Schicht) greift direkt auf die MySQL-Speicherschicht zu. Darüber hinaus nutzt HandlerSocket die Netzwerkarchitektur Epoll und Worker-Thread/Thread-Pooling, um eine höhere Leistung zu erzielen.

Die Architektur von MySQL ist die Trennung von „Datenbankverwaltung“ und „Datenverwaltung“, also dem MySQL Server+Storage Engine-Modell. MySQL Server ist eine Ebene, die direkt mit dem Client interagiert. Er ist für die Verwaltung von Verbindungsthreads, das Parsen von SQL zur Generierung von Ausführungsplänen, die Verwaltung und Implementierung von Ansichten, Triggern, gespeicherten Prozeduren und anderen Dingen verantwortlich, die nichts mit der Verwaltung spezifischer Datenvorgänge zu tun haben. Es ermöglicht die Speicherung durch Aufrufen der Handler-API. Die Engine arbeitet mit bestimmten Daten. Storage Engine implementiert die Funktionen der Handler-API durch Vererbung und ist für die direkte Interaktion mit Daten, die Datenzugriffsimplementierung (muss implementiert werden), die Transaktionsimplementierung (optional), die Indeximplementierung (optional) und die Datencache-Implementierung (optional) verantwortlich.

HandlerSocket ist eine interne Komponente von MySQL. Es stellt NoSQL-ähnliche Netzwerkdienste in Form eines MySQL-Daemon-Plugins bereit. Es überwacht nicht direkt einen konfigurierten Port und empfängt Daten über NoSQL/API. Kommunikationsprotokoll und ruft dann die Speicher-Engine (z. B. InnoDB) auf, um Daten über die Handler-API in MySQL zu verarbeiten. Theoretisch kann HanderSocket verschiedene MySQL-Speicher-Engines verarbeiten. Bei der Verwendung von MyISAM können die eingefügten Daten jedoch nicht gefunden werden, da beim Erstellen der Zeile kein Problem auftritt Es kann weiterhin unterstützt werden, aber um den Speicher besser zu nutzen, wird HandlerSocket mit der InnoDB-Speicher-Engine verwendet.

Wie aus der obigen Abbildung ersichtlich ist, dient HandlerSocket als mittlere Schicht zwischen MySQL-Client und MySQL und ersetzt einen Teil der nativen Daten- und Tabellenverarbeitungsarbeit von MySQL. Dabei wird ein Multithread-Ansatz verwendet, um zwischen DDL- und DML-Vorgängen zu unterscheiden . Ziel ist es sicherzustellen, dass komplexe Bearbeitungen effizient abgewickelt werden können.

Da HandlerSocket in Form eines MySQL-Daemon-Plugins vorliegt, kann MySQL als NoSQL in Anwendungen verwendet werden. Seine größte Funktion besteht darin, die Interaktion mit Speicher-Engines wie InnoDB ohne SQL-Initialisierungsaufwand zu ermöglichen. Wenn Sie auf MySQLs TABLE zugreifen, müssen Sie natürlich auch die Tabelle öffnen/schließen, aber die Tabelle wird nicht jedes Mal geöffnet/geschlossen, da der zuvor aufgerufene Tabellencache zur Wiederverwendung gespeichert wird, während das Öffnen/Schließen von Tabellen am häufigsten ist Dies ist ressourcenintensiv und kann leicht zu Konflikten um den Mutex führen. Dies ist sehr effektiv bei der Verbesserung der Leistung. Wenn der Datenverkehr kleiner wird, schließt HandlerSocket Tabellen, sodass DDL im Allgemeinen nicht blockiert wird.

Was ist der Unterschied zwischen HandlerSocket und MySQL+Memcached? Beim Vergleich von Abbildung 1-2 und Abbildung 1-3 können wir die Unterschiede erkennen. Abbildung 1-3 zeigt eine typische MySQL+Memecached-Anwendungsarchitektur. Da der Get-Vorgang von Memcached viel schneller ist als die Primärschlüsselabfrage von MySQL im Speicher oder auf der Festplatte, wird Memcached zum Zwischenspeichern von Datenbankdatensätzen verwendet. Wenn die Abfragegeschwindigkeit und Antwortzeit von HandlerSocket mit Memcached vergleichbar sind, können wir in Betracht ziehen, die Architekturschicht der Cache-Datensätze von Memcached zu ersetzen. 4. Vorteile und Nachteile

Vorteile und Funktionen von HandlerSocket LIMIT-Klausel, das heißt, sie unterstützt die vollständigen Funktionen des Hinzufügens, Löschens, Änderns und Abfragens, unterstützt jedoch noch keine Vorgänge, die keinen Index verwenden können. Darüber hinaus wird die Funktion „execute_multi()“ unterstützt, um mehrere Abfrageanforderungen gleichzeitig über das Netzwerk zu übertragen, wodurch Netzwerkübertragungszeit gespart wird.

2) Verarbeiten Sie eine große Anzahl gleichzeitiger Verbindungen

HandlerSocket-Verbindungen sind leichtgewichtig, da HandlerSocket epoll() und Worker-Thread/Thread-Pooling-Architektur verwendet und die Anzahl der internen MySQL-Threads begrenzt ist (kann über my.cnf konfiguriert werden). (gesteuert durch den Parameter handlersocket_threads/handlersocket_threads_wr). Selbst wenn zig Millionen Netzwerkverbindungen zu HandlerSocket hergestellt werden, verbraucht es nicht viel Speicher und seine Stabilität wird in keiner Weise beeinträchtigt (zu viel Speicher wird verbraucht). großer gegenseitiger Ausschlusswettbewerb und andere Probleme, wie Bug#26590, Bug#33948, Bug#49169).

3) Hervorragende Leistung

Die Leistung von HandlerSocket wird im Artikel „HandlerSocket-Leistungstestbericht“ beschrieben. Im Vergleich zu anderen NoSQL-Produkten ist die Leistung nicht nur nicht minderwertig, sondern auch optimiert Netzwerk/Parallelität Verwandte Probleme:

Kleinere Netzwerkpakete: Im Vergleich zum herkömmlichen MySQL-Protokoll ist das HandlerSocket-Protokoll kürzer, sodass der gesamte Netzwerkverkehr geringer ist.

Führen Sie eine begrenzte Anzahl interner MySQL-Threads aus: siehe oben.

  • Client-Anforderungen gruppieren: Wenn eine große Anzahl gleichzeitiger Anforderungen bei HandlerSocket eintrifft, aggregiert jeder Arbeitsthread so viele Anforderungen wie möglich, führt dann die aggregierten Anforderungen aus und gibt die Ergebnisse gleichzeitig zurück. Auf diese Weise wird die Leistung erheblich verbessert, indem ein wenig Reaktionszeit geopfert wird. Sie können beispielsweise die Anzahl der fsync()-Aufrufe reduzieren und die Kopierlatenz reduzieren.

  • 4) Kein doppeltes Caching

    Bei Verwendung von Memcached zum Zwischenspeichern von MySQL/InnoDB-Datensätzen werden diese Datensätze sowohl im Memcached- als auch im InnoDB-Pufferpool zwischengespeichert, sodass die Effizienz sehr gering ist (tatsächlich gibt es zwei Kopien der Daten und Memcached selbst ist möglicherweise auch HA-Unterstützung erforderlich), und es wird das HandlerSocket-Plug-in verwendet, das direkt auf die InnoDB-Speicher-Engine zugreift und Datensätze im InnoDB-Pufferpool zwischengespeichert werden, sodass andere SQL-Anweisungen die zwischengespeicherten Daten wiederverwenden können.
  • 5) Keine Dateninkonsistenz

    Da Daten im Gegensatz zur Verwendung von Memcached nur an einem Ort gespeichert werden (im Cache der InnoDB-Speicher-Engine), muss die Datenkonsistenz zwischen Memcached und MySQL gewahrt bleiben.
6) Absturzsicherheit

Der Back-End-Speicher ist die InnoDB-Engine, die die ACID-Eigenschaften von Transaktionen unterstützt und die Sicherheit von Transaktionen gewährleistet. Selbst wenn innodb_flush_log_at_trx_commit=2 gesetzt ist, dauert es bei einem Absturz des Datenbankservers nur 7) SQL/NOSQL-Koexistenz

In vielen Fällen möchten wir immer noch SQL verwenden (z. B. komplexe Berichtsabfragen), und die meisten NoSQL-Produkte unterstützen keine SQL-Schnittstellen, was wir immer noch tun können Verwenden Sie es. Der MySQL-Client sendet SQL-Anweisungen. Wenn jedoch ein hoher Durchsatz und eine schnelle Antwort erforderlich sind, wird HandlerSocket verwendet.

8) MySQL-Funktionen erben

Da HandlerSocket auf MySQL läuft, werden weiterhin alle MySQL-Funktionen unterstützt, wie zum Beispiel: SQL, Online-Backup, Replikation, HA, Überwachung usw.

9) MySQL muss nicht geändert/neu erstellt werden

Da HandlerSocket ein Plug-in und Open Source ist, unterstützt es das Erstellen aus jedem MySQL-Quellcode, sogar aus Versionen von Drittanbietern (wie Percona), ohne dass MySQL geändert werden muss.

10) Unabhängig von der Speicher-Engine

Obwohl wir nur die Plug-Ins MySQL-EnterpriseInnoDB und Percona XtraDB getestet haben, kann HandlerSocket theoretisch mit jeder Speicher-Engine interagieren. Auch MyISAM kann durch einfache Modifikationen unterstützt werden, was jedoch aus Sicht des Daten-Cachings und der Speicherauslastung kaum von Bedeutung ist.

Defekte und Vorsichtsmaßnahmen von HandlerSocket

1) Protokollinkompatibilität

Die HandlerSocket-API ist nicht mit der Memcached-API kompatibel. Obwohl sie einfach zu verwenden ist, erfordert sie dennoch ein wenig Lernerfahrung, um zu lernen, wie man mit HandlerSocket interagiert. Wir können es jedoch in die HandlerSocket-API übersetzen, indem wir die Memecached-Funktion überladen.

2) Keine Sicherheitsfunktionen

Ähnlich wie andere NoSQL-Datenbanken unterstützt HandlerSocket keine Sicherheitsfunktionen. Der Arbeitsthread von HandlerSocket wird mit Systembenutzerberechtigungen ausgeführt, sodass die Anwendung über das HandlerSocket-Protokoll auf alle Tabellenobjekte zugreifen kann, dies ist jedoch möglich Ändern Sie einfach das Protokoll, fügen Sie ein Konfigurationselement als Kennwort in my.cnf hinzu und übergeben Sie die Kennwortüberprüfung dieser Konfiguration beim Herstellen einer Verbindung. Natürlich können die Datenpakete auch durch die Netzwerk-Firewall gefiltert werden.

3) Es gibt keinen Vorteil für Festplatten-IO-intensive Szenarien

Für IO-intensive Anwendungsszenarien kann die Datenbank nicht Tausende von Abfragen pro Sekunde ausführen, normalerweise nur 1-10 % CPU-Auslastung, in diesem Fall SQL-Analyse Dies wird nicht der Fall sein Ein Leistungsengpass, daher bietet die Verwendung von HandlerSocket keinen Vorteil. HandlerSocket sollte nur auf Servern verwendet werden, auf denen die Daten vollständig in den Speicher geladen werden. Bei PCI-E-SSD-Geräten (z. B. Fusion-IO), die mehr als 4 W IOPS pro Sekunde bereitstellen können und das IO-Gerät selbst viel CPU verbraucht, bietet die Verwendung von HandlerSocket jedoch immer noch Vorteile.

5. Installation

Hinweis: Die Installationsmethode im Buch ist veraltet und die Version ist relativ niedrig. Es wird empfohlen, die offizielle Dokumentation für die Installation zu verwenden. github.com/DeNA/HandlerSocket- Plugin-for-MySQL

Installationsdokumentation: https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/installation.en.txt

Quellcode herunterladen: Sie können Github direkt verwenden. Sie können Git auch klonen oder herunterladen. Installationsschritte:

1. Handlersocket erstellen. mysql-bindir: Verzeichnis der ausführbaren MySQL-Binärdatei (Das Verzeichnis, in dem sich mysql_config befindet)

with-mysql-plugindir: MySQL-Plug-in-Verzeichnis

2. Kompilieren
    ./autogen.sh
    ./configure --with-mysql-source=/work/mysql-5.1.50 --with-mysql-bindir=/work/mysql-5.1.50-linux-x86_64-glibc23/bin  --with-mysql-plugindir=/work/mysql-5.1.50-linux-x86_64-glibc23/lib/plugin
  • 3. Konfiguration
  • HandleSocket kann nach der Kompilierung nicht verwendet werden , und Sie müssen es zur MySQL-Konfigurationsdatei (my.cnf) hinzufügen. Die folgende Konfiguration:
  • make && make install
  • Die hier hinzugefügten dienen hauptsächlich der Konfiguration von HandleSocket. Es verfügt über zwei Ports, 9998 zum Lesen von Daten und 9999 zum Schreiben von Daten . Das Lesen bis 9998 ist jedoch effizienter. Hier ist die Anzahl der Threads zum Lesen und Schreiben auf 16 festgelegt. Um mehr gleichzeitige Verbindungen zu verarbeiten, stellen Sie außerdem die Anzahl der offenen Dateideskriptoren auf 65535 ein Die Konfigurationsoption innodb_buffer_pool_size von InnoDB oder key_buffy_size von MyISAM bezieht sich auf den Cache-Index. Stellen Sie ihn daher so groß wie möglich ein, damit er genutzt werden kann Das Potenzial von HandleSocket.
4. Aktivieren Sie HandleSocket.

Melden Sie sich bei MySQL an, um es auszuführen.

[mysqld]
# 绑定读请求端口
loose_handlersocket_port = 9998
# 绑定写请求端口
loose_handlersocket_port_wr = 9999
# 读请求线程数
loose_handlersocket_threads = 16
# 写请求线程数
loose_handlersocket_threads_wr = 16
# 设置最大接收连接数
open_files_limit = 65535
. github.com/tz -lom/HSPHP

PHP-Nutzung:

Auswählen

mysql> install plugin handlersocket soname 'handlersocket.so';

Update

<?php 
$c = new \HSPHP\ReadSocket();
$c->connect();
$id = $c->getIndexId(&#39;data_base_name&#39;, &#39;table_name&#39;, &#39;&#39;, &#39;id,name,some,thing,more&#39;);
$c->select($id, &#39;=&#39;, array(42)); // SELECT WITH PRIMARY KEY
$response = $c->readResponse();

//SELECT with IN statement
$c = new \HSPHP\ReadSocket();
$c->connect();
$id = $c->getIndexId(&#39;data_base_name&#39;, &#39;table_name&#39;, &#39;&#39;, &#39;id,name,some,thing,more&#39;);
$c->select($id, &#39;=&#39;, array(0), 0, 0, array(1,42,3));
$response = $c->readResponse();

Löschen

<?php
$c = new \HSPHP\WriteSocket();
$c->connect(&#39;localhost&#39;,9999);
$id = $c->getIndexId(&#39;data_base_name&#39;,&#39;table_name&#39;,&#39;&#39;,&#39;k,v&#39;);
$c->update($id,&#39;=&#39;,array(100500),array(100500,42)); // Update row(k,v) with id 100500 to  k = 100500, v = 42
$response = $c->readResponse(); // Has 1 if OK

$c = new \HSPHP\WriteSocket();
$c->connect(&#39;localhost&#39;,9999);
$id = $c->getIndexId(&#39;data_base_name&#39;,&#39;table_name&#39;,&#39;&#39;,&#39;k,v&#39;);
$c->update($id,&#39;=&#39;,array(100500),array(100500,42), 2, 0, array(100501, 100502)); // Update rows where k IN (100501, 100502)
$response = $c->readResponse(); // Has 1 if OK

Einfügen

<?php
$c = new \HSPHP\WriteSocket();
$c->connect(&#39;localhost&#39;,9999);
$id = $c->getIndexId(&#39;data_base_name&#39;,&#39;table_name&#39;,&#39;&#39;,&#39;k,v&#39;);
$c->delete($id,&#39;=&#39;,array(100500));
$response = $c->readResponse(); //return 1 if OK

Verwandte Empfehlungen: „

MySQL-Tutorial

Das obige ist der detaillierte Inhalt vonWie kann MySQL die Reaktionsgeschwindigkeit verbessern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen