全体通して
- 接続断は発生するし、デプロイの設定から直接ロールバックができるわけではないので、ちゃんと理解して使わないといけないポイントが結構ある
- 特に、Blue Green Deployだからといって直接ロールバックできるわけではないというのは知っておいた方がいい
- 夢のシステムではないが、切り替え先のインスタンスをレプリケーションされてる状態で予め用意しておけるのはとても便利なので使った方がいいと思う
補足
- MySQLおよびMySQL互換エンジンの話
- 試したのはAurora MySQL
参考リンク、引用元
- https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-switching.html
- https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-overview.html
ポイント
- クラスタパラメータグループ
binlog_format
をROW
にしないとB/G Deployできない(MySQL互換エンジンの話)- 変更してパラメータを適用するにはWriterインスタンスの再起動が必要
- B/G Deploy用の 新しいクラスタが立つまで結構時間がかかる
- クラスタ起動するだけなら10分程度だが、データベースバージョンあげるのを含めると20分ぐらいかかった(クラスタ起動後にアップグレードがかかる)
- クラスタ起動中、Blueに対してRead/Writeはできる
- なので、切り替え作業を行う際はサービス停止せずにあらかじめGreenのクラスタを立てておいて、切り替えだけ行うだけの状態にしておくといい
- Multi Masterの状態になるわけではない
テスト中は、グリーン環境のデータベースを読み取り専用に保つことをお勧めします。グリーン環境ではレプリケーションの競合が発生する可能性があるため、書き込み操作を有効にする場合は注意してください。
- レプリケーションは Blue -> Green のみ
- なのでGreenで書き込みの検証はしない方がいい
- B/G Deployの「切り替え」を行うと
- Greenのクラスター、インスタンスの名前がBlueになる
両方の環境の DB クラスターと DB インスタンスの名前を変更します。
RDS は、グリーン環境の DB クラスターと DB インスタンスが、ブルー環境の対応する DB クラスターと DB インスタンスに一致するように名前を変更します。例えば、ブルー環境の DB インスタンスの名前が mydb であるとします。また、グリーン環境の対応する DB インスタンスの名前が mydb-green-abc123 であると仮定します。切り替え時、グリーン環境の DB インスタンスの名前は mydb に変更されます。
RDS は、現在の名前に -oldn を追加して、ブルー環境の DB クラスターと DB インスタンスの名前を変更します。ここで、n は数字です。例えば、ブルー環境の DB インスタンスの名前が mydb であるとします。切り替え後、DB インスタンス名は mydb-old1 になります。
また、RDS はグリーン環境のエンドポイントの名前を、ブルー環境の対応するエンドポイントと一致するように変更するため、アプリケーションを変更する必要はありません。
- 切り替えを行う際に、DBへの接続ができなくなる
- なので瞬断は発生する
両方の環境で DB クラスターでの新しい書き込みオペレーションを停止します。
両方の環境で DB インスタンスへの接続を切断し、新しい接続を許可しません。
- なので瞬断は発生する
- Greenのクラスター、インスタンスの名前がBlueになる
- 切り替え後
- 旧Blueのクラスタ、インスタンスには
old
という名前がつく - 旧Blueのクラスタ、インスタンスは削除されない
- なので、切り替えが完了したら自分でクラスタ、インスタンスを削除する必要がある
- 新Blueと旧Blue間のレプリケーションとバイナリロギングは停止する
- なので、新Blueにある程度書き込みが行われてしまった後でロールバックするのは難しい
- 旧Blueに接続を切り替えてロールバックするのであれば、新Blueに書き込まれた分は諦める必要がある
- B/G Deployからロールバックはできない
- なので、ロールバックする場合はアプリケーションのDB接続情報をoldクラスタのクラスタエンドポイントに修正したり、Route53でDNS Nameを設定しているのであれば、それを変更する必要がある
- 旧Blueのクラスタ、インスタンスには
- デプロイの削除
- デプロイは都度削除する
- Deployを消しても旧Blueのクラスタ、インスタンスは削除されない
- なので自分で消さないといけない