来月から AWS RDS で MySQL 5.7.x を使っていると拡張サポートで金が取られる、という話なのでバージョンアップしぐさなどをしている。
直接メジャーバージョンアップしてもいいかなあ、と思っていたのだけど、せっかくなので Blue/Green Deploy でロールバックできるようにしておくかー、という気持ちに。
まあ面倒だし、Blue 側を 8 にして、 Green は 5 にしておいてなんかあったら切り替えて縮退、みたいな感じでいいだろという目論見で作業。
Blue のメジャーバージョンアップをするな
RDS Blue/Green Deployments only support default option groups for major version upgrades. Don't specify a major version upgrade when you create the blue/green deployment. After you create the blue/green deployment, you can upgrade the database in the green environment.
RDS Blue/Green デプロイメントは、メジャー バージョン アップグレードのデフォルト オプション グループのみをサポートします。 ブルー/グリーン展開を作成するときは、メジャー バージョンのアップグレードを指定しないでください。 ブルー/グリーン展開を作成した後、グリーン環境でデータベースをアップグレードできます。
ファッキュー!
しかたないので同じ MySQL 5.7 系で Green 側を作成して、完了後に Blue を手動でアップグレードしましょう。
申し訳ありません。DB インスタンス example-muccha-saikyou の変更のリクエストが失敗しました。 One or more of the DB Instance's read replicas need to be upgraded: example-muccha-saikyou-green-1145141919
上流となる Blue のバージョンを新しくして、縮退系として Green を扱う、とできないのか。 まじかよ。
Blue/Gree 構成時の更新系クエリの扱い
上記に Blue/Green の仕組み解説されてるんだけど、
ブルー/グリーンデプロイを作成すると、DB エンジンのバージョンをアップグレードして、グリーン環境の DB インスタンスに別の DB パラメータグループを指定できます。RDS は、ブルー環境のプライマリ DB インスタンスからグリーン環境のプライマリ DB インスタンスへの論理レプリケーションも設定します。
と論理レプリケーションの記述があるので、そのあたりは乗り越えられるんだと思っていた。
結局どうした
- Blue となる MySQL 5.7 インスタンスと同じバージョンで Green を作成
- MySQL 8 対応のパラメタグループとオプショングループを作成
- 末尾に -v8 とかつけてお茶を濁すといいぞ
- Green を MySQL 8 にメジャーバージョンアップ
- ついでに中間証明書も
rds-ca-rsa2048-g1
へ更新した、次は 2061 年だ…… - 2.で作成したものにそれぞれ変更する必要がある
- ついでに中間証明書も
- アプリケーションが参照するホスト名を Blue から Green のものへ変更
- 動作確認
- 更新系クエリの確認が必要であれば別途インスタンスを建てざるを得ない
- (大丈夫そうなので) アプリケーションが参照するホスト名を Green から Blue へ戻す
- ロール:ブルー/グリーンデプロイを選択して、 切り替え から Blue と Green を切り替える
- 切替に必要な時間はお好みで変更する
- これで無停止で切り替えが出来た
- とはいえアプリケーション側でコネクションプールとかコネクションキャッシュしていると多分こわれるので、アプリケーション再起動が必要な場合もある
- 今回は使ってなかったっぽいのでセーフだった、そうか使ってないのか……
- 不要になった Green (元 Blue: MySQL 5.7 インスタンス) を消す
- 論理レプリケーションで更新系クエリは降ってくるので、数日は残しておいてもよさそう
という感じです。
計画メンテに入れて停止時間が必要かなあ面倒だなあ、と思っていたので、無停止でなんとか出来てよかった。
とはいえあと数台あるんだよなあ。