【AWSシリーズ】RDSのMySQL5.5から5.6へアップグレードする手順とポイント

<img src="http://nikuniku.me/wp-content/uploads/logo.png" alt="aws log" title="logo.png" border="0" width="250" height="130" />
今年の3月にインフラチームへ移動してから早２ヶ月。
日々刺激的？な毎日を過ごしています笑
　
さて、RDSのMySQL5.6へのアップグレードをAWSが対応しました！
今回はMySQL5.5から5.6へアップグレードする手順とメリット・デメリットを書いてみようと思います。<!--more--><section>
<h1>【背景】</h1>
業務でRDSのMySQL5.5から5.6へアップグレードするときに掛かる時間を調査する必要があった。
なので、まずはアップグレード手順の調査を行い、実際にテスト環境でアップグレードを行い、掛かる時間を算出した。
</section>

<section>
<h1>【手順】</h1>
<strong>公式ドキュメント </strong>
<a href="http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeInstance.html" target="_blank">Upgrading from MySQL 5.5 to MySQL 5.6</a>

<strong>参考にさせて頂いたサイト</strong>
<a href="http://hack.aipo.com/archives/2468/" target="_blank">AWS新人エンジニアにおくる：RDSを5.5系から5.6系にアップグレードする方法(前半)</a>
<a href="http://hack.aipo.com/archives/2566/" target="_blank">AWS新人エンジニアにおくる：RDSを5.5系から5.6系にアップグレードする方法(後編)</a>
ありがとうございます！

パターンとしては二つあるかなと思っています。
①AWSで推奨しているリードレプリカを用いたパターン
②snapshotからRDSを復元し、アップグレードするパターン
それぞれのメリット、デメリットを紹介しつつ手順を書いてみます。
</section>

<section>
<h1>【注意】</h1>
2014年4月23日より前に作成されたMySQLの5.5 DBインスタンスは自動的にコンソールを使用してアップグレードすることはできません。
</section>

<section>
<h1>パターン①</h1>
1. MasterのRDS（MySQL5.5）からRead Replica（MySQL5.5）を作成。
2. Read ReplicaのMySQLを5.6へアップグレード。
3. MySQL5.6になったRead ReplicaをMasterへ昇格。
</section>


手順1
MasterからRead Replicaを作成します。
<img src="http://nikuniku.me/wp-content/uploads/2014-05-18-11.32-のイメージ.png" alt="2014 05 18 11 32 のイメージ" title="2014-05-18 11.32 のイメージ.png" border="0" width="307" height="145" />
MasterのRDSインスタンスを選択し、Instance Action->Create Read Replica。
この時にPIOPSの設定をするかしないかでRead Replicaが作成される時間が変わってきます。
※約80GBのStorageのRead Replica（PIOPS無し）を作成するのに、約3時間ほど。。。
PIOPSなしに設定しても、一度MasterのPIOPSを設定した後に、PIOPSを外す処理が走っている感じ？
本番稼働中でもRead Replicaは作成可能ですが、やはりMasterに負荷が掛かってしまうので、注意。


手順2
Read ReplicaのMySQLを5.6へアップグレード
Read Replicaを選択し、Modify->DB Engine VersionからMySQL5.6を選択。
Apply Immediatelyにチェックを入れて、即反映。
<img src="http://nikuniku.me/wp-content/uploads/2014-05-21-23.30-のイメージ.png" alt="2014 05 21 23 30 のイメージ" title="2014-05-21 23.30 のイメージ.png" border="0" width="300" height="136" />
アップグレード中も同期されているので、Read Replica作成時と同様に本番稼働中でも負荷に注意しつつ作業は可能。
アップグレード完了後は、<strong>SHOW SLAVE STATUS</strong>コマンドでSeconds_Behind_Masterの値を確認し、「 0 」であれば最新の状態。


手順3
Read ReplicaをMasterへ昇格。
Instance Action->Promote Read Replica
<img src="http://nikuniku.me/wp-content/uploads/2014-05-21-23.35-のイメージ.png" alt="2014 05 21 23 35 のイメージ" title="2014-05-21 23.35 のイメージ.png" border="0" width="353" height="142" />
この時はMasterが読み取り専用で、すべてのトランザクションが中断されることに注意。
昇格作業からはメンテナンスモードなどにした方が安全です。
必要であれば、MultiAZ化やRead Replica作成を行いましょう。
ここまでがパターン①の手順です。


<section>
<h1>パターン②</h1>
1. MasterのRDS（MySQL5.5）からSnapshotを取得。
2. SnapshotからRDS（MySQL5.5）を復元。
3. 復元したRDSのバージョンを5.6へアップグレード
</section>


手順1
MasterからSnapshotを取得
<img src="http://nikuniku.me/wp-content/uploads/2014-05-18-11.32-のイメージ.png" alt="2014 05 18 11 32 のイメージ" title="2014-05-18 11.32 のイメージ.png" border="0" width="307" height="145" />
MasterのRDSからSnapshotを取得。
その状態のSnapshotから復元を行うので、本番サービスをメンテナンスモードなどに切り替えデータの書き込みが無い状態にしておく。
でないとSnapshotの内容とMasterのRDSとで差分が出来てしまうので要注意。


手順2
SnapshotからRDSを復元
Snapshots->ManualSnapshots->Restore Snapshots
<img src="http://nikuniku.me/wp-content/uploads/2014-06-01-1.44-のイメージ.png" alt="2014 06 01 1 44 のイメージ" title="2014-06-01 1.44 のイメージ.png" border="0" width="286" height="121" />



手順3
復元したRDSのMySQLバージョンを5.6へアップグレード
Read Replicaを選択し、Modify->DB Engine VersionからMySQL5.6を選択。
<img src="http://nikuniku.me/wp-content/uploads/2014-06-01-11.12-のイメージ.png" alt="2014 06 01 11 12 のイメージ" title="2014-06-01 11.12 のイメージ.png" border="0" width="317" height="141" />

パターン①のアップグレードと同様の注意が必要。
ここまでがパターン②の手順です。


<section>
<h1>メリット・デメリット</h1>
<strong>パターン①</strong>
メリット
・AWS推奨パターン。リードレプリカを作り同期させながら作業するので、差分が発生しない。

デメリット
・リードレプリカを作る時に時間が掛かる。

<strong>パターン②</strong>
メリット
・パターン①に較べて全体の作業時間が短い。検証した時は約1時間ほどで完了（約80Gの容量）

デメリット
・AWS非推奨パターン。Snapshotを取得するときにデータ書き込みがあると差分が発生してしまう。
</section>

<section>
<h1>まとめ</h1>
AWS推奨パターンの①がおすすめです。ただPIOPSを設定するかしないかで時間がかなり変わってきます。
パターン①を用いて、業務でアップグレードを行いましたが約80GBの容量で約3時間ほどの時間が掛かりました。（↑で紹介した手順にさらにMultiAZ化とリードレプリカ作成を含む）
リードレプリカ作成時に自動的にSnapshotが作成されるのですが、これに大きく時間が掛かったように思えます。
実際にアップグレードする場合は、前日など前もってリードレプリカを用意しておき、当日の作業手順を省くとよいかと思います。

それにしても初めての本番環境アップグレードは緊張しました。。。
</section>