Amazon Aurora でフェイルオーバーを確認してみる

参考

インスタンスの種類

フェイルオーバーするとリーダーのインスタンスがライターになりライターのインスタンスがリーダーになるようです。
このリーダーインスタンスはライターインスタンスと同期しているので、フェイルオーバーしても基本的には同じデータが入っているようです。

  • ライターインスタンス
    • 読み書きが出来るインスタンスでメインとなるインスタンス。
  • リーダーインスタンス
    • 読み込み機能のみのインスタンスでメインのインスタンスに障害が起きた時にメインに昇格するインスタンス。

サブネットグループを作成する

AZ をまたがる場合は、サブネットをまとめた「サブネットグループ」の作成が必要なので作成します。

  1. 画像の通りの環境を作成しておきます。
  2. RDS のページに遷移する。
  3. 左サイドバーの「サブネットグループ」をクリックする。
  4. 「DB サブネットグループを作成」をクリックする。
  5. 「 DB サブネットグループを作成」で次の通りの設定をする。
    • サブネットグループの詳細
      • 名前: hoge-subnet-group
      • 説明: hogehoge
      • VPC: [作成した VPC]
    • サブネットを追加
      • アベイラビリティーゾーン: [プライベートサブネットが属するアベイラビリティゾーン]
      • サブネット: [作成したプライベートサブネット]
  6. 「作成」をクリックする。

データベースのインスタンスを作成する

色々省略してありますが Amazon Aurora を作成します。

  1. 左サイドバーの「データベース」をクリックする。
  2. 「データベースの作成」をクリックする。
  3. 「データベースの作成」で次の通りの設定をする。
    • 「Amazon Aurora」を選択する。
    • 「Amazon Aurora MySQL 互換エディション」を選択する。
    • 「別の AZ で Aurora レプリカ/リーダーノードを作成する (可用性のスケーリングに推奨)」を選択する。
    • 「Virtual Private Cloud (VPC)」で作成した VPC を選択する。
    • 「サブネットグループ」で選択したサブネットグループを選択する。
  4. 「データベースの作成」をクリックする。

エンドポイント

作成してみると次の通りのエンドポイントがありますが「ライターインスタンス」「リーダーインスタンス」それぞれのエンドポイントのようです。

  • database-1.cluster-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
  • database-1.cluster-ro-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com

フェイルオーバーを試してみる

データを入れて確認してみます。

mysql -h database-1-cluster-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p

データを入れてい見ます。

# データベース作成
CREATE DATABASE hoge;
SHOW DATABASES;
# テーブル作成
USE hoge;
CREATE TABLE hoge_table (id int, name varchar(10));
SHOW TABLES;
# データ作成
SHOW COLUMNS FROM hoge_table;
INSERT INTO hoge_table (id, name) VALUES (1, 'hoge');
SELECT * FROM hoge_table;
  1. リーダースタンスにチェックを入れる。
  2. 「アクション」をクリックする。
  3. 「フェイルオーバー」を選択する。
  4. 確認画面で「フェイルオーバー」をクリックする。
  5. リーダーインスタンスとライダーインスタンスが入れ替わったのを確認する。(アベイラビリティゾーンに対してのライターとリーダーが入れ替わっている。)
  6. 再度 mysql にログインしてデータがある事を確認する。

ちなみにリーダーの mysql にログインして INSERT を実行してみたところちゃんと怒られました。

INSERT INTO hoge_table (id, name) VALUES (2, 'hoge');
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement