はじめに
MySQL Router は MySQL InnoDB Cluster や InnoDB ReplicaSet で使用可能であり、ロードバランスや障害発生時のフェイルオーバーに対応したルーティングを透過的に実現してくれるミドルウェア製品です。
弊社ブログにおいても何度か紹介 していますが、今回は MySQL Router でデフォルトから変更できる設定や機能について、いくつかピックアップして紹介させていただこうと思います。
構成
以下の環境を用意して確認をおこないました。OS は CentOS 7.7 を使用しており、MySQL のバージョンはすべて 8.0.21 を使用しています。
マシン | IP | ホスト名 |
---|---|---|
MySQL Server (Node1) | 192.168.174.7 | node1 |
MySQL Server (Node2) | 192.168.174.9 | node2 |
MySQL Server (Node3) | 192.168.174.10 | node3 |
MySQL Router & MySQL Shell | 192.168.174.3 | mysql_router |
なお、環境の構築時には弊社ブログの以下の記事を参考にしていただければと思います。
MySQL 8.0.13 で MySQL InnoDB Cluster を構築する
–bootstrap による初期設定が完了すると、MySQL Router の設定ファイル( /etc/mysqlrouter/mysqlrouter.conf )には以下のような内容が自動で書き込まれているかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File automatically generated during MySQL Router bootstrap [DEFAULT] name=system user=mysqlrouter keyring_path=/var/lib/mysqlrouter/keyring master_key_path=/etc/mysqlrouter/mysqlrouter.key connect_timeout=15 read_timeout=30 dynamic_state=/var/lib/mysqlrouter/state.json [logger] level = INFO [metadata_cache:myCluster] cluster_type=gr router_id=1 user=mysql_router1_w0dw2zzuwu4c metadata_cluster=myCluster ttl=0.5 auth_cache_ttl=-1 auth_cache_refresh_interval=2 use_gr_notifications=0 [routing:myCluster_rw] bind_address=0.0.0.0 bind_port=6446 destinations=metadata-cache://myCluster/?role=PRIMARY routing_strategy=first-available protocol=classic [routing:myCluster_ro] bind_address=0.0.0.0 bind_port=6447 destinations=metadata-cache://myCluster/?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=classic [routing:myCluster_x_rw] bind_address=0.0.0.0 bind_port=64460 destinations=metadata-cache://myCluster/?role=PRIMARY routing_strategy=first-available protocol=x [routing:myCluster_x_ro] bind_address=0.0.0.0 bind_port=64470 destinations=metadata-cache://myCluster/?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=x |
読み方は基本的に MySQL Server の設定ファイル( my.cnf )と似ています。
DEFAULT 以外のセクション名では :
を追記することで、その後ろにセクションキー名を任意に指定して設定を分けることが可能です。ただし MySQL Router 8.0.21 現在、 metadata_cache セクションは 2 つ以上記載しているとエラーで起動できないので、1 つの mysqlrouter プロセスでは 1 つの クラスター(MySQL InnoDB Cluster あるいは InnoDB ReplicaSet)しか管理できない点にご注意ください。
設定内容
振り分け先(destinations)
routing セクションの destinations オプションを指定することで、MySQL Server への振り分け先を指定することができます。
1 |
destinations = 192.168.174.7:3306,192.168.174.9:3306,192.168.174.10:3306 |
上記のように設定することで静的にルーティングをおこなうこともできますが、MySQL 8.0.14 以降は MySQL InnoDB Cluster のメタデータキャッシュを利用することで、–bootstrap 後は以下のように動的なルーティングがおこなわれる設定になっています。
1 2 3 4 5 6 7 8 9 |
[routing:myCluster_rw] (...) destinations=metadata-cache://myCluster/?role=PRIMARY (...) [routing:myCluster_ro] (...) destinations=metadata-cache://myCluster/?role=SECONDARY (...) |
role には以下の 3 つのうちどれかを指定することが可能です。
- PRIMARY : 現在の PRIMARY ノードに対してのみルーティングする。
- SECONDARY : 現在の SECONDARY ノードに対してのみルーティングする。
- PRIMARY_AND_SECONDARY : 現在の PRIMARY および SECONDARY ノードに対してルーティングする。
また、MySQL 8.0.12 からは、URL オプションとして以下のパラメーターを yes にすることで追加の設定ができるようになりました。
- disconnect_on_promoted_to_primary : SECONDARY ノードが PRIMARY ノードに昇格した際、SECONDARY ノードに存在している既存のクライアント接続をクローズするかどうかを制御します。
- disconnect_on_metadata_unavailable : ノードが切り離されたときに、そのノードに存在している既存のクライアント接続をクローズするかどうかを制御します。
設定する場合は以下のように指定をおこないます。なお、disconnect_on_promoted_to_primary は role が SECONDARY の場合にしか追記することができないので注意してください。
1 |
destinations=metadata-cache://myCluster/?role=SECONDARY&disconnect_on_promoted_to_primary=yes |
ルーティング方法(routing_strategy)
routing セクションの routing_strategy オプションを指定することで、ルーティングのルールを設定することが可能です。
- round-robin
接続が来るたびに振り分け先からラウンドロビン形式でルーティングします。 - round-robin-with-fallback
接続が来るたびに振り分け先からラウンドロビン形式でルーティングします。全ての振り分け先が使用できない場合、PRIMARY ノードにルーティングします。この設定は、destinations の role が SECONDARY の場合にしか選択できません。 - first-available :
振り分け先の中で最初に利用可能なサーバーにルーティングします。障害が発生した場合は、次に使用可能なサーバーにルーティングします。 - next-available :
振り分け先の中で最初に利用可能なサーバーにルーティングします。障害が発生した場合は次に使用可能なサーバーにルーティングしますが、障害が発生したノードを到達不能としてマークして破棄し、MySQL Router が再起動するまでルーティングに含まなくなります。なお、この設定はメタデータキャッシュを利用している場合は使用できず、destinations に静的なアドレスを指定している場合にのみ設定可能です。
なお、–bootstrap 後のデフォルト値は以下の通りですが、オプションを指定しなかった場合のデフォルト値は roubd-robin が選択されます。
1 2 3 4 5 6 7 8 9 10 11 |
[routing:myCluster_rw] (...) destinations=metadata-cache://myCluster/?role=PRIMARY routing_strategy=first-available (...) [routing:myCluster_ro] (...) destinations=metadata-cache://myCluster/?role=SECONDARY routing_strategy=round-robin-with-fallback (...) |
ログの出力(logger セクション)
MySQL Router ではデフォルトで /var/log/mysqlrouter/mysqlrouter.log にログが出力されていますが、オプションでさらに細かく指定することが可能です。
まず、level オプションでログの出力レベルを以下の中から選択することができます。このとき、指定したレベルはより上位のレベルの設定を含んでいます。たとえば、デフォルト値は INFO になっていますが、ログには INFO、WARNING、ERROR、SYSTEM、FATAL レベルのメッセージが表示されます。
- DEBUG
- NOTE
- INFO
- WARNING
- ERROR
- SYSTEM
- FATAL
また、sinks オプションを指定することで、ログの出力先を複数選択することができます。デフォルト値は filelog ですが、DEFAULT セクションの logging_folder オプションを空で指定することでデフォルト値が consolelog になります。
- filelog : filename オプションを指定することで出力先のファイル名を指定可能。ディレクトリを変更する場合は DEFAULT セクションの logging_folder を指定。
- consolelog : destinations オプションを指定することで出力先を /dev/null、/dev/stderr、/dev/stdout から選択可能。
- syslog (Windows の場合は eventlog)
これらの設定を組み合わせることで、複数の場所に MySQL Router のログを出力させることが可能です。たとえば、syslog に ERROR レベルのログを出力させながら指定したファイルに DEBUG レベルのログを出力したい場合、MySQL Router の設定ファイルに以下のように記述することで実現できます。
1 2 3 4 5 6 7 8 9 |
[logger] sinks=filelog,syslog [filelog] level=DEBUG filename = mysql_router_file.log [syslog] level=ERROR |
まとめ
MySQL Router はデフォルト値で使用しても十分に活用できますが、今回挙げたような機能を変更することで、より細かい要件にも対応させることができそうです。
MySQL Router は 8.0.21 においても新バージョンがリリースされると定期的に新機能が追加されており、今回紹介しきれなかった機能もまだまだあるので、興味を持った方は是非この機会に MySQL Router の検証を進めてみてはいかがでしょうか?