AWS AuroraをR3(旧世代)からR5(新世代)に安全に変更する方法
皆さん。こんにちは。MUGENUP エンジニアの崔です。
今回は、AWS AuroraをR3(旧世代)からR5(新世代)に安全に変更する方法をまとめてみました。
AWS Aurora
Amazon Aurora は、MySQL および PostgreSQL と互換性のあるクラウド向けのリレーショナルデータベースであり、従来のエンタープライズデータベースのパフォーマンスと可用性に加え、オープンソースデータベースのシンプルさとコスト効率性も兼ね備えています。
MUGENUPはMySQLと互換性もあるためAuroraを使っています。
そこで中断させないでインスタンスの変更が可能かどうかを調査し、実際にやってみました!
対象:fujossy
月間PV1200万を超える小説投稿サイト https://fujossy.jp
目的
DBインスタンスの変更をサーバーを停止しないままでやりたい
方法
AWS AuroraにはFailover(フェイルオーバー)機能があるので、活用してみましょう。
Failover(フェイルオーバー)?
Failoverは異常が生じたときの予備システムに自動的に切り替えられる機能
手順
>>> 簡単! <<<
実際やってみましょう
まず、インスタンスをコピー
- xxxxxxx-aurora-clusterにもともと紐づいていたxxxxxxx-aurolaからクローンに作成でコピーします
- 設定などは既存の設定と同じなのでそのままクローンしましょう
- クローンに成功したらClusterのページのCloudWatchでもインスタンスの状態を確認できます
Failoverをセット
- 既存に書き込み状態になっている旧インスタンスを選択したフェイルオーバーボタンを推しましょう
- 無事Failover設定に成功するとコピーした新インスタンスが書き込み、旧インスタンスが読み込み状態になります
- そうなると旧インスタンスは変更可能になります
旧インスタンスの変更
- 旧インスタンスを変更する時には常時にConnectionを維持するアプリケーション(Sidekiqとか)は一回Offにする必要があります
- アマゾンによるとインスタンスをライブに変更する時には既存の連結がある時ゆっくりと変更するように現状に発生する問題を最小限にすることをやるのでConnectionをいっぱい持っているアプリケーションは止めておく必要があります
元に戻す
Failoverで書き込みと読み込みが逆だった新インスタンス(アップデートの為の臨時インスタンス)にまた同じくFailoverを設定しましょう そうなると元インスタンスがまた書き込みに、臨時インスタンスは読み込みになるので臨時インスタンスは消去出来るようになります
インスタンス変更の確認
インスタンスの変更は勿論作業しながらすると思いますが、CloudWatchのデータを参考にする方法をここに記録します
まず、上のグラフはDBに接続しているConnectionの数です。途中にメインのインスタンス(元インスタンス、xxxxxxx-aurola)のConnectionをSidekiqをOffにした影響で減っているのを確認できます。そのあと変更後元に戻したらまたConnectionが復旧されます
注意点
- 無中断にインスタンスをアップしたとしても途中で何秒くらい接続が切れるのがユーザー側にも影響を受けるので先にメンテナンスのお知らせが必要になります
- アプリケーションにもDBに接続が切れるように処理されるのでアプリケーションがDBの状態によってパニックが起きて強制的に死ぬシステムなら使えないです
- この方法の良さは中断時間を時間単位(アプリケーションサーバーも中断)から秒単位(DBホストだけ中断、切り替え)にするにあって完全に0秒でシステムのDBがアップデート出来るのではないです
- 今回の件とは別ですけど、インスタンスの名前が間違っていて変更したらホストネーム(サーバーのドメインネーム)が変わるので注意する必要があります
募集
弊社は、一緒に働くエンジニアを募集中です。 ビジョン「創ることで生きる人を増やす」の達成、ご一緒しませんか?