>  기사  >  주제  >  ProxySQL 방식을 통해 PHP/MySQL 성능 향상

ProxySQL 방식을 통해 PHP/MySQL 성능 향상

coldplay.xixi
coldplay.xixi앞으로
2020-09-10 17:03:401984검색

ProxySQL 방식을 통해 PHP/MySQL 성능 향상

관련 학습 권장 사항: mysql 튜토리얼

몇일 전 저는 PHP/Redis의 성능을 향상시키기 위해 Twemproxy를 통해 Redis 연결 풀을 구현하는 방법을 소개했습니다. 오늘은 MySQL 연결 풀을 구현하여 PHP/MySQL의 성능을 향상시킬 수 있는 ProxySQL을 소개하고자 합니다. 사실 원리는 비슷하지만 그 과정에서 자세히 설명하겠습니다. ProxySQL을 구성하고 사용하면서 몇 가지 사소한 문제가 발생했는데 이를 기록해야겠다는 생각이 들었습니다.

설치 과정에 대한 자세한 설명은 공식 위키에 있습니다. 주로 /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에서 얻었습니다. 구성 파일을 강제로 사용하려면 초기 명령을 사용해야 합니다.

먼저 admin_variables의 admin_credentials에 주의하세요. 기본값은 "admin:admin"입니다. 이는 기본 사용자 이름과 비밀번호가 모두 admin이라는 의미입니다. 기본값은 "0.0.0.0:6032"입니다. 이는 네트워크 인터페이스의 모든 포트 6032를 모니터링한다는 의미입니다. 외부 네트워크에서 액세스할 수 있는 네트워크 인터페이스가 있다고 가정해 보십시오. 그러면 악의적인 사용자가 기본 사용자 이름과 비밀번호를 사용하여 관리 시스템에 들어갈 수 있습니다. 기본 사용자 이름과 비밀번호를 사용하고, 외부 네트워크 인터페이스를 지방적으로 모니터링하세요. 기억하세요! 기억하다! 기억하다!

둘째, mysql_variables의 인터페이스에 주의하세요. PHP는 로컬 Unix 도메인 소켓을 통해 ProxySQL 연결 풀을 요청해야 하므로 인터페이스는 ip:port 형식을 사용하지 않고 로컬 형식으로 설정해야 합니다. Unix 도메인 소켓. 이 예에서는 /var/run/proxysql.sock로 설정합니다. 많은 사람들이 소켓 파일을 /tmp 경로에 두는 것을 좋아한다는 점을 기억해야 합니다. 결국, /tmp는 그렇지 않습니다. 이름부터 좋은 여자 같군요. 여러분 두 번 해보고 싶은데 한 번 RM하면 망할 것 같아요.

마지막으로 mysql_variables의 monitor_username과 monitor_password에 주의하세요. ProxySQL이 언제든지 백엔드 MySQL 서버의 상태를 추적할 수 있도록 모니터링 사용자의 관련 정보를 설정합니다. 미리 백엔드 MySQL 서버에 계정을 등록해서 시작했는데 모니터링 계정을 만들지 않아서 한동안 실행 후 ProxySQL이 응답을 멈췄습니다. 백엔드 서버에 액세스하려고 시도하는 구성에서는 "사용자 'monitor'@'...'에 대한 액세스가 거부되었습니다."라는 오류가 많이 발생하고, 특정 임계값에 도달하면 "Host'.. .'이(가) 연결 오류가 많아 차단되었습니다." 이 때 ProxySQL은 요청에 응답할 수 없습니다. MySQL에서는 "mysqladmin flash-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);
}
?>

ab를 통해 높은 동시성 시나리오를 시뮬레이션하고, 성능이 향상되었는지 확인하기 위한 스트레스 테스트:

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"

마지막으로, 일반적으로 구성된 서버에서는 ProxySQL 없이 약 1,500 RPS를 얻었고 ProxySQL을 사용하면 약 2,000 RPS를 얻었습니다. 즉, ProxySQL은 25% 성능 향상을 가져옵니다.

더 많은 관련 글을 알고 싶다면

php mysql

칼럼을 주목해주세요!

위 내용은 ProxySQL 방식을 통해 PHP/MySQL 성능 향상의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제