Maison > Article > Les sujets > 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 = "..." } )
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 = '...'; $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); } ?>
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"
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!