관련 학습 권장 사항: 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 = '...'; $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); } ?>
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!