はじめに
MySQL Router では、起動時に様々なオプションを設定することが可能であり、その内容は以下のリファレンスに記載されています。
4.3.2 Configuration File Options
その中には、どのタイミングで利用されているのか、あるいはどういったエラーが発生するのか見分けがつきにくいものがいくつかあります。今回は、これらのオプションの利用タイミングやエラー発生時の切り分けについて、実例を交えて紹介していきたいと思います。
なお、MySQL Router における設定ファイルの記載方法については、MySQL Router の設定についてで紹介しているので、こちらをご参照ください。
接続タイムアウト関連(connect_timeout, client_connect_timeout)
connect_timeout については、以下の 3 つのオプションを設定することが可能です。
DEFAULT.connect_timeout
MySQL Router は MySQL InnoDB Cluster のトポロジーを、各サーバーに保持されている mysql_innodb_cluster_metadata.instances テーブルの情報から取得しています。
[DEFAULT] セクションに connect_timeout を記載することで、この情報を取得する際の接続における、接続パケットのタイムアウト秒数を指定できます。
また、接続がエラーになった場合は、MySQL Router のエラーログに以下のようなメッセージが出力されます。
1 |
metadata_cache WARNING [7f6698211700] Failed connecting with Metadata Server mic01:3306: Can't connect to MySQL server on 'mic01:3306' (110) (2003) |
routing.connect_timeout
[routing] セクションに connect_timeout を記載することで、MySQL Router から各サーバーに接続する際の、接続パケットを待つタイムアウト秒数を指定できます。
各ルーティングの設定毎に値を変更することができるため、たとえば read-write(rw) モードでは PRIMARY の応答を待つことができるように少し値を大きく設定し、read-only(ro) モードでは速やかに別のサーバーを選択できるように値を小さく設定する、といったことが可能です。
また、接続がエラーになった場合は、MySQL Router のエラーログおよびクライアント側に以下のようなメッセージが出力されます。
1 2 3 4 5 6 |
[MySQL Router のエラーログ] metadata_cache WARNING [7fccd1f7c700] Instance 'mic01:3306' [6d17cbcd-b6e1-11ec-a4fd-000c293f2e5b] of cluster 'dt_cluster' is unreachable. Increasing metadata cache refresh frequency. routing WARNING [7fccd1f7c700] Can't connect to remote MySQL server for client connected to '0.0.0.0:3306' [クライアントエラー] ERROR 2003 (HY000): Can't connect to remote MySQL server for client connected to '0.0.0.0:3306' |
なお、read-only(ro) モードにおける SECONDARY サーバーへの接続のように、宛先サーバーが複数ある場合は、MySQL Router のエラーログに以下のようなメッセージが出力されますが、クライアント接続はエラーにならず、再度接続を試みます。
1 2 |
[MySQL Router のエラーログ] metadata_cache WARNING [7fccd1f7c700] Instance 'mic02:3306' [5fef4a20-b6e1-11ec-a003-000c29080216] of cluster 'dt_cluster' is unreachable. Increasing metadata cache refresh frequency. |
routing.client_connect_timeout
[routing] セクションに client_connect_timeout を記載することで、クライアントから MySQL Router に接続する際の、接続パケットを待つタイムアウト秒数を指定できます。
デフォルト値は 9 秒になっており、MySQL Server の connect_timeout のデフォルト値である 10 秒より少し短く設定されているため、サーバーの設定に応じて値を調整することを推奨いたします。
また、接続がエラーになった場合は、MySQL Router のエラーログおよびクライアント側に以下のようなメッセージが出力されます。
1 2 3 4 5 |
[MySQ Router のエラーログ] routing INFO [7f88005c4700] [routing:dt_cluster_rw] 192.168.174.150:38690 closed connection before finishing handshake [クライアントエラー] ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 |
同時接続数関連(max_total_connections, max_connections)
DEFAULT.max_total_connections
MySQL Router 8.0.27 から、[DEFAULT] セクションに max_total_connections を記載することで、MySQL Router へのクライアントの同時接続数を指定することができます。
また、同時接続数が上限に達した場合は、MySQL Router のエラーログおよびクライアント側に以下のようなメッセージが出力されます。
※max_total_connections に 1 を設定した場合
1 2 3 4 5 |
[MySQ Router のエラーログ] routing WARNING [7f82bdffb700] [routing:dt_cluster_rw] Total connections count=1 exceeds [DEFAULT].max_total_connections=1 [クライアントエラー] ERROR 1040 (HY000): Too many connections to MySQL Router |
routing.max_connections
[routing] セクションに max_connections を記載することで、各ルーティングの設定毎におけるクライアントの同時接続数を指定することができます。
また、同時接続数が上限に達した場合は、MySQL Router のエラーログおよびクライアント側に以下のようなメッセージが出力されます。
※max_connections に 1 を設定した場合
1 2 3 4 5 |
[MySQ Router のエラーログ] routing WARNING [7f15087f8700] [routing:dt_cluster_rw] reached max active connections for route (1 max=1) [クライアントエラー] ERROR 1040 (HY000): Too many connections to MySQL Router |
接続エラー関連(max_connect_errors)
routing.max_connect_errors
MySQL Router への接続がエラーになると、以下のように MySQ Router のエラーログ上でエラー回数が溜まっていき、max_connect_errors を超えるとそのホストからの接続をブロックするようになります。
※max_connect_errors に 3 を設定した場合
1 2 3 |
routing INFO [7f6f593d0700] [routing:dt_cluster_rw] 1 connection errors for 192.168.174.101 (max 3) routing INFO [7f6f593d0700] [routing:dt_cluster_rw] 2 connection errors for 192.168.174.101 (max 3) routing WARNING [7f6f593d0700] [routing:dt_cluster_rw] blocking client host 192.168.174.101 |
それ以後、同ホストからの接続は以下のようなクライアントエラーが返されます。
1 |
ERROR 1129 (HY000): Too many connection errors from 192.168.174.101:38264 |
ブロックを解除するためには、mysqlrouter プロセスを再起動する必要があるので注意してください。
なお、MySQL Server にも max_connect_errors がありますが、こちらは各サーバーの performance_schema.host_cache テーブルで管理されており、エラーが上限に達した場合、以下のようなクライアントエラーが返されます。
1 |
ERROR 1129 (HY000): Host '192.168.153.6' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' |
この場合、対象のサーバーで FLUSH HOSTS や mysqladmin flush-hosts を実行して、ホストキャッシュのフラッシュをおこなう必要があります。
また、MySQL Router からの接続が拒否されると、以下のように対象サーバーでメタデータの更新もできなくなってしまうので注意してください。
1 |
metadata_cache WARNING [7f6f583ce700] Updating the router last_check_in in metadata failed: Could not connect to the writable cluster member |
まとめ
ここまで、MySQL Router において見分けのつきにくいオプションをいくつか紹介してきました。
エラーが発生した場合は、そのとき利用されているオプションの場所によって出力されるエラーも微妙に異なっているため、どこでエラーが発生しているかを切り分けることが可能かと思います。
なお、2022 年 4 月 13 日時点で、MySQL Router では設定されているオプションの値などを確認する方法がないため、設定ファイルやエラーログをその都度チェックする必要があるので注意してください。