Maison >Les sujets >phpmysql >Explication détaillée de l'amélioration des performances de PHP/MySQL via ProxySQL

Explication détaillée de l'amélioration des performances de PHP/MySQL via ProxySQL

coldplay.xixi
coldplay.xixiavant
2020-11-17 16:50:113010parcourir

La colonne

php mysql présente comment ProxySQL améliore les performances de PHP/MySQL.

Explication détaillée de l'amélioration des performances de PHP/MySQL via ProxySQL

Il y a quelques jours, j'ai présenté comment implémenter le pool de connexions Redis via Twemproxy pour améliorer 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 valide. est démarré pour la première fois. Les configurations suivantes sont obtenues à partir de SQLite. Si vous souhaitez forcer l'utilisation d'un fichier de configuration, vous devez utiliser la commande initiale. Pour plus d'informations, veuillez vous référer à : Explication détaillée de l'installation et de la configuration de ProxySQL. De plus, il y a quelques petits détails auxquels il faut prêter attention :

Tout d'abord, faites attention aux 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, qui manquent. La valeur par défaut est "0.0.0.0:6032", ce qui signifie écouter le port 6032 de toutes les interfaces réseau. Imaginez que vous disposez d'une interface réseau accessible au réseau externe, puis aux utilisateurs malveillants. pourra utiliser le nom d'utilisateur et le mot de passe par défaut pour accéder à votre système d'administration, alors n'utilisez pas le nom d'utilisateur et le mot de passe par défaut, et n'écoutez pas par défaut sur 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. Une femme de bonne famille, tout le monde veut le faire deux fois, qui ne peut pas le faire ? RM est mauvais.

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, je n'ai pas créé de compte de surveillance au début. Par conséquent, ProxySQL a cessé de répondre après avoir fonctionné pendant un certain temps. le serveur back-end utilisant le compte de surveillance et le mot de passe dans la configuration, il générera de nombreux messages « Accès refusé ». pour l'erreur de l'utilisateur 'monitor'@'...'", lorsqu'il atteint un certain seuil, cela entraînera "L'hôte '...' est bloqué en raison de nombreuses erreurs de connexion". À ce stade, ProxySQL ne pourra pas répondre à la demande. Vous devez utiliser "mysqladmin" sur MySQL flush-hosts". 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);
}

?>

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer