RDS B/G Deployments機能でAuroraクラスターバージョンアップした後の切り戻しを考える
メディア統括本部 サービスリライアビリティグループ(SRG)の鬼海 雄太(@fat47)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事は、RDS Blue/Green DeplymentsをつかってAuroraのバージョンアップをおこなった際に、なんとか切り戻しを行えないかを検証しています。
なにかの役に立てば幸いです。
最初にまとめ【2024年9月追記】Blue/Green Deploymentsによるバージョンアップ切り戻しパターンを3つ検証検証用環境の作成Green(MySQL8.0)からBlue(MySQL5.7)への逆方向のレプリケーションする方法概要検証手順Green(MySQL8.0)から論理バックアップを取得して、Blue(MySQL5.7)に適用する方法概要検証手順
最初にまとめ
- Blue/Green Deploymentsでバージョンアップしてもなんとか切り戻せる方法はある
- 今回の検証では3パターン中2つはうまく切り戻せた
どの切り戻し方法にせよDBの書き込みを停止するサービスメンテナンスは必須- 【2024年9月追記】一部方法が更新されてメンテナンス必須ではなくなりました
- バージョン切り戻しより新バージョンで対応できるよう修正したほうが現実的
【2024年9月追記】
Timee様のテックブログにて記事を取り上げていただきました。
こちらの記事により、2024年8月にRDS Blue/Green DeploymentにAWSのブログが投稿され、その中でB/G切り替え時点のbinlogポジションが出力されているようになったことが判明しました。
Blue/Green Deploymentsによるバージョンアップ
クラスタのコピーを作成してそのクラスタとレプリケーションを貼り、ボタン一つでクラスタ切替ができるようになるマネージドな機能です。
詳しくはBlue/Green Deploymentsリリース当時の下記のブログをご参照ください。
この機能をつかって、稼働中のクラスタ(Aurora MySQL2系)からGreenクラスタ(Aurora MySQL3系)を作成し、切替をおこなうことでバージョンアップが可能になります。
しかし、この機能をつかってバージョンアップを行うと、あとになってクリティカルな事象が発覚した等の理由で元のAurora Version2戻したいとなっても対応することが困難です。
それでもなんとか切り戻せないかを検証しました。
切り戻しパターンを3つ検証
- Green(MySQL8.0)からBlue(MySQL5.7)への逆方向のレプリケーションする方法
- Green(MySQL8.0)から論理バックアップを取得して、Blue(MySQL5.7)に適用する方法
- Green(MySQL8.0)の静止点から差分をbinlogから生成して、Blue(MySQL5.7)に適用する方法
検証用環境の作成
- Auora Version2系のクラスタ作成
- 検証用のテーブル作成とレコード追加
- データーベース&テーブル作成
- レコード追加
- Blue/Green Deployments機能でGreen(MySQL8.0)クラスタの作成
- Green(MySQL8.0)とBlue(MySQL5.7)のクラスタ両方でbinlog保持期間を7日まで伸ばしておく
Green(MySQL8.0)からBlue(MySQL5.7)への逆方向のレプリケーションする方法
概要
B/Gの切替を実行しても、旧Blue(MySQL5.7)のクラスタは勝手に削除されません。
旧Blue(MySQL5.7)を切り戻し環境として活用し、
切替後のGreen(MySQL8.0)をソースとして手動でレプリケーションを貼る方法です。
検証手順
サービスメンテナンスモードなどにしてDB書き込みを停止- 【追記】機能アップデートによりDB書き込み停止は不要になりました。
- B/G切替実行
- 【追記】切り替え実施時ポジション確認。
- B/Gを選択する
- 最近のイベントの欄を時間順でソートしてbinlogポジションを確認する


- Green(MySQL8.0)でレプリユーザーの作成
- 旧Blue(MySQL5.7)でGreen(MySQL8.0)に向けてレプリケーションの開始
- 旧blue(MySQL5.7)でレプリケーションの状態確認
- Green(MySQL8.0)で動作確認用のレコード追加
- 旧blue(MySQL5.7)でレプリケーションの状態確認
- 旧blue(MySQL5.7)でレコードをみてレプリケーションが正常に行われていることを確認
Green(MySQL8.0)から論理バックアップを取得して、Blue(MySQL5.7)に適用する方法
概要
Green(MySQL8.0)で論理バックアップを取得して、それを旧Blue(MySQL5.7)クラスタに入れ直す方法です。一番時間はかかるが確実な方法ではあります。
検証手順
- B/G切替実行
- B/Gロールの削除
- 切替後、Green(MySQL8.0)にレコード追加テスト
- サービスメンテナンスモードなどにしてDB書き込みを停止
- Green(MySQL8.0)でmysqldumpを実行
注意点1
Auroraでは管理ユーザでもSUPER権限をもっていないため、-all-databasesオプションを使用するとうまくダンプ・リストアができません。
バックアップとりたい個別のデータベースを指定するようにしましょう。
注意点2
オプションを利用する場合、下記のブロク記事にある点に注意しましょう。
- 旧Blue(MySQL5.7)でリストア
- 旧Blue(MySQL5.7)のレコード内容確認。Green(MySQL8.0)に追加した内容が含まれていることが確認できました。
- Green(MySQL8.0)のインスタンスやクラスタを削除
- 旧Blue(MySQL5.7)のインスタンスやクラスタをリネームして、の表記を消す
- サービスメンテナンスモード解除でサービス再開
