Ubuntu16.04でMySQLのロードバランサーとしてProxySQLを使用する方法
序章
ProxySQL はオープンソースのMySQLプロキシサーバーです。つまり、MySQLサーバーとそのデータベースにアクセスするアプリケーションの間の仲介役として機能します。 ProxySQLは、複数のデータベースサーバーのプール間でトラフィックを分散することでパフォーマンスを向上させ、1つ以上のデータベースサーバーに障害が発生した場合にスタンバイに自動的にフェイルオーバーすることで可用性を向上させます。
このガイドでは、ProxySQLを自動フェイルオーバーを備えた複数のMySQLサーバーのロードバランサーとして設定します。 例として、このチュートリアルでは3つのMySQLサーバーのマルチプライマリ複製クラスターを使用しますが、他のクラスター構成でも同様のアプローチを使用できます。
前提条件
このチュートリアルに従うには、次のものが必要です。
-
この最初のUbuntu16.04サーバーセットアップチュートリアルでセットアップされた1つのUbuntu16.04サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。 このサーバーがProxySQLインスタンスになります。
-
マルチプライマリレプリケーショングループを形成するように構成された3つのMySQLサーバー。 これを設定するには、Ubuntu16.04チュートリアルでMySQLグループレプリケーションを構成する方法を実行します。 シングルプライマリまたはマルチプライマリの選択セクションで、マルチプライマリレプリケーショングループの手順に従います。
ステップ1—ProxySQLをインストールする
ProxySQLの開発者は、のGitHubリリースページですべてのProxySQLリリースの公式Ubuntuパッケージを提供しているため、そこから最新のパッケージバージョンをダウンロードしてインストールします。
最新のパッケージはリリースリストにあります。 命名規則は proxysql_version-distribution.deb
、 どこ version
のような文字列です 1.4.4
バージョン1.4.4の場合、および distribution
のような文字列です ubuntu16_amd64
64ビットUbuntu16.04の場合。
最新の公式パッケージ(執筆時点では1.4.4)をにダウンロードします。 /tmp
ディレクトリ。
- cd /tmp
- curl -OL https://github.com/sysown/proxysql/releases/download/v1.4.4/proxysql_1.4.4-ubuntu16_amd64.deb
でパッケージをインストールします dpkg
、.debソフトウェアパッケージの管理に使用されます。 The -i
フラグは、指定されたファイルからインストールすることを示します。
- sudo dpkg -i proxysql_*
この時点で、あなたはもはや必要ありません .deb
ファイルなので、削除できます。
- rm proxysql_*
次に、ProxySQLインスタンスに接続するためのMySQLクライアントアプリケーションが必要です。 これは、ProxySQLが管理タスクにMySQL互換のインターフェースを内部的に使用しているためです。 使用します mysql
コマンドラインツールは、 mysql-client
Ubuntuリポジトリで利用可能なパッケージ。
パッケージリポジトリを更新して、事前にバンドルされた最新バージョンを取得していることを確認してから、 mysql-client
パッケージ。
- sudo apt-get update
- sudo apt-get install mysql-client
これで、ProxySQLを実行するためのすべての要件が満たされましたが、インストール後にサービスが自動的に開始されないため、今すぐ手動で開始してください。
- 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
The active (running)
行は、ProxySQLがインストールされて実行されていることを意味します。
次に、ProxySQLの管理インターフェースへのアクセスに使用するパスワードを設定することでセキュリティを強化します。
ステップ2—ProxySQL管理者パスワードの設定
新しいProxySQLインストールを初めて開始するときは、パッケージが提供する構成ファイルを使用して、すべての構成変数のデフォルト値を初期化します。 この初期化後、ProxySQLはその構成をデータベースに保存します。データベースは、コマンドラインから管理および変更できます。
ProxySQLで管理者パスワードを設定するには、その構成データベースに接続して、適切な変数を更新します。
まず、管理インターフェースにアクセスします。 パスワードの入力を求められます。デフォルトのインストールでは、次のようになります。 admin
.
- mysql -u admin -p -h 127.0.0.1 -P 6032 --prompt='ProxySQLAdmin> '
-u
接続するユーザーを指定します。これはadminで、構成設定の変更などの管理タスクのデフォルトユーザーです。-h 127.0.0.1
言うmysql
ローカルProxySQLインスタンスに接続します。 ProxySQLはソケットファイルをリッスンしないため、これを明示的に定義する必要があります。mysql
デフォルトで想定します。-P
接続するポートを指定します。 ProxySQLの管理インターフェースはリッスンします6032
.--prompt
デフォルトのプロンプトを変更するオプションのフラグです。通常はmysql>
. ここでは、に変更しますProxySQLAdmin>
ProxySQL管理インターフェースに接続していることを明確にするため。 これは、後でレプリケートされたデータベースサーバーのMySQLインターフェイスにも接続するときに混乱を避けるのに役立ちます…
接続すると、 ProxySQLAdmin>
促す:
ProxySQL administration console promptWelcome 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>
更新して管理者アカウントのパスワードを変更します(UPDATE
) admin-admin_credentials
の構成変数 global_variables
データベース。 変更することを忘れないでください password
以下のコマンドで、選択した強力なパスワードを入力してください。
- UPDATE global_variables SET variable_value='admin:password' WHERE variable_name='admin-admin_credentials';
OutputQuery OK, 1 row affected (0.00 sec)
ProxySQLの構成システムがどのように機能するかにより、この変更はすぐには有効になりません。 これは、3つの別個のレイヤーで構成されています。
- memory 。これは、コマンドラインインターフェイスから変更を加えるときに変更されます。
- runtime 。これは、ProxySQLによって効果的な構成として使用されます。
- disk 。これは、再起動後も構成を永続化するために使用されます。
現在、行った変更はメモリにあります。 変更を有効にするには、memory設定をruntimeレルムにコピーしてから、diskに保存して永続化する必要があります。
- LOAD ADMIN VARIABLES TO RUNTIME;
- SAVE ADMIN VARIABLES TO DISK;
これらは ADMIN
コマンドは、管理コマンドラインインターフェイスに関連する変数のみを処理します。 ProxySQLは、次のような同様のコマンドを公開します。 MYSQL
、その構成の他の部分を処理します。 これらは、このチュートリアルの後半で使用します。
ProxySQLがインストールされ、新しい管理者パスワードで実行されたので、ProxySQLがそれらを監視できるように3つのMySQLノードを設定しましょう。 ただし、後で使用するため、ProxySQLインターフェイスは開いたままにしておきます。
ステップ3—MySQLでのモニタリングの構成
ProxySQLは、MySQLノードの状態を評価できるようにするためにMySQLノードと通信する必要があります。 そのためには、専用ユーザーで各サーバーに接続できる必要があります。
ここでは、MySQLノードで必要なユーザーを構成し、ProxySQLがグループレプリケーションの状態を照会できるようにする追加のSQL関数をインストールします。
MySQLグループレプリケーションはすでに実行されているため、次の手順はグループの単一メンバーでのみ実行する必要があります。
2番目の端末で、MySQLノードの1つを使用してサーバーにログインします。
- ssh sammy@your_mysql_server_ip_1
ProxySQLグループレプリケーションサポートが機能するために必要ないくつかの機能を含むSQLファイルをダウンロードします。
- 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管理者パスワードの入力を求められます。
- mysql -u root -p < addition_to_sys.sql
コマンドが正常に実行されると、出力は生成されません。 その場合、すべてのMySQLノードは、ProxySQLがグループレプリケーションステータスを認識するために必要な関数を公開します。
次に、ProxySQLがインスタンスの状態を監視するために使用する専用ユーザーを作成する必要があります。
MySQLインタラクティブプロンプトを開きます。これにより、rootパスワードの入力を再度求められます。
- mysql -u root -p
次に、ここでmonitorと呼ばれる専用ユーザーを作成します。 パスワードは必ず強力なものに変更してください。
- CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitorpassword';
MySQLサーバーの状態を照会するためのユーザー特権をmonitorユーザーに付与します。
- GRANT SELECT on sys.* to 'monitor'@'%';
最後に、変更を適用します。
- FLUSH PRIVILEGES;
グループレプリケーションのため、ヘルスモニタリング用のユーザーを1つのMySQLノードに追加し終えると、3つのノードすべてで完全に構成されます。
次に、MySQLノードにアクセスできるように、そのユーザーの情報でProxySQLを更新する必要があります。
ステップ4—ProxySQLでの監視の構成
ノードを監視するときに新しいユーザーアカウントを使用するようにProxySQLを構成するには、次のようにします。 UPDATE
適切な構成変数。 これは、手順2で管理者パスワードを設定する方法と非常によく似ています。
ProxySQL管理インターフェースに戻り、更新します。 mysql-monitor_username
新しいアカウントのユーザー名への変数。
- UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
以前と同様に、構成は自動的に適用されないため、 runtime に移行し、diskに保存します。 今回は、使用していることに注意してください MYSQL
それ以外の ADMIN
MySQL構成変数を変更しているため、これらの変数を更新します。
- LOAD MYSQL VARIABLES TO RUNTIME;
- SAVE MYSQL VARIABLES TO DISK;
監視アカウントはすべての端で構成され、次のステップはノード自体についてProxySQLに通知することです。
ステップ5—MySQLノードをProxySQLサーバープールに追加する
ProxySQLに3つのMySQLノードを認識させるには、ノードのセットとして指定されているホストグループにそれらを分散する方法をProxySQLに指示する必要があります。 各ホストグループは、次のような正の数で識別されます。 1
また 2
. ProxySQLクエリルーティングを使用する場合、ホストグループはさまざまなSQLクエリをさまざまなホストセットにルーティングできます。
静的レプリケーション構成では、ホストグループを任意に設定できます。 ただし、ProxySQLのグループレプリケーションサポートは、レプリケーショングループ内のすべてのノードを次の4つの論理状態に自動的に分割します。
- writer は、データを変更するクエリを受け入れることができるMySQLノードです。 ProxySQLは、このグループで定義された最大量まですべてのプライマリノードを維持するようにします。
- バックアップライター。これは、データを変更するクエリを受け入れることができるMySQLノードでもあります。 ただし、これらのノードはライターとして指定されていません。 維持されているライターの定義された量を超えるプライマリノードはこのグループに保持され、ライターの1つに障害が発生した場合にライターに昇格します。
- reader は、データを変更するクエリを受け入れることができないMySQLノードであり、読み取り専用ノードとして使用する必要があります。 ProxySQLはここにスレーブノードのみを配置します。
- offset 。これは、接続の欠如やトラフィックの遅延などの問題が原因で誤動作しているノード用です。
これらの4つの状態にはそれぞれ対応するホストグループがありますが、数値のグループ識別子は自動的に割り当てられません。
すべてをまとめると、各状態に使用する識別子をProxySQLに指示する必要があります。 ここでは、 1
オフラインホストグループの場合、 2
writer ホストグループの場合、 3
reader ホストグループの場合、および 4
バックアップライターホストグループの場合。
これらの識別子を設定するには、これらの変数と値を使用して新しい行を作成します。 mysql_group_replication_hostgroups
構成テーブル。
- 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);
これらは、この行に設定されている追加の変数と、それぞれが行うことです。
active
に設定1
ProxySQLによるこれらのホストグループの監視を有効にします。max_writers
ライターとして機能できるノードの数を定義します。 使用しました3
マルチプライマリ構成では、すべてのノードを同等に扱うことができるため、ここでは3
(ノードの総数)。writer_is_also_reader
に設定1
ProxySQLにライターをリーダーとしても扱うように指示します。max_transactions_behind
ノードがofflineとして分類されるまでの遅延トランザクションの最大数を設定します。
注:この例では、すべてのノードがデータベースに書き込むことができるマルチプライマリトポロジを使用しているため、ライターホストグループ全体ですべてのSQLクエリのバランスを取ります。 他のトポロジでは、 writer (プライマリ)ノードと reader (セカンダリ)ノード間の分割により、読み取り専用クエリを書き込みクエリとは異なるノード/ホストグループにルーティングできます。 ProxySQLはこれを自動的に行いませんが、ルールを使用してクエリルーティングを設定できます。
ProxySQLがホストグループ間でノードを分散する方法を知ったので、MySQLサーバーをプールに追加できます。 そうするために、私たちはする必要があります INSERT
各サーバーのIPアドレスと初期ホストグループを mysql_servers
ProxySQLが対話できるサーバーのリストを含むテーブル。
3つのMySQLサーバーをそれぞれ追加し、以下のコマンドのIPアドレスの例を必ず置き換えてください。
- INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.1', 3306);
- INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.2', 3306);
- INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.3', 3306);
ここでは、 2
valueは、これらすべてのノードを最初はライターに設定し、 3306
デフォルトのMySQLポートを設定します。
以前と同様に、これらの変更を runtime に移行し、 disk に保存して、変更を有効にします。
- LOAD MYSQL SERVERS TO RUNTIME;
- SAVE MYSQL SERVERS TO DISK;
ProxySQLは、指定されたとおりにノードをホストグループに分散する必要があります。 を実行して確認しましょう SELECT
に対するクエリ runtim330e_mysql_servers
ProxySQLが使用しているサーバーの現在の状態を公開するテーブル。
- 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ごとに1回です。 2
と 3
、3つのノードすべてがライターとリーダーの両方であることを示します。 すべてのノードがマークされます ONLINE
、使用する準備ができていることを意味します。
ただし、それらを使用する前に、各ノードのMySQLデータベースにアクセスするためのユーザー資格情報を構成する必要があります。
ステップ6—MySQLユーザーの作成
ProxySQLはロードバランサーとして機能します。 エンドユーザーはProxySQLに接続し、ProxySQLは選択されたMySQLノードに接続を順番に渡します。 個々のノードに接続するために、ProxySQLはアクセスされた資格情報を再利用します。
レプリケーションノードにあるデータベースへのアクセスを許可するには、ProxySQLと同じ資格情報を持つユーザーアカウントを作成し、そのユーザーに必要な権限を付与する必要があります。
手順3と同様に、次の手順はグループの単一メンバーでのみ実行する必要があります。 メンバーは1人でも選べます。
パスワードで識別されるplaygrounduserという名前の新しいユーザーを作成します playgroundpassword
.
- CREATE USER 'playgrounduser'@'%' IDENTIFIED BY 'playgroundpassword';
完全にアクセスするための特権を与えます playground
元のグループレプリケーションチュートリアルのデータベースをテストします。
- GRANT ALL PRIVILEGES on playground.* to 'playgrounduser'@'%';
次に、変更を適用してプロンプトを終了します。
- FLUSH PRIVILEGES;
- EXIT;
新しく構成された資格情報を使用してデータベースをノード上で直接試行することにより、ユーザーが適切に作成されたことを確認できます。
新しいユーザーでMySQLインターフェースを再度開きます。これにより、パスワードの入力を求められます。
- mysql -u playgrounduser -p
ログインしたら、テストクエリを実行します playground
データベース。
- SHOW TABLES FROM playground;
Output+----------------------+
| Tables_in_playground |
+----------------------+
| equipment |
+----------------------+
1 row in set (0.00 sec)
データベース内のテーブルの表示リストは、 equipment
元のレプリケーションチュートリアルで作成されたテーブルは、ユーザーがノード上で正しく作成されたことを確認します。
これでMySQLインターフェースから切断できますが、サーバーに接続している端末は開いたままにしておきます。 これを使用して、最後のステップでテストを実行します。
- EXIT;
次に、ProxySQLサーバーに対応するユーザーを作成する必要があります。
ステップ7—ProxySQLユーザーを作成する
最後の構成手順は、 playgrounduser ユーザーを使用したProxySQLへの接続を許可し、それらの接続をノードに渡すことです。
そのためには、構成変数を設定する必要があります。 mysql_users
テーブル。ユーザーの資格情報を保持します。 ProxySQLインターフェイスで、ユーザー名、パスワード、およびデフォルトのホストグループを構成データベース( 2
、ライターホストグループの場合)
- INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('playgrounduser', 'playgroundpassword', 2);
構成をruntimeに移行し、 disk に保存して、新しい構成を有効にします。
- LOAD MYSQL USERS TO RUNTIME;
- SAVE MYSQL USERS TO DISK;
これらの資格情報を使用してデータベースノードに接続できることを確認するには、別のターミナルウィンドウを開き、ProxySQLサーバーにSSHで接続します。 後で管理プロンプトが必要になるので、まだ閉じないでください。
- ssh sammy@your_proxysql_server_ip
ProxySQLはポートでリッスンします 6033
着信クライアント接続の場合は、 playgrounduser とポートを使用して(管理インターフェイスではなく)実際のデータベースに接続してみてください 6033
. パスワードの入力を求められます。 playgroundpassword
この例では。
- mysql -u playgrounduser -p -h 127.0.0.1 -P 6033 --prompt='ProxySQLClient> '
ここでは、プロンプトをに設定します ProxySQLClient>
そのため、管理インターフェイスプロンプトと区別できます。 最終構成をテストするときに両方を使用します。
プロンプトが開きます。これは、クレデンシャルがProxySQL自体によって受け入れられたことを意味します。
- ProxySQL client promptWelcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 31
- Server version: 5.5.30 (ProxySQL)
-
- 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.
-
- ProxySQLClient>
ProxySQLがノードの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からの読み取りステートメントと書き込みステートメントの両方が許可されていること、およびこれらのステートメントがグループは失敗します。
実行する SELECT
ProxySQLクライアントプロンプトのステートメントで、からデータを読み取れることを確認します。 playground
データベース。
- 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つの赤いドリルを表すテーブルにいくつかの新しいデータを挿入して書き込みを試みます。
- INSERT INTO playground.equipment (type, quant, color) VALUES ("drill", 5, "red");
次に、前のを再実行します SELECT
データが挿入されたことを確認するコマンド。
- 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プロセスを停止して障害をシミュレートします。
- systemctl stop mysql
データベースが停止したら、からデータをクエリしてみてください equipment
ProxySQLクライアントプロンプトから再度テーブルを作成します。
- SELECT * FROM playground.equipment;
出力は変更しないでください。 以前と同じように機器リストが表示されます。 これは、ProxySQLが、ノードの1つに障害が発生したことを認識し、ステートメントを実行するために別のノードに切り替えたことを意味します。
クエリを実行することで確認できます runtime_mysql_servers
手順5のように、ProxySQL管理プロンプトからのテーブル。
- 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サーバーに戻り、ノードをバックアップします。
- systemctl start mysql
しばらく待ってから、クエリを実行します runtime_mysql_servers
ProxySQL管理プロンプトからのテーブル。
- 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を参照してください。