MySQL の InnoDB ReplicaSet を構築してみる

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

MySQL 8.0.19 new features roundup! の記事でも触れさせて頂きましたが、MySQL のバージョン 8.0.19 で、InnoDB ReplicaSet 機能が追加されました。
これにより、これまで何度か当ブログでも紹介させて頂いている InnoDB Cluster のように MySQL Shell を使用して、容易に MySQL Router +非同期レプリケーション環境が構築できるようになりました。

今回は、InnoDB ReplicaSet の構築と動作を簡単に確認したいと思います。

1.サーバ構成

サーバ用途 ホスト名 IP
MySQL Router サーバ router-server 192.168.33.131
レプリケーション・マスターサーバ master-server 192.168.33.132
レプリケーション・スレーブサーバ slave-server 192.168.33.133

検証に使用した各サーバのOSは、CentOS 7.5 です。

2.構築

目次

2-1. hosts ファイルの設定

このセクションの設定内容は全てのサーバで実行します。

各サーバのhostsファイルに今回使用するサーバの情報を追加します。

2-2. MySQL Server のインストールと設定

このセクションの設定内容はレプリケーションのマスター、スレーブサーバ両方で実行します。

まずは、MySQL Community Server をyumインストールします。

firewalld が起動している場合は使用するポートを解放します。

my.cnf を新たに作成し、最低限の設定をしておきます。
server_id の設定はスレーブサーバでは server_id=20 と設定します。

MySQL サーバを起動します。

root ユーザのパスワードを設定し、MySQL Shell から操作するユーザを作成します。

2-3. MySQL Shell と MySQL Router のインストール

このセクションの設定内容は MySQL Router サーバで実行します。

MySQL Router, MySQL Shell, MySQL Client をインストールします。

2-4. InnoDB ReplicaSet の作成

このセクションの設定内容は MySQL Router サーバで実行します。

ここまでの作業で、InnoDB ReplicaSet を作成する準備が整ったので、MySQL Shell を使用して InnoDB ReplicaSet を作成します。
まずは、MySQL Shell で レプリケーションのマスターサーバに接続します。

dba.createReplicaSet() で ReplicaSet を作成します。

<ReplicaSetオブジェクト>.status() で確認します。
topology にマスターサーバの情報が表示され、"status": "ONLINE" であることを確認します。

次にスレーブサーバを <ReplicaSetオブジェクト>.addInstance() で追加します。
引数には、MySQL Shell用のユーザに作成したユーザとスレーブサーバホスト名を指定しています。
また、リカバリ方法については、当ブログでもご紹介したCLONEプラグインを選択しました。

再度、<ReplicaSetオブジェクト>.status() で確認します。
topology にスレーブサーバの情報が設定され、"status": "ONLINE" であることを確認します。

余談ではありますが、 mysql_innodb_cluster_metadata.v2_ar_members テーブルからも、どのサーバがマスターサーバ(PRIMARY)もしくはスレーブサーバ(SECONDARY)であるかは確認できそうです。

2-5. MySQL Router の bootstrap

このセクションの設定内容は MySQL Router サーバで実行します。

最後に MySQL Router を --bootstrap オプションを指定して実行し、サービス起動を行います。

これまでの手順で MySQL Router + マスター・スレーブ構成の非同期レプリケーション環境が構築できました。
非常に簡単な手順で構築が可能であることをご確認頂けたのではないでしょうか。

3.確認

このセクションの動作確認は MySQL Router サーバで実行しています。

3-1. MySQL Router の 接続の振り分け

まずは、MySQL Router の設定ファイルを確認しておきます。
アプリケーションから接続するポート番号は、[routing:XXX_rw] セクションの bind_port の設定値がマスターサーバ、[routing:XXX_ro] セクションの bind_port の設定値がスレーブサーバとなります。
今回はローカルアクセスするので、firewalld の設定は行いませんが、他ホストからアクセスする場合には、これらのポートを解放する必要があります。
また、[metadata_cache:XXX] セクションに見慣れない cluster_type=rs という設定がありますが、MySQL Rouer 8.0.19 から追加された設定で、InnoDB ReplicaSet の場合は rs InnoDB Cluster の場合は gr とするようです。

それでは、MySQL Client でマスターサーバに接続してみます。
接続先ポート番号に 6446 を指定します。

スレーブサーバにも接続してみます。
接続先ポート番号に 6447 を指定します。

想定通りに振り分けられていることが確認できました。

3-2. レプリケーション確認

基本的な動作確認ではありますが、マスターサーバの更新内容がスレーブサーバへ反映されるかも確認してみます。
マスターサーバでデータベースを作成します。

スレーブサーバへアクセスして、作成したデータベースが存在することが確認できます。

3-3. スレーブサーバへの更新

スレーブサーバに誤って更新クエリを発行してしまった場合には、エラーとなります。
スレーブサーバでは、--super-read-only が設定され、直接更新することはできません。

3-4. スレーブサーバダウン時の振り分け

スレーブサーバのMySQLサービスを事前に停止した後に、スレーブサーバへアクセスしてみます。
スレーブサーバへアクセスするポート(6447)へ接続したはずが、マスターサーバへ振り分けられました。
もし、スレーブサーバがダウンした場合には、スレーブサーバへのアクセスをマスターサーバへ振り分けるという InnoDB ReplicaSet の一番喜ばしい機能であるように思います。

3-5. マスターサーバダウン時の振り分け

今度はマスターサーバのMySQLサービスを事前に停止した後に、マスターサーバへアクセスしてみます。
残念ながら、InnoDB ReplicaSet はフェールオーバー機能はないので、マスターサーバへのアクセスはエラーとなります。
(この状態でもスレーブサーバへのアクセスは可能です。)

まとめ

MySQL Router+非同期レプリケーションの環境が非常に簡単に構築できました。
MySQL Routerを使用する事で、スレーブサーバへのアクセスが障害時にマスターサーバへ切り替わるのも需要のある機能であると思います。
また、スレーブサーバを追加したい場合、MySQL Shell で <ReplicaSetオブジェクト>.addInstance() を実行すれば、MySQL Router の設定変更も必要なく、参照アクセスが自動的に追加サーバへも割り振られるので、スレーブサーバの追加も簡単に行えます。

しかしながら、リファレンスの InnoDB ReplicaSet の制限にも記載されていますが、以下の観点からも InnoDB ReplicaSet よりは、InnoDB Cluster の使用を推奨されています。

  • マスターノードの障害時には、フェールオーバーはされない。
  • クラッシュセーフではない。

とはいえ要件次第ではありますが、高可用性は求めてなく、アクセスの分散だけを考慮したい場合等には、一考の価値がある機能ではないでしょうか。

今後も、より便利な機能がでてくる事を楽しみにしたいと思います。


 

 

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

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

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