数日前、Twemproxy を介して Redis 接続プールを実装して PHP/Redis のパフォーマンスを向上させる方法を紹介しました。今日は、MySQL 接続プールを実装して PHP/MySQL のパフォーマンスを向上させることができる ProxySQL を紹介したいと思います。実際、原理は似ています。詳しく説明するために別の記事を書く必要はありませんが、その過程では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 から取得されます。構成ファイルの使用を強制する場合は、初期コマンドを使用する必要があります。詳細については、「ProxySQL のインストールと構成の詳細な説明」を参照してください。さらに、注意すべき細かい点がいくつかあります:
まず、admin_variables の admin_credentials に注意してください。デフォルト値は「admin:admin」です。これは、デフォルトのユーザー名とパスワードが両方とも「admin:admin」であることを意味します。デフォルト値は「0.0.0.0:6032」で、すべてのネットワーク インターフェイスのポート 6032 をリッスンすることを意味します。外部ネットワークからアクセスできるネットワーク インターフェイスがあり、悪意のあるユーザーがアクセスできると想像してください。はデフォルトのユーザー名とパスワードを使用して管理システムに入ることができるため、デフォルトのユーザー名とパスワードを使用したり、デフォルトで外部ネットワーク インターフェイスでリッスンしないように注意してください。覚えて!覚えて!
2 番目に、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がしばらく実行すると応答しなくなりました。これは、ProxySQLがアクセスを試行し続けるためです。バックエンド サーバーが構成で監視アカウントとパスワードを使用すると、大量の「アクセスが拒否されました」メッセージが生成されます。 ユーザー 'monitor'@'...' のエラーが特定のしきい値に達すると、「多くの接続エラーのため、ホスト '...' がブロックされています」が発生します。このとき、ProxySQL は次のことを行うことができません。 MySQL では「mysqladmin」を使用する必要があります。flush-hosts で十分です。関連するログ情報は、「SELECT * FROMmonitor.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 中国語 Web サイトの他の関連記事を参照してください。