スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL Router におけるオプションの利用タイミングについて

はじめに

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 のエラーログに以下のようなメッセージが出力されます。

routing.connect_timeout

[routing] セクションに connect_timeout を記載することで、MySQL Router から各サーバーに接続する際の、接続パケットを待つタイムアウト秒数を指定できます。
各ルーティングの設定毎に値を変更することができるため、たとえば read-write(rw) モードでは PRIMARY の応答を待つことができるように少し値を大きく設定し、read-only(ro) モードでは速やかに別のサーバーを選択できるように値を小さく設定する、といったことが可能です。

また、接続がエラーになった場合は、MySQL Router のエラーログおよびクライアント側に以下のようなメッセージが出力されます。

なお、read-only(ro) モードにおける SECONDARY サーバーへの接続のように、宛先サーバーが複数ある場合は、MySQL Router のエラーログに以下のようなメッセージが出力されますが、クライアント接続はエラーにならず、再度接続を試みます。

routing.client_connect_timeout

[routing] セクションに client_connect_timeout を記載することで、クライアントから MySQL Router に接続する際の、接続パケットを待つタイムアウト秒数を指定できます。
デフォルト値は 9 秒になっており、MySQL Server の connect_timeout のデフォルト値である 10 秒より少し短く設定されているため、サーバーの設定に応じて値を調整することを推奨いたします。

また、接続がエラーになった場合は、MySQL Router のエラーログおよびクライアント側に以下のようなメッセージが出力されます。

同時接続数関連(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 を設定した場合

routing.max_connections

[routing] セクションに max_connections を記載することで、各ルーティングの設定毎におけるクライアントの同時接続数を指定することができます。

また、同時接続数が上限に達した場合は、MySQL Router のエラーログおよびクライアント側に以下のようなメッセージが出力されます。
※max_connections に 1 を設定した場合

接続エラー関連(max_connect_errors)

routing.max_connect_errors

MySQL Router への接続がエラーになると、以下のように MySQ Router のエラーログ上でエラー回数が溜まっていき、max_connect_errors を超えるとそのホストからの接続をブロックするようになります。
※max_connect_errors に 3 を設定した場合

それ以後、同ホストからの接続は以下のようなクライアントエラーが返されます。

ブロックを解除するためには、mysqlrouter プロセスを再起動する必要があるので注意してください。

なお、MySQL Server にも max_connect_errors がありますが、こちらは各サーバーの performance_schema.host_cache テーブルで管理されており、エラーが上限に達した場合、以下のようなクライアントエラーが返されます。

この場合、対象のサーバーで FLUSH HOSTS や mysqladmin flush-hosts を実行して、ホストキャッシュのフラッシュをおこなう必要があります。
また、MySQL Router からの接続が拒否されると、以下のように対象サーバーでメタデータの更新もできなくなってしまうので注意してください。

まとめ

ここまで、MySQL Router において見分けのつきにくいオプションをいくつか紹介してきました。
エラーが発生した場合は、そのとき利用されているオプションの場所によって出力されるエラーも微妙に異なっているため、どこでエラーが発生しているかを切り分けることが可能かと思います。
なお、2022 年 4 月 13 日時点で、MySQL Router では設定されているオプションの値などを確認する方法がないため、設定ファイルやエラーログをその都度チェックする必要があるので注意してください。

Return Top