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

前書き

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

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

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • sudo非rootユーザーとファイアウォールを含むthis initial Ubuntu 16.04 server setup tutorialでセットアップされた1つのUbuntu16.04サーバー。 このサーバーがProxySQLインスタンスになります。

  • マルチプライマリレプリケーショングループを形成するように構成された3つのMySQLサーバー。 これは、How To Configure MySQL Group Replication on Ubuntu 16.04 tutorialに従って設定できます。 Choosing Single Primary or Multi-Primaryセクションで、multi-primaryレプリケーショングループの指示に従います。

[[step-1 -—- installing-proxysql]] ==ステップ1—ProxySQLのインストール

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

最新のパッケージはrelease listにあります。 命名規則はproxysql_version-distribution.debです。ここで、versionはバージョン1.4.4の場合は1.4.4のような文字列であり、distributionは64ビットの場合はubuntu16_amd64のような文字列です。 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

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

sudo dpkg -i proxysql_*

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

rm proxysql_*

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

パッケージリポジトリを更新して、バンドル済みの最新バージョンを取得していることを確認してから、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

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

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

[[step-2 -—- setting-the-proxysql-administrator-password]] ==ステップ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>)を変更するオプションのフラグです。 ここでは、ProxySQL管理インターフェイスに接続していることを明確にするために、これをProxySQLAdmin>に変更しています。 これは、後で複製されたデータベースサーバー上の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>

global_variablesデータベースのadmin-admin_credentials構成変数を更新(UPDATE)して、管理者アカウントのパスワードを変更します。 以下のコマンドの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です。 変更を有効にするには、memory設定をruntimeレルムにコピーしてから、それらをdiskに保存して永続化する必要があります。

LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;

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

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

[[step-3 -—- configuring-monitoring-in-mysql]] ==ステップ3—MySQLでの監視の構成

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

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

MySQLグループレプリケーションはすでに実行されているため、次の手順はa single member of the groupでのみ実行する必要があります。

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

[。注意]##

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

このファイルのコンテキストと内容の詳細については、native ProxySQL support for MySQL group replicationに関する作成者のブログ投稿を参照してください。

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を更新する必要があります。

[[step-4 -—- configuring-monitoring-in-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にノード自体について伝えることです。

[[step-5 -—- adding-mysql-nodes-to-the-proxysql-server-pool]] ==ステップ5—MySQLノードをProxySQLサーバープールに追加する

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

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

  • writers。これは、データを変更するクエリを受け入れることができるMySQLノードです。 ProxySQLは、すべてのプライマリノードをこのグループで定義された最大量まで維持するようにします。

  • backup writers。これは、データを変更するクエリを受け入れることができるMySQLノードでもあります。 ただし、これらのノードはライターとして指定されていません。維持されているライターの定義された量を超えるプライマリノードはこのグループに保持され、ライターの1つが失敗するとライターに昇格します。

  • readersは、データを変更するクエリを受け入れることができないMySQLノードであり、読み取り専用ノードとして使用する必要があります。 ProxySQLはここにスレーブノードのみを配置します。

  • offline。これは、接続の欠如やトラフィックの遅延などの問題が原因で誤動作しているノード用です。

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

すべてをまとめると、各状態に使用する識別子をProxySQLに伝える必要があります。 ここでは、offlineホストグループに1writerホストグループに2readerホストグループに3を使用します。 backup writerホストグループの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);

これらは、この行に設定された追加の変数であり、それぞれの機能は次のとおりです。

  • active1に設定すると、ProxySQLによるこれらのホストグループの監視が有効になります。

  • max_writersは、ライターとして機能できるノードの数を定義します。 ここでは3を使用しました。これは、マルチプライマリ構成ではすべてのノードを同等に扱うことができるため、ここでは3(ノードの総数)を使用しました。

  • writer_is_also_reader1に設定すると、ProxySQLはライターもリーダーとして扱うように指示されます。

  • max_transactions_behindは、ノードがofflineとして分類されるまでの遅延トランザクションの最大数を設定します。

[。注意]##

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

ProxySQLがホストグループにノードを分散する方法を知ったので、MySQLサーバーをプールに追加できます。 これを行うには、各サーバーのIPアドレスと初期ホストグループをmysql_serversテーブルにINSERTする必要があります。このテーブルには、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値は、これらすべてのノードを最初にライターに設定し、3306はデフォルトのMySQLポートを設定します。

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

LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

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

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回リストされています。ホストグループID23にそれぞれ1回ずつ表示され、3つのノードすべてがライターとリーダーの両方であることを示しています。 すべてのノードはONLINEとマークされており、使用する準備ができていることを意味します。

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

[[step-6 -—- creating-the-mysql-users]] ==ステップ6—MySQLユーザーの作成

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

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

手順3と同様に、次の手順はa single member of the groupでのみ実行する必要があります。 任意のメンバーを選択できます。

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

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

the original group replication tutorialから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サーバーに対応するユーザーを作成する必要があります。

[[step-7 -—- creating-the-proxysql-user]] ==ステップ7—ProxySQLユーザーの作成

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

これを行うには、ユーザー資格情報を保持するmysql_usersテーブルに構成変数を設定する必要があります。 ProxySQLインターフェイスで、ユーザー名、パスワード、およびデフォルトのホストグループを構成データベースに追加します(writerホストグループの場合は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がデータベース上で読み取りおよび書き込みステートメントを実行でき、一部のノードがダウンした場合でもクエリを処理できることを確認します。

[[step-8 -—- verifying-the-proxysql-configuration]] ==ステップ8—ProxySQL構成の検証

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

ProxySQLクライアントプロンプトでSELECTステートメントを実行して、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

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

SELECT * FROM playground.equipment;

出力は変更されません。以前と同様に機器リストが表示されます。 これは、ProxySQLがノードの1つに障害が発生したことに気付き、別のノードに切り替えてステートメントを実行したことを意味します。

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

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で設定したタイムアウトしきい値を超えた場合はofflineとしてマークします。

この監視をテストしましょう。 MySQLサーバーに切り替えて、ノードを再起動します。

systemctl start mysql

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

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の機能の詳細と、official ProxySQL blogおよびProxySQL wikiでそれらを使用してさまざまなデータベース管理の問題を解決する方法を読むことができます。

Related