Verwandte Lernempfehlungen: MySQL-Tutorial
Vor ein paar Tagen habe ich vorgestellt, wie man den Redis-Verbindungspool über Twemproxy implementiert, um die Leistung von PHP/Redis zu verbessern. Heute möchte ich ProxySQL vorstellen, mit dem MySQL-Verbindungspools implementiert werden können, wodurch die Leistung von PHP/MySQL verbessert wird. Es besteht keine Notwendigkeit, einen weiteren Artikel dazu zu schreiben Bei der Konfiguration und Verwendung von ProxySQL bin ich auf einige kleinere Probleme gestoßen, die ich aufzeichnen sollte.
Zum Installationsprozess gibt es eine detaillierte Beschreibung im offiziellen Wiki. Schauen Sie sich vor allem die Konfigurationsdatei /etc/proxysql.cnf an:
datadir="/var/lib/proxysql" admin_variables= { admin_credentials="admin:admin" mysql_ifaces="0.0.0.0:6032" } mysql_variables= { threads=4 max_connections=2048 default_query_delay=0 default_query_timeout=36000000 have_compress=true poll_timeout=2000 interfaces="/var/run/proxysql.sock" default_schema="information_schema" stacksize=1048576 server_version="5.5.30" connect_timeout_server=3000 monitor_username="monitor" monitor_password="monitor" monitor_history=600000 monitor_connect_interval=60000 monitor_ping_interval=10000 monitor_read_only_interval=1500 monitor_read_only_timeout=500 ping_interval_server_msec=120000 ping_timeout_server=500 commands_stats=true sessions_sort=true connect_retries_on_failure=10 } mysql_servers = ( { address="..." port=3306 } ) mysql_users: ( { username = "..." password = "..." } )
Das Wichtigste ist, dass ProxySQL SQLite zum Speichern von Konfigurationsinformationen verwendet. Die Konfigurationsdatei ist nur gültig, wenn sie zum ersten Mal gestartet wird erhalten von SQLite. Wenn Sie die Verwendung einer Konfigurationsdatei erzwingen möchten, müssen Sie den anfänglichen Befehl verwenden.
Achten Sie zunächst auf admin_credentials
in admin_variables. Der Standardwert ist „admin:admin“, was bedeutet, dass der Standardbenutzername und das Passwort admin sind. Es gibt auch mysql_ifaces, dessen Standardwert „0.0.0.0:6032“ ist. , was bedeutet, dass Sie den gesamten Port 6032 der Netzwerkschnittstelle überwachen, auf den das externe Netzwerk zugreifen kann. Dann können böswillige Benutzer den Standardbenutzernamen und das Standardkennwort verwenden, um auf Ihr Admin-System zuzugreifen Verwenden Sie den Standardbenutzernamen und das Standardkennwort und verlassen Sie die externe Netzwerkschnittstelle nicht. Denken Sie daran! Erinnern! Erinnern!
Achten Sie zweitens auf die Schnittstellen in mysql_variables, da PHP den ProxySQL-Verbindungspool über den lokalen Unix-Domänen-Socket anfordern muss. Daher sollten die Schnittstellen nicht die Form von ip:port verwenden, sondern auf die lokale Form festlegen In diesem Beispiel wird auf /var/run/proxysql.sock gesetzt. Es sollte daran erinnert werden, dass viele Leute gerne Socket-Dateien unter dem /tmp-Pfad ablegen Vom Namen her sieht es aus wie eine gute Frau. Ich möchte es zweimal machen, aber wenn jemand es einmal macht, wird es schlecht.
Achten Sie abschließend auf „monitor_username“ und „monitor_password“ in mysql_variables. Dadurch werden die relevanten Informationen des Überwachungsbenutzers festgelegt, damit ProxySQL jederzeit den Status des Back-End-MySQL-Servers verfolgen kann Ich habe im Voraus kein Überwachungskonto erstellt. Das liegt daran, dass ProxySQL nach einer Weile nicht mehr reagiert Wenn der Server das Überwachungskonto und das Kennwort in der Konfiguration verwendet, wird eine Menge Fehlermeldung „Zugriff verweigert für Benutzer 'monitor'@'...'“ generiert. Wenn ein bestimmter Schwellenwert erreicht wird, wird die Fehlermeldung „Host '...“ angezeigt. ' ist wegen vieler Verbindungsfehler blockiert.“ Zu diesem Zeitpunkt kann ProxySQL nicht auf die Anfrage antworten. Sie müssen „mysqladmin Flush-Hosts“ auf MySQL verwenden. „Das ist es.“ Relevante Protokollinformationen können in „SELECT * FROM monitor.mysql_server_ping_log“ eingesehen werden.
Lassen Sie uns einen Stresstest durchführen, um zu sehen, wie die Leistung ist:
<?php $host = '...'; $user = '...'; $password = '...'; $database = '...'; $charset = 'utf8mb4'; $socket = '/var/run/proxysql.sock'; $dsn = "mysql:dbname={$database};charset={$charset}"; if (empty($_GET['proxysql'])) { $dsn .= ";host={$host}"; } else { $dsn .= ';unix_socket={$socket}'; } $dbh = new PDO($dsn, $user, $password); $sql = 'SELECT * FROM foo LIMIT 10'; $value = $dbh->query($sql); foreach ($value as $v) { var_dump($v); } ?>
Simulieren Sie ein Szenario mit hoher Parallelität über ab und testen Sie, ob sich die Leistung verbessert hat:
shell> ab -k -n 10000 -c 100 "http://path/test.php?proxysql=0" shell> ab -k -n 10000 -c 100 "http://path/test.php?proxysql=1"
Schließlich befinde ich mich auf einem allgemein konfigurierten Server. Ohne ProxySQL werden ungefähr 1.500 RPS und mit ProxySQL ungefähr 2.000 RPS erzielt. Mit anderen Worten: ProxySQL bringt eine Leistungsverbesserung von 25 %.
Wenn Sie weitere verwandte Artikel erfahren möchten, achten Sie bitte auf die Spalte
php mysqlDas obige ist der detaillierte Inhalt vonVerbessern Sie die Leistung von PHP/MySQL durch die ProxySQL-Methode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!