Die Spalte
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 hauptsächlich 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 Konfigurationen werden von SQLite bezogen. Wenn Sie die Verwendung einer Konfigurationsdatei erzwingen möchten, müssen Sie den anfänglichen Befehl verwenden. Weitere Informationen finden Sie unter: Ausführliche Erläuterung der Installation und Konfiguration von ProxySQL. Darüber hinaus sind einige kleine Details zu beachten: Achten Sie zunächst auf admin_credentials in admin_variables. Der Standardwert ist „admin:admin“, was bedeutet, dass der Standardbenutzername und das Standardkennwort sowohl admin als auch mysql_ifaces sind. Der Standardwert „0.0.0.0:6032“ bedeutet, dass der Port 6032 aller Netzwerkschnittstellen überwacht wird. Stellen Sie sich vor, Sie verfügen über eine Netzwerkschnittstelle, auf die das externe Netzwerk zugreifen kann. Dann können böswillige Benutzer den Standardbenutzernamen und das Standardkennwort verwenden Um Ihr Admin-System aufzurufen, verwenden Sie daher nicht den Standardbenutzernamen und das Standardkennwort und lauschen Sie nicht standardmäßig auf die externe Netzwerkschnittstelle. 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 das ip:port-Formular verwenden, sondern es auf das lokale Unix-Domänen-Socket-Formular festlegen . In diesem Beispiel sollte man sich daran erinnern, dass viele Leute gerne Socket-Dateien unter dem /tmp-Pfad ablegen Gute Frau vom Namen her. Ich möchte es zweimal machen, aber wer kann es falsch machen? Nach rm ist es schlimm. Achten Sie abschließend auf „monitor_username“ und „monitor_password“ in mysql_variables, die die relevanten Informationen des Überwachungsbenutzers festlegen, damit ProxySQL den Status des Back-End-MySQL-Servers verfolgen kann. Denken Sie daran, das entsprechende Konto auf dem zu erstellen Ich habe den Back-End-MySQL-Server im Voraus gestartet. Das Ergebnis ist, dass ProxySQL nach einer Weile nicht mehr reagiert. Dies liegt daran, dass ProxySQL weiterhin versucht, auf das Überwachungskonto und das Kennwort zuzugreifen Auf dem Back-End-Server werden viele Meldungen „Zugriff verweigert“ generiert. für Benutzer 'monitor'@'...'" Fehler, wenn ein bestimmter Schwellenwert erreicht wird, führt dies dazu, dass „Host '...' aufgrund vieler Verbindungsfehler blockiert" wird. Zu diesem Zeitpunkt ist ProxySQL nicht dazu in der Lage Beantworten Sie die Anfrage. Sie müssen „mysqladmin“ auf MySQL verwenden. 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 mysql!
Das obige ist der detaillierte Inhalt vonAusführliche Erklärung zur Verbesserung der Leistung von PHP/MySQL durch ProxySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!