スマートスタイル TECH BLOG

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

稼働中の環境をMySQL InnoDB ReplicaSetとして構成する

MySQLといえばレプリケーションと言っても過言では無いかと思います。

しかしながら、MySQL Shell 8.0.19 よりMySQL Shell APIとして追加された MySQL InnoDB ReplicaSet 構成をご利用でないユーザはまだまだいらっしゃるのではと思います。

これまでも弊社ブログで何回か取り上げておりますが、MySQL InnoDB ReplicaSet とは、従来のレプリケーション構成に、Load BalancerとなるMySQL Routerを加え、それらをMySQL Shellで構成・管理する複合的なソリューションです。

MySQL Shellを使用してレプリケーションクラスタ全体を管理でき、ヘルスチェック、新規レプリカの追加、プライマリの切り替え等を簡単に行えます。
また、MySQL Routerにより負荷分散や、インスタンス単位でサービスアウトさせるといった操作もやりやすくなります。

今回は、非ReplicaSetであるレプリケーション環境を、 ReplicaSetとして構成する方法について検証したいと思います。

検証環境

ホスト名 MySQLバージョン 用途
mysql-test-1 8.0.34 DB#1(primary)
mysql-test-2 8.0.34 DB#2(replica1)
mysql-test-3 8.0.34 DB#3(replica2)
mysql-test-4 8.0.34 proxy(mysqlrouter) + admin(mysql-shell)

※ すべてOSは Oracle Linux 9です

MySQL InnoDB ReplicaSet化の準備

以下に記載されている制限に該当しない必要があります。

https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-innodb-replicaset.html

詳細はドキュメントをご確認いただければと思いますが、製品上の主な制限事項は以下になります。

  • プライマリは1ノードのみ(双方向レプリケーションや循環レプリケーション、マルチソースレプリケーションは不可)
  • すべてのノードはMySQL 8.0以降であること
  • GTIDが有効であり、GTIDを使用してレプリケーションを行っていること
  • binlog_format = ROW (RBR) であること
  • レプリケーションフィルタが設定されていないこと
  • InnoDB ReplicaSet構成時に設定されたレプリケーションチャネル以外にレプリケーションチャネル設定が無いこと
  • SQL ステートメントを直接使用してプライマリを変更する事等はサポートされず、レプリケーショントポロジの変更はMySQL Shellで行うこと

前述のドキュメントでは具体的に説明していないのですが、8.0.34 のデフォルトでよいものを除き、MySQL ReplicaSetの設定上で必要なものについて例示します。
すべて [mysqld] セクションに記載します。

変数名 説明
server_id レプリケーションに参加するインスタンス毎に異なる値を設定します
report_host MySQL Shell, MySQL Router, 各MySQL Serverから到達可能なIP/FQDNを設定します
log_bin --initialize-insecure を指定してdatadirを初期化した場合のみ指定します
gtid_mode ONにする必要があります
enforce_gtid_consistency gtid_mode = ONに伴い、ONにする必要があります
binlog_transaction_dependency_tracking WRITESETに設定する必要があります

ほとんどのパラメータは、動的(set global)変更可能ですが、既存の環境のReplicaSet化を行う際にreport_hostが設定されていないとレプリカを検出することができず作成に失敗します。
厄介なことにreport_hostの設定には、mysqldの再起動が必要になりますので、これが一番のハードルになりそうです。

レプリケーション環境の MySQL InnoDB ReplicaSet 化

MySQL Shellからクラスタを構成・管理するためには、各ノードにクラスタ管理用のユーザが必要になります。

本来、dba.configureReplicaSetInstance() を実行すると管理用のユーザが作成されますが、すでにレプリケーショントポロジに含まれるインスタンスでは以下のエラーで実行できません。

そのため手動で作成する必要があります。

dba.configureReplicaSetInstance() で作成するユーザは以下の権限を持ちます(ユーザ名を’rsadmin’@’%’とした場合)
※ ブログの表示の都合上、下記結果の`(バッククォート) を'(シングルコーテーション)に変えています

ReplicaSet化については、以下のドキュメントに従い、プライマリノードに接続した後、 dba.createReplicaSet()'adoptFromAR':1 を指定して実行します。

https://dev.mysql.com/doc/mysql-shell/8.0/en/replicaset-adopting.html

全てのノードが正常に動作しています。

スイッチオーバも正常に動作しています。

MySQL Router用ユーザをを追加します。

MySQL Routerを設定し起動します。

正常にロードバランスできました。

まとめ

MySQL InnoDB ReplicaSet とすることで、リモートからの死活監視もやりやすくなり、ノード追加やメンテナンスもしやすくなるかと思います。

ぜひ MySQL InnoDB ReplicaSet をお試しください!

Return Top