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.
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.
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 VerbindungenHandlerSocket-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 LeistungDie 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.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.
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
make && make install
[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('data_base_name', 'table_name', '', 'id,name,some,thing,more'); $c->select($id, '=', array(42)); // SELECT WITH PRIMARY KEY $response = $c->readResponse(); //SELECT with IN statement $c = new \HSPHP\ReadSocket(); $c->connect(); $id = $c->getIndexId('data_base_name', 'table_name', '', 'id,name,some,thing,more'); $c->select($id, '=', array(0), 0, 0, array(1,42,3)); $response = $c->readResponse();
Löschen
<?php $c = new \HSPHP\WriteSocket(); $c->connect('localhost',9999); $id = $c->getIndexId('data_base_name','table_name','','k,v'); $c->update($id,'=',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('localhost',9999); $id = $c->getIndexId('data_base_name','table_name','','k,v'); $c->update($id,'=',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('localhost',9999); $id = $c->getIndexId('data_base_name','table_name','','k,v'); $c->delete($id,'=',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!