登录  /  注册
首页 > 专题 > php mysql > 正文

详解通过ProxySQL提升PHP/MySQL的性能

coldplay.xixi
发布: 2020-11-17 16:50:11
转载
2411人浏览过

php mysql栏目介绍ProxySQL如何提升PHP/MySQL的性能。

详解通过ProxySQL提升PHP/MySQL的性能

前些天我介绍了如何通过 twemproxy 实现 redis 连接池,进而提升 php/redis 的性能。今天我要介绍一下 proxysql,通过它可以实现 mysql 连接池,进而提升 php/mysql 的性能,实际上原理是差不多的,本来没必要再写一篇文章赘述,不过我在配置使用 proxysql 的过程中,遇到了一些小问题,感觉还是应该记录一下。

关于安装过程,官方 Wiki 里有详细描述。主要看配置文件 /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 = "..."
	}
)
登录后复制

   

最应该注意的是:ProxySQL 使用 SQLite 来保存配置信息,配置文件只在第一次启动的时候有效,后续都是从 SQLite 获取配置。如果你想强制使用配置文件,需要使用 initial        命令。更多信息可以参考:ProxySQL之安装及配置详解。此外,还有一些小细节需要注意:

首先,注意 admin_variables 里的 admin_credentials,缺省值是「admin:admin」,表示缺省用户名和密码都是 admin,还有 mysql_ifaces,其缺省值是「0.0.0.0:6032」,表示监听所有网络接口的 6032 端口,设想你有一个外网能访问的网络接口,那么恶意用户将能使用缺省的用户名密码进入到你的 admin 系统,所以不要用缺省的用户名和密码,也不要缺省监听外网接口,切记!切记!切记!

其次,注意 mysql_variables 里的 interfaces,因为 PHP 要通过本地的 Unix Domain Socket 来请求 ProxySQL 的连接池,所以 interfaces 不要使用 ip:port 的形式,而是设置成本地Unix Domain Socket 的形式,本例中设置为 /var/run/proxysql.sock,需要提醒的是很多人喜欢把 Socket 文件放到 /tmp 路径下,这不是一个好习惯,毕竟 /tmp 从名字上看就不像是一个良家妇女,大家都想弄两下,搞不好谁        rm 了一下就糟了。

最后,注意 mysql_variables 里的 monitor_username 和 monitor_password,它设置了监控用户的相关信息,以便 ProxySQL 随时掌握后端 MySQL 服务器的状态,一定要记得提前在后端 MySQL 服务器上创建相应的帐号,我一开始就没创建监控帐号,结果 ProxySQL 运行一段时间就没响应了,这是因为当 ProxySQL 不断用配置里的监控帐号和密码尝试去访问后端服务器的时候,会生成很多「Access denied        for user ‘monitor’@’…’」的错误,当达到一定阈值,就会导致「Host ‘…’ is blocked because of many connection errors」,此时 ProxySQL 就无法响应请求了,必须在 MySQL 上「mysqladmin flush-hosts」才行。相关的日志信息可以在「SELECT * FROM monitor.mysql_server_ping_log」里查看到。

下面让我们压测看看性能怎么样,测试脚本 test.php 如下:

<?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);
}

?&gt;
登录后复制

通过 ab 模拟一个高并发的场景,压测看看性能有没有提升:

shell&gt; ab -k -n 10000 -c 100 "http://path/test.php?proxysql=0"
shell&gt; ab -k -n 10000 -c 100 "http://path/test.php?proxysql=1"
登录后复制

最终,我在一台一般配置的服务器上,不通过 ProxySQL 得到了大约 1500 的 RPS,通过 ProxySQL 得到了大约 2000 的 RPS,也就是说,ProxySQL 带来了 25% 的性能提升。

想了解更多相关文章,敬请关注php mysql栏目!

以上就是详解通过ProxySQL提升PHP/MySQL的性能的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:juejin网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号