開発者ドキュメント

Ubuntu16.04でMySQLのロードバランサーとしてProxySQLを使用する方法

序章

ProxySQL はオープンソースのMySQLプロキシサーバーです。つまり、MySQLサーバーとそのデータベースにアクセスするアプリケーションの間の仲介役として機能します。 ProxySQLは、複数のデータベースサーバーのプール間でトラフィックを分散することでパフォーマンスを向上させ、1つ以上のデータベースサーバーに障害が発生した場合にスタンバイに自動的にフェイルオーバーすることで可用性を向上させます。

このガイドでは、ProxySQLを自動フェイルオーバーを備えた複数のMySQLサーバーのロードバランサーとして設定します。 例として、このチュートリアルでは3つのMySQLサーバーのマルチプライマリ複製クラスターを使用しますが、他のクラスター構成でも同様のアプローチを使用できます。

前提条件

このチュートリアルに従うには、次のものが必要です。

ステップ1—ProxySQLをインストールする

ProxySQLの開発者は、のGitHubリリースページですべてのProxySQLリリースの公式Ubuntuパッケージを提供しているため、そこから最新のパッケージバージョンをダウンロードしてインストールします。

最新のパッケージはリリースリストにあります。 命名規則はproxysql_version-distribution.debです。ここで、versionはバージョン1.4.4の1.4.4のような文字列であり、distributionubuntu16_amd64のような文字列です。 ]64ビットUbuntu16.04の場合。

最新の公式パッケージ(執筆時点では1.4.4)を/tmpディレクトリにダウンロードします。

  1. cd /tmp
  2. curl -OL https://github.com/sysown/proxysql/releases/download/v1.4.4/proxysql_1.4.4-ubuntu16_amd64.deb

.debソフトウェアパッケージの管理に使用されるdpkgを使用してパッケージをインストールします。 -iフラグは、指定されたファイルからインストールすることを示します。

  1. sudo dpkg -i proxysql_*

この時点で、.debファイルは不要になったため、削除できます。

  1. rm proxysql_*

次に、ProxySQLインスタンスに接続するためのMySQLクライアントアプリケーションが必要です。 これは、ProxySQLが管理タスクにMySQL互換のインターフェースを内部的に使用しているためです。 使用するのはmysqlコマンドラインツールです。これは、Ubuntuリポジトリで利用可能なmysql-clientパッケージの一部です。

パッケージリポジトリを更新して、事前にバンドルされた最新バージョンを入手していることを確認してから、mysql-clientパッケージをインストールします。

  1. sudo apt-get update
  2. sudo apt-get install mysql-client

これで、ProxySQLを実行するためのすべての要件が満たされましたが、インストール後にサービスが自動的に開始されないため、今すぐ手動で開始してください。

  1. sudo systemctl start proxysql

これで、ProxySQLはデフォルトの構成で実行されているはずです。 systemctlで確認できます。

systemctl status proxysql

出力は次のようになります。

Output
● proxysql.service - LSB: High Performance Advanced Proxy for MySQL Loaded: loaded (/etc/init.d/proxysql; bad; vendor preset: enabled) Active: active (running) since Thu 2017-12-21 19:19:20 UTC; 5s ago Docs: man:systemd-sysv-generator(8) Process: 12350 ExecStart=/etc/init.d/proxysql start (code=exited, status=0/SUCCESS) Tasks: 23 Memory: 30.9M CPU: 86ms CGroup: /system.slice/proxysql.service ├─12355 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql └─12356 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql

active (running)行は、ProxySQLがインストールされて実行されていることを意味します。

次に、ProxySQLの管理インターフェースへのアクセスに使用するパスワードを設定してセキュリティを強化します。

ステップ2—ProxySQL管理者パスワードの設定

新しいProxySQLインストールを初めて開始するときは、パッケージが提供する構成ファイルを使用して、すべての構成変数のデフォルト値を初期化します。 この初期化後、ProxySQLはその構成をデータベースに保存します。データベースは、コマンドラインから管理および変更できます。

ProxySQLで管理者パスワードを設定するには、その構成データベースに接続して、適切な変数を更新します。

まず、管理インターフェースにアクセスします。 パスワードの入力を求められます。デフォルトのインストールでは、adminです。

  1. mysql -u admin -p -h 127.0.0.1 -P 6032 --prompt='ProxySQLAdmin> '

接続すると、ProxySQLAdmin>プロンプトが表示されます。

ProxySQL administration console prompt
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.5.30 (ProxySQL Admin Module) Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. ProxySQLAdmin>

global_variablesデータベースのadmin-admin_credentials構成変数を更新(UPDATE)して、管理者アカウントのパスワードを変更します。 以下のコマンドのpasswordを、選択した強力なパスワードに変更することを忘れないでください。

  1. UPDATE global_variables SET variable_value='admin:password' WHERE variable_name='admin-admin_credentials';
Output
Query OK, 1 row affected (0.00 sec)

ProxySQLの構成システムがどのように機能するかにより、この変更はすぐには有効になりません。 これは、3つの別個のレイヤーで構成されています。

現在、行った変更はメモリにあります。 変更を有効にするには、memory設定をruntimeレルムにコピーしてから、diskに保存して永続化する必要があります。

  1. LOAD ADMIN VARIABLES TO RUNTIME;
  2. SAVE ADMIN VARIABLES TO DISK;

これらのADMINコマンドは、管理コマンドラインインターフェイスに関連する変数のみを処理します。 ProxySQLは、MYSQLなどの同様のコマンドを公開して、構成の他の部分を処理します。 これらは、このチュートリアルの後半で使用します。

ProxySQLがインストールされ、新しい管理者パスワードで実行されたので、ProxySQLがそれらを監視できるように3つのMySQLノードを設定しましょう。 ただし、後で使用するため、ProxySQLインターフェイスは開いたままにしておきます。

ステップ3—MySQLでのモニタリングの構成

ProxySQLは、MySQLノードと通信して、それらの状態を評価できるようにする必要があります。 そのためには、専用ユーザーで各サーバーに接続できる必要があります。

ここでは、MySQLノードで必要なユーザーを構成し、ProxySQLがグループレプリケーションの状態を照会できるようにする追加のSQL関数をインストールします。

MySQLグループレプリケーションはすでに実行されているため、次の手順はグループの単一メンバーでのみ実行する必要があります。

2番目の端末で、MySQLノードの1つを使用してサーバーにログインします。

  1. ssh sammy@your_mysql_server_ip_1

ProxySQLグループレプリケーションサポートが機能するために必要ないくつかの機能を含むSQLファイルをダウンロードします。

  1. curl -OL https://gist.github.com/lefred/77ddbde301c72535381ae7af9f968322/raw/5e40b03333a3c148b78aa348fd2cd5b5dbb36e4d/addition_to_sys.sql

:このファイルはProxySQLの作成者によって提供されていますが、アドホックな方法で:個人のGitHubリポジトリの gist であるため、移動または削除される可能性があります日付の。 将来的には、公式のProxySQLリポジトリにバージョン管理されたファイルとして追加される可能性があります。

このファイルのコンテキストと内容の詳細については、MySQLグループレプリケーションのネイティブProxySQLサポートに関する作成者のブログ投稿を参照してください。

less addition_to_sys.sqlを使用してファイルの内容を表示できます。

準備ができたら、ファイル内のコマンドを実行します。 MySQL管理者パスワードの入力を求められます。

  1. mysql -u root -p < addition_to_sys.sql

コマンドが正常に実行されると、出力は生成されません。 その場合、すべてのMySQLノードは、ProxySQLがグループレプリケーションステータスを認識するために必要な関数を公開します。

次に、ProxySQLがインスタンスの状態を監視するために使用する専用ユーザーを作成する必要があります。

MySQLインタラクティブプロンプトを開きます。これにより、rootパスワードの入力を再度求められます。

  1. mysql -u root -p

次に、ここでmonitorと呼ばれる専用ユーザーを作成します。 パスワードは必ず強力なものに変更してください。

  1. CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitorpassword';

MySQLサーバーの状態を照会する権限をmonitorユーザーに付与します。

  1. GRANT SELECT on sys.* to 'monitor'@'%';

最後に、変更を適用します。

  1. FLUSH PRIVILEGES;

グループレプリケーションのため、ヘルスモニタリング用のユーザーを1つのMySQLノードに追加し終えると、3つのノードすべてで完全に構成されます。

次に、MySQLノードにアクセスできるように、そのユーザーの情報でProxySQLを更新する必要があります。

ステップ4—ProxySQLでの監視の構成

ノードを監視するときに新しいユーザーアカウントを使用するようにProxySQLを構成するには、適切な構成変数をUPDATEします。 これは、手順2で管理者パスワードを設定する方法と非常によく似ています。

ProxySQL管理インターフェースに戻り、mysql-monitor_username変数を新しいアカウントのユーザー名に更新します。

  1. UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';

以前と同様に、構成は自動的に適用されないため、 runtime に移行し、diskに保存します。 今回は、MySQL構成変数を変更しているため、ADMINの代わりにMYSQLを使用してこれらの変数を更新していることに注意してください。

  1. LOAD MYSQL VARIABLES TO RUNTIME;
  2. SAVE MYSQL VARIABLES TO DISK;

監視アカウントはすべての端で構成され、次のステップはノード自体についてProxySQLに通知することです。

ステップ5—MySQLノードをProxySQLサーバープールに追加する

ProxySQLに3つのMySQLノードを認識させるには、ノードのセットとして指定されているホストグループにそれらを分散する方法をProxySQLに指示する必要があります。 各ホストグループは、12のような正の数で識別されます。 ProxySQLクエリルーティングを使用する場合、ホストグループはさまざまなSQLクエリをさまざまなホストセットにルーティングできます。

静的レプリケーション構成では、ホストグループを任意に設定できます。 ただし、ProxySQLのグループレプリケーションサポートは、レプリケーショングループ内のすべてのノードを次の4つの論理状態に自動的に分割します。

これらの4つの状態にはそれぞれ対応するホストグループがありますが、数値のグループ識別子は自動的に割り当てられません。

すべてをまとめると、各状態に使用する識別子をProxySQLに指示する必要があります。 ここでは、オフラインホストグループに1ライターホストグループに23を使用します。 ] reader ホストグループ、および backupwriterホストグループの場合は4

これらの識別子を設定するには、mysql_group_replication_hostgroups構成テーブルにこれらの変数と値を使用して新しい行を作成します。

  1. INSERT INTO mysql_group_replication_hostgroups (writer_hostgroup, backup_writer_hostgroup, reader_hostgroup, offline_hostgroup, active, max_writers, writer_is_also_reader, max_transactions_behind) VALUES (2, 4, 3, 1, 1, 3, 1, 100);

これらは、この行に設定されている追加の変数と、それぞれが行うことです。

注:この例では、すべてのノードがデータベースに書き込むことができるマルチプライマリトポロジを使用しているため、ライターホストグループ全体ですべてのSQLクエリのバランスを取ります。 他のトポロジでは、 writer (プライマリ)ノードと reader (セカンダリ)ノード間の分割により、読み取り専用クエリを書き込みクエリとは異なるノード/ホストグループにルーティングできます。 ProxySQLはこれを自動的に行いませんが、ルールを使用してクエリルーティングを設定できます。

ProxySQLがホストグループ間でノードを分散する方法を知ったので、MySQLサーバーをプールに追加できます。 そのためには、各サーバーのIPアドレスと初期ホストグループをINSERTテーブルに追加する必要があります。このテーブルには、ProxySQLが対話できるサーバーのリストが含まれています。

3つのMySQLサーバーをそれぞれ追加し、以下のコマンドのIPアドレスの例を必ず置き換えてください。

  1. INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.1', 3306);
  2. INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.2', 3306);
  3. INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.3', 3306);

ここで、2値はこれらすべてのノードを最初にライターに設定し、3306はデフォルトのMySQLポートを設定します。

以前と同様に、これらの変更を runtime に移行し、 disk に保存して、変更を有効にします。

  1. LOAD MYSQL SERVERS TO RUNTIME;
  2. SAVE MYSQL SERVERS TO DISK;

ProxySQLは、指定されたとおりにノードをホストグループに分散する必要があります。 ProxySQLが使用しているサーバーの現在の状態を公開するruntim330e_mysql_serversテーブルに対してSELECTクエリを実行して確認しましょう。

  1. SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;
Output
+--------------+-------------+--------+ | hostgroup_id | hostname | status | +--------------+-------------+--------+ | 2 | 203.0.113.1 | ONLINE | | 2 | 203.0.113.2 | ONLINE | | 2 | 203.0.113.3 | ONLINE | | 3 | 203.0.113.1 | ONLINE | | 3 | 203.0.113.2 | ONLINE | | 3 | 203.0.113.3 | ONLINE | +--------------+-------------+--------+ 6 rows in set (0.01 sec)

結果の表には、各サーバーが2回リストされています。ホストグループID 23にそれぞれ1回ずつ表示され、3つのノードすべてがライターとリーダーの両方であることを示しています。 すべてのノードはONLINEとマークされており、使用する準備ができていることを意味します。

ただし、それらを使用する前に、各ノードのMySQLデータベースにアクセスするためのユーザー資格情報を構成する必要があります。

ステップ6—MySQLユーザーの作成

ProxySQLはロードバランサーとして機能します。 エンドユーザーはProxySQLに接続し、ProxySQLは選択されたMySQLノードに接続を順番に渡します。 個々のノードに接続するために、ProxySQLはアクセスされた資格情報を再利用します。

レプリケーションノードにあるデータベースへのアクセスを許可するには、ProxySQLと同じ資格情報を持つユーザーアカウントを作成し、そのユーザーに必要な権限を付与する必要があります。

手順3と同様に、次の手順はグループの単一メンバーでのみ実行する必要があります。 メンバーは1人でも選べます。

パスワードplaygroundpasswordで識別されるplaygrounduserという名前の新しいユーザーを作成します。

  1. CREATE USER 'playgrounduser'@'%' IDENTIFIED BY 'playgroundpassword';

元のグループレプリケーションチュートリアルからplaygroundテストデータベースに完全にアクセスする権限を付与します。

  1. GRANT ALL PRIVILEGES on playground.* to 'playgrounduser'@'%';

次に、変更を適用してプロンプトを終了します。

  1. FLUSH PRIVILEGES;
  2. EXIT;

新しく構成された資格情報を使用してデータベースをノード上で直接試行することにより、ユーザーが適切に作成されたことを確認できます。

新しいユーザーでMySQLインターフェースを再度開きます。これにより、パスワードの入力を求められます。

  1. mysql -u playgrounduser -p

ログインしたら、playgroundデータベースでテストクエリを実行します。

  1. SHOW TABLES FROM playground;
Output
+----------------------+ | Tables_in_playground | +----------------------+ | equipment | +----------------------+ 1 row in set (0.00 sec)

元のレプリケーションチュートリアルで作成されたequipmentテーブルを示すデータベース内のテーブルの表示リストは、ユーザーがノード上で正しく作成されたことを確認します。

これでMySQLインターフェースから切断できますが、サーバーに接続している端末は開いたままにしておきます。 これを使用して、最後のステップでテストを実行します。

  1. EXIT;

次に、ProxySQLサーバーに対応するユーザーを作成する必要があります。

ステップ7—ProxySQLユーザーを作成する

最後の構成手順は、 playgrounduser ユーザーを使用したProxySQLへの接続を許可し、それらの接続をノードに渡すことです。

そのためには、ユーザーの資格情報を保持するmysql_usersテーブルに構成変数を設定する必要があります。 ProxySQLインターフェイスで、ユーザー名、パスワード、およびデフォルトのホストグループを構成データベースに追加します(ライターホストグループの場合は2)。

  1. INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('playgrounduser', 'playgroundpassword', 2);

構成をruntimeに移行し、 disk に保存して、新しい構成を有効にします。

  1. LOAD MYSQL USERS TO RUNTIME;
  2. SAVE MYSQL USERS TO DISK;

これらの資格情報を使用してデータベースノードに接続できることを確認するには、別のターミナルウィンドウを開き、ProxySQLサーバーにSSHで接続します。 後で管理プロンプトが必要になるので、まだ閉じないでください。

  1. ssh sammy@your_proxysql_server_ip

ProxySQLはポート6033で着信クライアント接続をリッスンするため、 playgrounduserとポート6033を使用して実際のデータベース(管理インターフェイスではない)に接続してみてください。 パスワードの入力を求められます。この例ではplaygroundpasswordでした。

  1. mysql -u playgrounduser -p -h 127.0.0.1 -P 6033 --prompt='ProxySQLClient> '

ここでは、プロンプトをProxySQLClient>に設定して、管理インターフェイスのプロンプトと区別できるようにします。 最終構成をテストするときに両方を使用します。

プロンプトが開きます。これは、クレデンシャルがProxySQL自体によって受け入れられたことを意味します。

  1. ProxySQL client prompt
    Welcome to the MySQL monitor. Commands end with ; or \g.
  2. Your MySQL connection id is 31
  3. Server version: 5.5.30 (ProxySQL)
  4. Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
  5. Oracle is a registered trademark of Oracle Corporation and/or its
  6. affiliates. Other names may be trademarks of their respective
  7. owners.
  8. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  9. ProxySQLClient>

ProxySQLがノードの1つに接続するかどうかを確認するために、簡単なステートメントを実行してみましょう。 このコマンドは、実行中のサーバーのホスト名をデータベースに照会し、サーバーのホスト名を唯一の出力として返します。

  1. SELECT @@hostname;

構成によると、このクエリはProxySQLによってwriterホストグループに割り当てられた3つのノードの1つに送信される必要があります。 出力は次のようになります。ここで、member1はMySQLノードの1つのホスト名です。

Output
+------------+ | @@hostname | +------------+ | member1 | +------------+ 1 row in set (0.00 sec)

これで構成が完了し、ProxySQLが3つのMySQLノード間の接続を負荷分散できるようになります。

最後のステップでは、ProxySQLがデータベースで読み取りおよび書き込みステートメントを実行できること、および一部のノードがダウンした場合でもクエリを処理できることを確認します。

ステップ8—ProxySQL構成の確認

ProxySQLとMySQLノード間の接続が機能していることがわかっているため、最終テストでは、データベースのアクセス許可でProxySQLからの読み取りステートメントと書き込みステートメントの両方が許可されていること、およびこれらのステートメントがグループは失敗します。

ProxySQLクライアントプロンプトでSELECTステートメントを実行して、playgroundデータベースからデータを読み取れることを確認します。

  1. SELECT * FROM playground.equipment;

出力は次のようになり、グループレプリケーションチュートリアルで作成された3つのアイテムが含まれます。 これは、ProxySQLを介してMySQLデータベースからデータを正常に読み取ったことを意味します。

Output
+----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 3 | slide | 2 | blue | | 10 | swing | 10 | yellow | | 17 | seesaw | 3 | green | +----+--------+-------+--------+ 3 rows in set (0.00 sec)

次に、5つの赤いドリルを表すテーブルにいくつかの新しいデータを挿入して書き込みを試みます。

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("drill", 5, "red");

次に、前のSELECTコマンドを再実行して、データが挿入されていることを確認します。

  1. SELECT * FROM playground.equipment;

出力の新しいドリルラインは、ProxySQLを介してMySQLデータベースにデータを正常に書き込んだことを意味します。

Output
+----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 3 | slide | 2 | blue | | 10 | swing | 10 | yellow | | 17 | seesaw | 3 | green | | 24 | drill | 5 | red | +----+--------+-------+--------+ 4 rows in set (0.00 sec)

ProxySQLがデータベースを完全に使用できるようになったことはわかっていますが、サーバーに障害が発生した場合はどうなりますか?

いずれかのMySQLサーバーのコマンドラインから、MySQLプロセスを停止して障害をシミュレートします。

  1. systemctl stop mysql

データベースが停止したら、ProxySQLクライアントプロンプトからequipmentテーブルのデータを再度クエリしてみてください。

  1. SELECT * FROM playground.equipment;

出力は変更しないでください。 以前と同じように機器リストが表示されます。 これは、ProxySQLが、ノードの1つに障害が発生したことを認識し、ステートメントを実行するために別のノードに切り替えたことを意味します。

手順5のように、ProxySQL管理プロンプトからruntime_mysql_serversテーブルをクエリすることで、これを確認できます。

  1. SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;

出力は次のようになります。

Output
+--------------+-------------+---------+ | hostgroup_id | hostname | status | +--------------+-------------+---------+ | 1 | 203.0.113.1 | SHUNNED | | 2 | 203.0.113.2 | ONLINE | | 2 | 203.0.113.3 | ONLINE | | 3 | 203.0.113.2 | ONLINE | | 3 | 203.0.113.3 | ONLINE | +--------------+-------------+---------+ 6 rows in set (0.01 sec)

停止したノードはshunnedになりました。これは、一時的にアクセスできないと見なされるため、すべてのトラフィックが残りの2つのオンラインノードに分散されることを意味します。

ProxySQLはこのノードの状態を常に監視し、正常に動作する場合は online に戻すか、手順4で設定したタイムアウトしきい値を超えた場合はoffsetとマークします。

この監視をテストしてみましょう。 MySQLサーバーに戻り、ノードをバックアップします。

  1. systemctl start mysql

しばらく待ってから、ProxySQL管理プロンプトからruntime_mysql_serversテーブルを再度クエリします。

  1. SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;

ProxySQLは、ノードが再び使用可能になったことをすぐに認識し、オンラインとしてマークします。

Output
+--------------+-------------+--------+ | hostgroup_id | hostname | status | +--------------+-------------+--------+ | 2 | 203.0.113.1 | ONLINE | | 2 | 203.0.113.2 | ONLINE | | 2 | 203.0.113.3 | ONLINE | | 3 | 203.0.113.1 | ONLINE | | 3 | 203.0.113.2 | ONLINE | | 3 | 203.0.113.3 | ONLINE | +--------------+-------------+--------+ 6 rows in set (0.01 sec)

別のノード(または2つのノード)でこのテストを繰り返して、少なくとも1つのノードが稼働している場合は、データベースを読み取り専用アクセスと読み取り/書き込みアクセスの両方に自由に使用できることを確認できます。

結論

このチュートリアルでは、マルチプライマリグループレプリケーショントポロジ内の複数の書き込み対応MySQLノード間でSQLクエリの負荷を分散するようにProxySQLを構成しました。 この種の構成では、負荷を複数のサーバーに分散することにより、データベースを頻繁に使用する場合のパフォーマンスを向上させることができます。 また、データベースサーバーの1つがオフラインになった場合のフェイルオーバー機能も提供できます。

ただし、ここでは例として1つのノードトポロジのみを取り上げました。 ProxySQLは、他の多くのMySQLトポロジに対しても、堅牢なクエリキャッシュ、ルーティング、およびパフォーマンス分析を提供します。 ProxySQLの機能と、それらを使用してさまざまなデータベース管理の問題を解決する方法の詳細については、公式ProxySQLブログおよび ProxySQLwikiを参照してください。

モバイルバージョンを終了