【新機能】再起動直後から応答を高速に!RDS for MySqlに「Cache Warming」機能が追加されました。
こんにちは、せーのです。RDS(MySql)でかなり実用的な機能が追加されたのでご紹介いたします。その名も「Cache Warming」。さて、どんな機能なのでしょう。
Cache Warmingって何?
DBは応答速度を高める為に同じクエリはキャッシュをしておき、それをメモリなどに保持しておきます。では再起動などをした場合はどうなるでしょう。キャッシュがメモリ上からなくなってしまうので、初期状態と同じになりパフォーマンスが落ちてしまいます。 そこで、RDSがシャットダウンする時にキャッシュをバッファプールに保存しておき、再び起動してきた時にバッファプールからキャッシュをロードすることでパフォーマンスを保とう、という機能、それが「Cache Warming」です。
Cache Warmingのやり方
では実際やってみながらCache Warmingの使い方を覚えていきましょう。といってもとても簡単なのですが(笑)。
Parameter Groupで行う
まず通常のRDSを立ち上げます。今回のCache Warmingが使えるのはMySql5.6.19以上なので最新のMySqlで立てます。
次にParameter Groupを操作します。デフォルトのParameter Groupは変更できないので新たにParameter Groupを作ります。
新しく作ったParameter Groupから「innodb_buffer_pool_dump_at_shutdown」と「innodb_buffer_pool_load_at_startup」の値を1にします。 innodb_buffer_pool_dump_at_shutdownは「シャットダウン時にキャッシュをバッファプールにダンプする」、innodb_buffer_pool_load_at_startupは「起動時にキャッシュをバッファプールからロードする」事を表しています。 ここを1にすることでパフォーマンスを維持したまま再起動させることが可能になります。簡単ですね。
手動で行う
では次にこれらを手動で行う方法を書きます。でも上の設定を行うことで再起動の時に自動的にキャッシュのWarmupができるのに、なぜわざわざ手動で行う必要があるのでしょうか。 それは上のキャッシュのWarmupは「正常シャットダウン時」のお話だからです。異常時、RDSの特徴の一つでもある「自動フェールオーバー時」にはバッファプールにはキャッシュが格納されません。ですので手動で行う必要性も出てくるわけです。
手動で行う、といっても実はそんなに難しいことはなく、ただ用意してあるストアドプロシージャを叩くだけです。 バッファプールにキャッシュを格納する時はmysql.rds_innodb_buffer_pool_dump_now、バッファプールからキャッシュをロードする時はmysql.rds_innodb_buffer_pool_load_nowを叩きます。 キャッシュを格納する処理はいつフェイルオーバーするかわからないので、定期的に叩くようにイベント化しておくのがいいと思います。
CREATE EVENT periodic_buffer_pool_dump ON SCHEDULE EVERY 1 HOUR DO CALL mysql.rds_innodb_buffer_pool_dump_now();
例えば上の例ですと「1時間おきにmysql.rds_innodb_buffer_pool_dump_nowを叩くperiodic_buffer_pool_dumpというイベントを作る」という処理をしています。
ちなみにキャッシュをロードしている最中にそれを中止するにはmysql.rds_innodb_buffer_pool_load_abortというストアドプロシージャを叩きます。
注意点
最後にCache Warmingを使用する上での注意点をまとめます。
- 使えるのはMySql5.6.19以上
- InnoDBに使えます
- バッファプールに保存されるのはキャッシュページのmetadataであってキャッシュページそのものではない
- バッファプールに保存されるキャッシュとして使用されるファイルサイズはキャッシュサイズ全体の0.2%となる。例えばキャッシュが64GBあったらバッファプールに保存されているファイルサイズは128MB
まとめ
いかがでしたか。注意点にも書いたようにキャッシュそのものを保存するわけではないので非常に小さなファイルサイズで格納することが可能なこの機能、いざという時のために是非実装しておきたいものですね!