オンラインで MySQL InnoDB Cluster の構成を変更する

MySQL 8.0
この記事は最終更新から5年以上経過しています。内容が古くなっている可能性があります。

MySQL8.0.14 で、MySQL Shell を使用してオンラインで MySQL InnoDB Cluster の構成を変更できるようになりました。
(本記事の公開時点の最新バージョンは8.0.15です。)

今回は、構成変更する為の3機能について確認したいと思います。

目次

概要

1. シングル・プライマリモードで稼働しているプライマリ・メンバーを切り替え

<cluster>.setPrimaryInstance()

2. シングル・プライマリモードからマルチ・プライマリモードに切り替え

<cluster>.switchToMultiPrimaryMode()

3. マルチ・プライマリモードからシングル・プライマリモードに切り替え

<cluster>.switchToSinglePrimaryMode()

※<cluster>は dba.getCluster()で取得したオブジェクト

同様の機能で Group Replication の UDF で操作する機能が MySQL8.0.13 で追加されており、以下の弊社のブログでご紹介しております。
MySQL 8.0.13 で追加された、 Group Replication の UDF を使ってみる その1
MySQL 8.0.13 で追加された、 Group Replication の UDF を使ってみる その2

構成

VirtualBox+Vagrantを使用し、MySQL Router と MySQL Shell は同一サーバにインストールしています。

マシン IP ホスト名
MySQL Router
MySQL Shell
192.168.33.10 mysqlrouter8014
MySQL Server 1 192.168.33.11 node8014-1
MySQL Server 2 192.168.33.12 node8014-2
MySQL Server 3 192.168.33.13 node8014-3

構成の状態確認

以下のように node8014-1 ~ node8014-3 のシングル・プライマリモードの3台構成で、 node8014-1 がプライマリの状態です。

1. シングル・プライマリモードで稼働しているプライマリ・メンバーを切り替え

[1.実行]

MySQL Shell で cluster.setPrimaryInstance() を実行します。
引数には、同様機能となる Group Replication の UDF、group_replication_set_as_primary() では MEMBER_ID(server_uuid)を指定する必要がありましたが、サーバ名もしくはIPアドレス+ポート番号の指定となります。
今回はプライマリにするメンバーとして node8014-2 を指定しています。

(MySQL Shell で接続しているメンバーがプライマリでなくなった場合に、上記のような dba.getCluster() で cluster オブジェクトの再作成を促す、WARNINGメッセージが表示されるようです。)

[2.実行後]

指定したメンバー(node8014-2)がプライマリに変更されていることが確認できます。

[3.実行時点で接続されているセッションは?]

実行前から MySQL Router の R/W(プライマリへルーティング), R/O(セカンダリへルーティング)の Port を通して各メンバーに接続していると、セカンダリからプライマリになるメンバー(node8014-2)ではエラーも発生せず処理を継続できました。
しかし、プライマリからセカンダリになるメンバー(node8014-1)は接続が切られてしまいました。

・node8014-1への接続

2. シングル・プライマリモードからマルチ・プライマリモードに切り替え

[1.実行]

MySQL Shell で cluster.switchToMultiPrimaryMode() を実行し、マルチ・プライマリモードに変更してみます。

[2.実行後]

全てのメンバーがプライマリに変更されていることが確認できます。

InnoDB Cluster のメタ情報内にあるトポロジも変更されています。
※topology_type が pm はシングルプライマリ・モード、mm なら、マルチプライマリ・モードとなります。

[3.実行時点で接続されているセッションは?]

実行前から MySQL Router の R/W, R/O の Port を通して各メンバーに接続していると、全てのメンバーでエラーは発生せず処理を継続できました。

3. マルチ・プライマリモードからシングル・プライマリモードに切り替え

[1.実行]

MySQL Shell で cluster.switchToSinglePrimaryMode() を実行し、シングル・プライマリモードに戻します。
引数には、cluster.setPrimaryInstance() 同様に、プライマリとするサーバ名もしくはIPアドレス+ポート番号を指定します。

cluster.setPrimaryInstance()同様に、dba.getCluster() で cluster オブジェクトの再作成を促すメッセージと、セカンダリになるメンバーへの接続が切られる旨のWARNINGメッセージが表示されます。)

[2.実行後]

シングル・プライマリモードに変更され、指定したメンバー(node8014-2)がプライマリとなっています。

[3.実行時点で接続されているセッションは?]

実行前から MySQL Router の R/W の Port を通して各メンバーに接続していると、プライマリからセカンダリになるメンバー(node8014-1, node8014-3)のみ接続が切られてしまいました。

・node8014-1への接続

・node8014-3への接続

まとめ

今回確認した機能は MySQL Shell 8.0.14 からの新機能となりますが、MySQL Server は、同機能のUDFが追加された 8.0.13 以上でないと使用できないようです。
試しに MySQL Shell のみを 8.0.14 とし、グループレプリケーションの MySQL Server を 8.0.12 とした場合、以下のようなエラーが発生しました。

(MySQL Server を8.0.13にした場合は、正常に使用できました。)

確認結果を踏まえて、実行時に各メンバーで処理が行われていた場合には、以下のように処理が継続できない場合もあるので、注意が必要になります。

実行 切り替え実行時の挙動
1.プライマリ・メンバーを切り替え
cluster.setPrimaryInstance()
プライマリからセカンダリに変更されるメンバーのみエラーが発生。セカンダリからプライマリに変更されるメンバーは処理を継続することが可能。
2.マルチ・プライマリモードに切り替え
cluster.switchToMultiPrimaryMode()
全てのメンバーが処理を継続することが可能。
3.シングル・プライマリモードに切り替え
cluster.switchToSinglePrimaryMode()
プライマリからセカンダリに変更されるメンバーのみエラーが発生。

とはいえ、InnoDB Cluster を気軽に構成を変更して検証できるのはうれしいですね。
マイナーバージョンアップにおいてもメンテナンスが入り、これからも機能追加や改善が進んでいくことを期待したいと思います。


MySQL

 

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

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

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