ablog

不器用で落着きのない技術者のメモ

Route53 を使って同一 AZ のリードレプリカ障害時に別 AZ にフェイルオーバーする

要件

  • 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 でヘルスチェックを作成
Route53 でプライベートホストゾーン作成
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)