MySQL Shell の Routing Guideline を使ってみる

目次

はじめに

先月にリリースされた Innovation Release となる MySQL 9.2.0 では、MySQL Shell に Routing Guideline なる機能が実装されました。

リリースノートの情報とリファレンスは以下になります。

今回は、新しく実装された Routing Guideline を使用してみた内容を紹介したいと思います。

Routing Guideline とは

従来の MySQL Router では設定ファイルをベースに Port ごとに振り分け先を設定するのが一般的な使用方法でした。
設定ファイル以外にも、振り分け先に関する一部の調整は、MySQL Shell の API を通じて行うことが可能となっています。
また、MySQL Shell の API は JavaScript版とPython版が用意されており、使用者のお好みに応じて選択することができます。

Routing Guideline は、振り分け先の設定を上記の API を通して、従来の設定ファイルでの設定方法よりも、より細かくルーティングの設定ができるようになります。

例えば、 こちら に定義されているような変数を使用してマッチングパターンが定義できるので、以下のようなルーティングも可能となります。

  • 接続ユーザに応じて、振り分け先を変える。
  • 接続元のIPアドレスに応じて、振り分け先を変える。
  • アクセスするスキーマごとに、振り分け先を変える。
  • 複数の振り分け先に対するアクセスの割合を調整をする。

検証

構成

検証するにあたり、以下のような環境を用意しました。

ホスト名 備考
router MySQL Router
node01 Group Replication (Primary)
node02 Group Replication (Secondary)
node03 Group Replication (Secondary)
replica01 Read Replica
replica02 Read Replica

構成は InnoDB Cluster Read Replicas となります。

InnoDB Cluster Read Replicas については、弊社の以下のブログでも紹介しておりますので、合わせて読んで頂ければと思います。

初期状態確認

node01 が Group Replication の Primary ノードで、このノードに対して replica01, replica02 の Read Replica が存在します。
また、node02, node03 は Group Replication の Secondary ノードとなっていることが読み取れます。

{Cluster}.listRouters() では、 "currentRoutingGuideline": null と出力されており、これは Routing Guideline が適用されていないことを示します。

また、MySQL Router の Port は以下のように設定されています。

  • Read / Writer 用ポート
    • rwPort:6446
    • rwXPort:6448(X Protocol用)
  • Read 用ポート
    • roPort:6447
    • roXPort:6449(X Protocol用)
  • Read / Writer Splitting 用ポート
    • rwSplitPort:6450

※ Read / Writer Splitting 用ポート については以下のブログでも紹介しております。

試しに Read 用ポート(6447) にアクセスすると、Group Replication の Secondary ノードのみにアクセスしていることが分かります。

Routing Guideline の作成

それでは、Routing Guideline を作成してみます。
リファレンスに記載されている例が Python の API を使用している為、同様に MySQL Shell で Primary ノードにアクセスし、Python モードで以下のように実行します。

{Cluster}.create_routing_guideline() を使用して Routing Guideline を作成することで、デフォルトの Routing Guideline が作成されます。

詳細については、以下のリファレンスもご参照下さい。

作成された Destinations は {Routing Guideline}.destinations() で確認することができます。

初期状態では、以下3つの Destinations が作成されました。

  • Primary:Group Replication の Primary ノード
  • Secondary:Group Replication の Secondary ノード
  • ReadReplica:Read Replica ノード

これをどのようにルーティングしているかを確認するには、 {Routing Guideline}.show() を使用するのがよいでしょう。

視覚的に分かりやすく、以下の情報が読み取れます。

  • rw の設定
    • Read / Writer 用ポート(6446) へのアクセスは、Group Replication の Primary ノードに振り分ける。
  • ro の設定
    • Read 用ポート(6447) へのアクセスは、Group Replication の Secondary ノードに振り分けられ、Secondary ノード全てにアクセスできない場合は、Primary ノードに振り分ける。
      Destinations: に定義されているものは、上から順に評価されるようです。)

より詳細に確認したい場合は、 {Routing Guideline}.as_json() が役に立ちそうです。

{Routing Guideline}.show() では、設定されている routing_strategy までは確認できませんでしたが、設定されている全ての情報が確認できそうです。

ルート の設定

デフォルトで作成されたルート情報を削除してから、ルート情報を設定していきます。
ルートの削除は {Routing Guideline}.remove_route() で行います。

ルート情報は、最低限1つの設定が存在する必要があるようで、ro の設定削除はエラーとなりました。
ro の設定は一旦、残しておいて、ルート情報を新たに作成します。
ルートの作成には、 {Routing Guideline}.add_route() を使用します。

第1引数には作成するルートの名前、第2引数にはマッチングパターン、第3引数には routing_strategy と Destinations を指定しています。

要約すると、 Read / Writer 用ポート(6446)Read / Writer Splitting 用ポート (6450) へのアクセスを Group Replication の Primary ノード に割り振るルートを rw_and_rwsplit という名前で作成しています。

なお、現時点では、routing_strategy には、 first-available もしくは round-robin しか設定することができません。

デフォルトで作成された ro の設定を削除して確認すると、作成した rw_and_rwsplit のみが存在することが分かります。

さらに、 Read 用ポート(6447) へのアクセスは、以下のようなものを作成したいと思います。

① Group Replication の Secondary ノード と Read Replica にアクセスする。
② 但し、 batch_user というユーザがアクセスした場合は、Read Replica にアクセスする。

①については、以下のように設定しました。
Group Replication の Secondary ノード と Read Replica にアクセスできない場合は、Group Replication の Primary ノード にアクセスするという条件も付与しています。

②については、以下のように設定しています。
Read Replica にアクセスできない場合は、Group Replication の Secondary ノードへ、それもアクセスできない場合は、Group Replication の Primary ノード にアクセスするという条件になっています。

order 指定を追加していますが、これは評価の優先順位を指定するもので、値が小さい程、優先して評価されます。

ここまでの設定で以下のようになります。

Routing Guideline の適用

作成した Routing Guideline を適用して、アクセスしてみたいと思います。
まずは、Routing Guideline を適用するには {Cluster}.set_routing_option() を使用します。

検証する際は、 mysqlrouter.conf[metadata_cache:bootstrap] セクションにある ttl の設定を短めに設定しておくと、設定変更内容が早く反映される為、お勧めです。

適用後は Read / Writer 用ポート(6446)Read / Writer Splitting 用ポート (6450) へのアクセスが Group Replication の Primary ノード に割り振られています。

Read 用ポート(6447) へのアクセスを batch_user 以外のユーザでアクセスすると想定通り Group Replication の Secondary ノード と Read Replica にラウンドロビンでアクセスされています。

Group Replication の Secondary ノード と Read Replica のMySQLサービスを全て停止すると、 Group Replication の Primary ノード にアクセスします。

また、 Read 用ポート(6447) へのアクセスを batch_user ユーザでアクセスした場合は、Read Replica にラウンドロビンでアクセスされています。

Read Replica のMySQLサービスを全て停止すると、 Group Replication の Secondary ノード にアクセスします。

Group Replication の Secondary ノード の MySQLサービスも全て停止すると、 Group Replication の Primary ノード にアクセスします。

より細かく設定してみる

先程のケースではデフォルトの Destinations 以外を使用していなかった為、以下の Read Replica へのアクセスをラウンドロビンではなく特定のサーバを優先して使用するようにしてみます。

② 但し、 batch_user というユーザがアクセスした場合は、Read Replica にアクセスする。

まずは、現状の ro_batch_access のルートを削除して、Destinations に Read Replica のサーバを追加します。

Destinations の追加には {Routing Guideline}.add_destination() を使用します。

ルートを追加する際には、 Replica02, Replica01 の順に指定します。

このように指定することで、Read Replica の中でも特定のサーバを優先してアクセスするように設定することも可能となります。

まとめ

Routing Guideline は MySQL Router のルーティングがより柔軟に設定できるようになり、今後、使用するユーザが増えてきそうな予感がします。
現時点では、Innovation Release でしか使用できませんが、今後リリースされる Long-Term Support (LTS) のバージョンでも使用できるようになるのを期待して待ちたいと思います。

スマートスタイルTECHブログについて

スマートスタイルTECHブログでは、日頃MySQLのサポート業務に従事している有資格者で構成された技術サポートチームがMySQLに関する技術情報を発信しています。データベースのお困りごとはお気軽にご相談下さい。

よかったらシェアしてね!
  • URLをコピーしました!
目次