Maison > Les sujets > phpmysql > le corps du texte

Améliorer les performances de PHP/MySQL grâce à la méthode ProxySQL

coldplay.xixi
Libérer: 2020-09-10 17:03:40
avant
2002 Les gens l'ont consulté

Améliorer les performances de PHP/MySQL grâce à la méthode ProxySQL

Recommandations d'apprentissage associées : Tutoriel MySQL

Il y a quelques jours, j'ai présenté comment implémenter le pool de connexions Redis via Twemproxy. Améliorant ainsi les performances de PHP/Redis. Aujourd'hui, je souhaite présenter ProxySQL, grâce auquel un pool de connexions MySQL peut être implémenté, améliorant ainsi les performances de PHP/MySQL. En fait, les principes sont similaires. Il n'est pas nécessaire d'écrire un autre article pour en parler, mais dans le processus. Lors de la configuration et de l'utilisation de ProxySQL, j'ai rencontré quelques problèmes mineurs et j'ai l'impression que je devrais les enregistrer.

À propos du processus d'installation, il y a une description détaillée dans le Wiki officiel. Regardez principalement le fichier de configuration /etc/proxysql.cnf :

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 = "..."
}
)
Copier après la connexion

La chose la plus importante à noter est : ProxySQL utilise SQLite pour enregistrer les informations de configuration. Le fichier de configuration n'est valide que lorsqu'il est démarré pour la première fois. . Par la suite, il est obtenu à partir de la configuration SQLite. Si vous souhaitez forcer l'utilisation d'un fichier de configuration, vous devez utiliser la commande initiale.

Tout d'abord, faites attention à admin_credentials dans admin_variables. La valeur par défaut est "admin:admin", ce qui signifie que le nom d'utilisateur et le mot de passe par défaut sont tous deux admin, et mysql_ifaces, dont la valeur par défaut est "0.0. 0.0 : 6032" signifie écouter le port 6032 de toutes les interfaces réseau. Imaginez que vous disposez d'une interface réseau accessible par le réseau externe. Les utilisateurs malveillants pourront alors utiliser le nom d'utilisateur et le mot de passe par défaut pour accéder à votre système d'administration, n'utilisez donc pas le nom d'utilisateur et le mot de passe par défaut, et ne surveillez pas par défaut l'interface réseau externe, n'oubliez pas ! Souviens-toi! Souviens-toi!

Deuxièmement, faites attention aux interfaces dans mysql_variables, car PHP doit demander le pool de connexions ProxySQL via le socket de domaine Unix local, donc les interfaces ne doivent pas utiliser le formulaire ip:port, mais le définir sur le formulaire local. Formulaire Socket de domaine Unix. Dans cet exemple, il est défini sur /var/run/proxysql.sock. Il convient de rappeler que beaucoup de gens aiment placer les fichiers Socket sous le chemin /tmp. /tmp ne ressemble pas à un chemin d'après son nom. Femmes issues de bonnes familles, tout le monde veut le faire deux fois, ce serait peut-être mauvais si quelqu'un le faisait une fois.

Enfin, faites attention à monitor_username et monitor_password dans mysql_variables. Il définit les informations pertinentes de l'utilisateur de surveillance afin que ProxySQL puisse suivre l'état du serveur MySQL back-end à tout moment. pour créer le compte correspondant sur le serveur MySQL back-end à l'avance, je n'ai pas créé de compte de surveillance au début, et par conséquent, ProxySQL a cessé de répondre après avoir fonctionné pendant un certain temps

C'est ça. car lorsque ProxySQL continue d'essayer d'accéder au serveur principal en utilisant le compte de surveillance et le mot de passe dans la configuration, de nombreuses erreurs "Accès refusé pour l'utilisateur 'monitor'@'...'" sont générées lorsqu'un certain seuil est atteint. est atteint, il en résultera "L'hôte '...' est bloqué en raison de nombreuses erreurs de connexion". À ce moment, ProxySQL ne peut pas répondre à la requête. Sur MySQL, "mysqladmin flush-hosts" fonctionnera. Les informations de journal pertinentes peuvent être consultées dans "SELECT * FROM monitor.mysql_server_ping_log".

Effectuons un test de résistance pour voir comment sont les performances. Le script de test test.php est le suivant :

<?php
$host = &#39;...&#39;;
$user = &#39;...&#39;;
$password = &#39;...&#39;;
$database = &#39;...&#39;;
$charset = &#39;utf8mb4&#39;;
$socket = &#39;/var/run/proxysql.sock&#39;;
$dsn = "mysql:dbname={$database};charset={$charset}";
if (empty($_GET[&#39;proxysql&#39;])) {
    $dsn .= ";host={$host}";
} else {
    $dsn .= &#39;;unix_socket={$socket}&#39;;
}
$dbh = new PDO($dsn, $user, $password);
$sql = &#39;SELECT * FROM foo LIMIT 10&#39;;
$value = $dbh->query($sql);
foreach ($value as $v) {
    var_dump($v);
}
?>
Copier après la connexion

Simulez un scénario à haute concurrence via ab et effectuez un test de résistance pour voir si les performances se sont améliorées :

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"
Copier après la connexion

Au final, sur un serveur généralement configuré, j'ai obtenu environ 1500 RPS sans ProxySQL, et environ 2000 RPS avec ProxySQL Autrement dit, ProxySQL a apporté une performance de 25%. amélioration. .

Pour plus d'articles connexes, veuillez faire attention à la colonne php mysql !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:juejin.im
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal