Vagrant上にMySQL InnoDB Clusterを構築

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

MySQLのHAのためにMySQL Group Replication + MySQL InnoDB Cluster環境を構築

2017年4月12日に早くもGAになったMySQL InnoDB Cluster を早速使ってみました。
Vagrant で立てた MySQL Group Replication 3台 (mysql-node1~mysql-node3)
+ Webサーバー1台(mysql-web) の環境でテストしています。

構築概要

  • Vagrant上でMySQL Group Replication 3台(MySQL 5.7)を構築し、
    WebサーバーにMySQL Router、MySQL Shell、MySQL-clientをインストールします。
  • 今回のGroup Replication環境ではシングルプライマリモードを適用します。
  • Group Replication 構築完了後、 WebサーバーでMySQL Shell を操作して、InnoDB Clusterを登録します。
  • 最終目標としてMySQL Router + MySQL Shell 環境から
    MySQL InnoDB Clusterへの接続テスト及びフェイルオーバーテストを行います。
目次

構築手順

0.環境

- CentOS 6.9
- MySQL5.7
- MySQL Router 2.1
- MySQL Shell 1.0
- MySQL Client 5.7

1.MySQLサーバー構築

以下のVagrantfileを利用して下記の4サーバーをVagrant上で構築します。

  • mysql-node1:192.168.40.10
  • mysql-node2:192.168.40.20
  • mysql-node3:192.168.40.30
  • mysql-web:192.168.40.100

- Vagrantfile

※vagrant-vbguest / vagrant-timezone プラグインを入れています。

  • 全サーバー間で名前解決できるように以下の内容を全サーバーの/etc/hostsファイルに追記します。

  • 全ノードにおいてselinux、iptables、ip6tablesを一時的にオフにします。

2.MySQL5.7、MySQL Router 2.1、MySQL Shell 1.0 の最新版をインストール

※インストール先は以下の通りです。
- mysql-node1~3:MySQL5.7
- mysql-web:MySQL Router 2.1、MySQL Shell 1.0、MySQL-client

  • MySQL5.7 のインストール

(1)以下のコマンドを実行しrpmパッケージをインストールします。

※2017/5/30時点の最新版はmysql57-community-release-el6-11.noarch.rpmです。

(2)インストールしたrpmパッケージを
  node1~node3のそれぞれの/tmp/配下に配置します。

(3)以下のコマンドを実行しMySQLをインストールします。

※同じ処理をnode2とnode3にも実行します。

  • MySQL Router のインストール
    以下のコマンドを実行しMySQL Router をインストールします。

  • MySQL Shell のインストール
    以下のコマンドを実行しMySQL Shell をインストールします。

  • MySQL client のインストール
    以下のコマンドを実行しMySQL client をインストールします。

3.MySQL Group Replicationの構築

(1)下記の"node1_my.cnf"、"node2_my.cnf"、"node3_my.cnf"を、
  それぞれのnodeの/tmp/配下に配置します。

  • node1_my.cnf

  • node2_my.cnf

  • node3_my.cnf

(2)以下のコマンドで各nodeに配置したmy.cnfを/etc/my.cnfに上書きします。

(3)以下のコマンドで各nodeにてmysqldを起動します。

(4)簡単なパスワードを使用するため、
  各nodeのvalidate_pluginをアンインストールします。

  • 以下のコマンドで作成される一時的なrootユーザーのパスワードでMySQLにログインします。

  • varidate_pluginをアンインストールした後、パスワードを再設定します。

(5)Group Replication Pluginの有効化、ユーザーの作成を行います。

※上記の(4),(5)と同じ処理をnode2とnode3にも実行します。

(6)初期ノード(node1)を起動します。

(7)第2ノード(node2)を起動します。

(8)第3ノード(node3)を起動し、Group Replication情報を参照します。

(9)初期ノードにてwebサーバーからアクセスするためのappユーザーを作成します。

※MySQL Shellがクラスタを作成するために、"WITH GRANT OPTION"権限が必要です。

4.webサーバーで、MySQL Shell を操作して、クラスタを登録

※以下の操作はrootユーザーを使用しません。

  • node1に接続し、InnoDB Clusterを新規作成します。

  • Clusterが問題なく登録されたことを確認します。

※node1がPrimary nodeとして設定されています。

5.MySQL Routerで InnoDB Clusterに接続する

  • 以下のコマンドでInnoDB Cluster に接続します。

  • 上記の操作でnode1~3のMySQL上に
    “mysql_innodb_cluster_metadata” というスキーマが作成されます。

  • 新規作成されたスキーマが確認できたら、MySQL Routerを起動します。

※/var/lib/mysqlrouterの権限が"root:root"になっているため、chownを実行します。

6. MySQL Router + MySQL Shell環境からInnoDB Clusterへの接続テスト及びフェイルオーバーテスト

  • Read/Writeの接続(6446ポート指定)を行います。

⇒全てnode1に対してのみ実行されます。

  • Read Onlyの接続(6447ポート指定)を行います。

⇒node2 と node3 に対して、ラウンドロビンで実行されます。

  • フェイルオーバーテストを行います。

(1)以下のコマンドをnode1に対しクエリを実行します。

(2)上記のコマンド実行中に、node1をダウンさせます。

⇒6446ポートの参照先がnode1からnode3に切り替わります。(フェイルオーバー)

※その後は、node1を起動させても6446ポートの参照先はnode3のままとなります。

⇒Primary node がnode3に切り替わります。

構築してみた感想

今回はMySQL Group Replication、MySQL Router、MySQL Shellを組み合わせて
高可用性を実現できるMySQL InnoDB Clusterを構築してみましたが、
管理リポジトリ自体がGroup Replication内にありますのでデフォルトでデータベースが冗長化されています。
また、MySQL Group Replication、MySQL Router、MySQL Shellが密に連携していて一つのHAパッケージのようになっていると感じました。
構築手順自体は難しいものではなく、Primary nodeがダウンした場合に自動的にSecondary nodeにフェイルオーバーが可能であり、かつダウンしたサーバーが復旧した場合も自動的にクラスタに再加入できますので有用性の高いものだと考えています。

参考URL
Chapter 20 InnoDB Cluster


 

 

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

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

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