Amazon Auroraで使えるB/G Deploy機能を試す

技術本部 サービスリライアビリティグループ(SRG)の鬼海(@fat47)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事は、SRG 内にある DBWG(DBワーキンググループ)が全社内向けに提供しているデータベースに関する資料を公開します。
なにかの役に立てば幸いです。
 

B/G Deployment機能とは


先日のRe:Invent 2022 で発表されたRDS,Auroraで利用できる新機能です。
ドキュメントはこちら
 
こちらのクラスメソッドさんの記事がまとまってわかりやすいと思います。
 
機能の流れを要約すると
  • コンソール上から簡単に本番環境(Blue)からミラー環境(Green)が作れる
  • Blue-Green間は論理レプリケーションが貼られるので更新も同期される
  • コンソール上からBlueからGreenへの切り替えが可能
  • アプリケーションが見るエンドポイントは変更不要でエンドポイント内の向き先が変わる
  • 切り替え中はB/G両者書き込みブロック
  • 指定しか時間内にB/G切り替えが完了しなかったら自動で切り戻される
  • 切り替え後のBlue環境はスタンドアロン環境として残る
 
全体構成のイメージ図
[AWS公式ドキュメントから画像引用]
[AWS公式ドキュメントから画像引用]

ご注意


以下の点で動作が不安定になる可能性があります。
AWSにケースで報告済みで調査をしてもらっています。
💡
確認している不具合 - Source側のインスタンスサイズがt3.smallだとB/G環境の構築途中で止まる - Source側のクラスタのサブネットが2AZだとB/G環境の構築途中で止まる

B/G環境の構築手順


今回はMySQLのバージョンアップグレードをB/Gをつかって行うテストをしてみます。

Blueとなるクラスタでバイナリログを有効化する

DBクラスタパラメータグループで「binlog_format」をMIXED or ROWにします。
適用にはインスタンスの再起動が必要となるので注意しましょう。

Green環境の作成

Blueのクラスタを選択して を押しますします。
 
Greenとなる環境の識別子とエンジンバージョンを指定して作成します。
 
作成が完了するとこのようにBlue/Greenの表記が付きます。

Blue環境に毎秒書き込みしつつB/G切り替えてみる

Blue側に適当なテーブルを作成して、毎秒INSERTしながらB/Gを切り替えてみます。
 
切り替えは先程作成したB/G環境を選択してを押します
 
B/Gそれぞれの情報が表示される確認画面がでます。
ここでタイムアウト時間の設定ができます。ここの時間以内に切り替えが完了しなかった場合、
切り替えは行われずにもとに戻されます。
問題なければを押します。
 
切り替え中はこのような通知が表示されています。
 
切り替え中に毎秒書き込みをしていたスクリプトのログを見ると、
まずBlue環境がRead Onlyとなり書き込みがブロックされてから、
コネクションに失敗したのち約2分後に書き込みが再開されていることがわかります。

感想


従来は手動で別クラスタ立ててバイナリログレプリケーション組んでいた部分が、コンソール上からボタン一つでできるようになったのはとてもいいと感じました。
公式発表では1分以内に切り替え完了と言ってますが、普通に2分ぐらい疎通とれなかったのでt3.mediumインスタンスでやったせいなのかとかは要追加検証です。
 
個人的にはB/Gの切り戻し機能が、B/G切り替え成功後でもできるようになってくれれば最高だと思いました。バージョンアップグレード後、しばらくしてから問題が発覚して切り戻しが必要になることがあるからです。
しかしその場合はAurora v3 → Aurora v2のバージョンを遡った非推奨なレプリケーションが必要なので、実現は厳しいかなとも思っています。
 
このB/G機能は一般提供開始となっていますが、コンソール上では(ベータ)とついているので、これからの進化に期待しています。
今回テストはしていませんが、Green環境へのALTERももっと制約がゆるくなってくれれば実用できるシーンも増えていくのかなと思いました。

終わりに


SRG では一緒に働く仲間を募集しています! ご興味ありましたらぜひこちらからご連絡ください!
 
このエントリーをはてなブックマークに追加