関連する学習の推奨事項: mysql チュートリアル
数日前、Redis 接続プールを実装する方法を紹介しました。 Twemproxy: これにより、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.configurationから取得します。構成ファイルの使用を強制する場合は、初期コマンドを使用する必要があります。
まず、admin_variables の admin_credentials
に注目してください。デフォルト値は「admin:admin」です。これは、デフォルトのユーザー名とパスワードが両方とも admin であることを意味します。値が「0.0.0.0:6032」の場合は、すべてのネットワーク インターフェイスのポート 6032 をリッスンすることを意味します。外部ネットワークからアクセスできるネットワーク インターフェイスがあると想像してください。悪意のあるユーザーは、デフォルトのユーザー名とパスワードを使用してアクセスできるようになります。したがって、デフォルトのユーザー名とパスワードを使用しないでください。また、デフォルトで外部ネットワーク インターフェイスでリッスンしないように注意してください。覚えて!覚えて!
2 番目に、mysql_variables のインターフェイスに注意してください。PHP はローカル Unix ドメイン ソケット経由で ProxySQL 接続プールをリクエストする必要があるため、インターフェイスでは ip:port 形式を使用せず、ローカルのインターフェイスに設定する必要があります。 Unix ドメイン ソケット形式です。この例では、/var/run/proxysql.sock に設定されています。多くの人がソケット ファイルを /tmp パスの下に置きたがることに注意してください。これは良い習慣ではありません。結局のところ、 /tmp は名前からしてパスのようには見えません。良家の女性は誰でも 2 回やりたがります。誰かが 1 回 rm するとまずいかもしれません。
最後に、mysql_variables のmonitor_username とmonitor_password に注意してください。これは、ProxySQL がバックエンド MySQL サーバーのステータスをいつでも追跡できるように、監視ユーザーの関連情報を設定します。必ず覚えておいてください。バックエンドのMySQLサーバーに対応するアカウントを事前に作成するため、最初に監視アカウントを作成しなかった結果、ProxySQLがしばらく実行すると応答しなくなってしまったためです。 ProxySQL が構成内の監視アカウントとパスワードを使用し続けてバックエンド サーバーにアクセスしようとすると、「ユーザー 'monitor'@'...' のアクセスが拒否されました」エラーが大量に生成されます。しきい値に達すると、「接続エラーが多いため、ホスト '...' はブロックされています。この時点では、ProxySQL はリクエストに応答できません。MySQL では、「mysqladmin flash-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 サイトの他の関連記事を参照してください。