ホームページ  >  記事  >  トピック  >  ProxySQL メソッドによる PHP/MySQL のパフォーマンスの向上

ProxySQL メソッドによる PHP/MySQL のパフォーマンスの向上

coldplay.xixi
coldplay.xixi転載
2020-09-10 17:03:401880ブラウズ

ProxySQL メソッドによる PHP/MySQL のパフォーマンスの向上

関連する学習の推奨事項: 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 = &#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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。