要件
- Aurora のリードレプリカを AZ1 と AZ2 に作成、正常時は AZ1 の AP サーバ on EC2 から AZ1 のリードレプリカに接続(同一AZのほうがレイテンシが低いため)、AZ1 障害時のみ AZ2 のリードレプリカに接続したい。
実装方式
- Route53 の DNS フェイルオーバーで、正常時は AZ1 のエンドポイントに接続、障害時のみ AZ2 に接続するよう設定。
- インスタンスがクエリを実行できない状況になっていても TCP ポートに接続できると正常と判断される。
- AZ1 のインスタンス識別子の変更、または Route53 のホストゾーンの「フェイルオーバーレコードタイプ」のセカンダリとプライマリを入替えるなどで手動フェイルオーバーすることができる。
設定
Aurora クラスター作成
- Aurora クラスターを作成する。
- リードレプリカを ap-northeast-1a と ap-northeast-1a に作成する。
- セキュリティグループのインバウンドで Route53 ヘルスチェッカーの IP アドレス(以下)から TCP 3306 ポートを許可する。
$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json|jq -r '.prefixes[]|select(.service=="ROUTE53_HEALTHCHECKS" and ( .region=="ap-northeast-1" or .region=="ap-southeast-1" or .region=="ap-southeast-2"))|@text "\(.region)\t\(.ip_prefix)"'|sort
ap-northeast-1 54.248.220.0/26
ap-northeast-1 54.250.253.192/26
ap-southeast-1 54.251.31.128/26
ap-southeast-1 54.255.254.192/26
ap-southeast-2 54.252.254.192/26
ap-southeast-2 54.252.79.128/26
Route53 でヘルスチェックを作成
- 名前: aurora-fo-rr-1a
- モニタリングの対象: エンドポイント
- エンドポイントの指定: ドメイン名
- プロトコル: TCP
- ドメイン名: aurora-mysql57-instance-1-ap-northeast-1a.******.ap-northeast-1.rds.amazonaws.com
- ポート: 3306
- リクエスト間隔: 高速(10秒)
- 失敗しきい値: 3
- ヘルスチェッカーのリージョン: カスタマイズ
- 名前: aurora-fo-rr-1c
- モニタリングの対象: エンドポイント
- エンドポイントの指定: ドメイン名
- プロトコル: TCP
- ドメイン名: aurora-mysql57-instance-1-ap-northeast-1c.******.ap-northeast-1.rds.amazonaws.com
- ポート: 3306
- リクエスト間隔: 高速(10秒)
- 失敗しきい値: 3
- ヘルスチェッカーのリージョン: カスタマイズ
Route53 でレコードセット作成
- 名前: ap-northeast-1a.aurora-rr-priv.a2z.work. ★同じ名前にする
- エイリアス: いいえ
- TTL: 10
- 値: aurora-mysql57-instance-1-ap-northeast-1a.******.ap-northeast-1.rds.amazonaws.com
- ルーティングポリシー: フェイルオーバー
- フェイルオーバーレコードタイプ: プライマリ
- セット ID: primary
- ヘルスチェックとの関連付け: はい
- 関連付けるヘルスチェック: aurora-fo-rr-1a
- 名前: ap-northeast-1a.aurora-rr-priv.a2z.work. ★同じ名前にする
- エイリアス: いいえ
- TTL: 10
- 値: aurora-mysql57-instance-1-ap-northeast-1c.******.ap-northeast-1.rds.amazonaws.com
- ルーティングポリシー: フェイルオーバー
- フェイルオーバーレコードタイプ: セカンダリ
- セット ID: secondary
- ヘルスチェックとの関連付け: はい
- 関連付けるヘルスチェック: aurora-fo-rr-1c
テスト
- Aurora と同じ VPC に EC2 インスタンスを作成してプライマリに接続されることを確認する。
$ mysql -h ap-northeast-1a.aurora-rr-priv.a2z.work -u awsuser -p
MySQL [(none)]> show variables like 'hostname';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| hostname | ip-10-7-1-22 |
+---------------+--------------+
1 row in set (0.01 sec)
- AZ1 のリードレプリカを削除する。
- AZ2 のリードレプリカに接続されることを確認する。
$ mysql -h ap-northeast-1a.aurora-rr-priv.a2z.work -u awsuser -p
MySQL [(none)]> show variables like 'hostname';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| hostname | ip-10-7-2-27 |
+---------------+--------------+
1 row in set (0.00 sec)