CDP:Inmemory DB Cacheパターン
From AWS-CloudDesignPattern
頻度の高いデータのキャッシュ化
Contents |
解決したい課題
データベースの負荷の大部分は読み込みに関するものであることが多い。そのためデータベースからの読み込みのパフォーマンスを改善すれば、 システム全体のパフォーマンスが向上につながる。
クラウドでの解決/パターンの説明
データベースからの読み込みのパフォーマンスを向上にする方法として、頻繁に読み込まれるデータを、 高速なインメモリにキャッシュするのがこのパターンである。 一度利用した値を、キャッシュしておくことで、 次に使うときにインメモリから再利用する、という仕組みである。キャッシュされるデータの典型的な例としては、 データベースにおいて時間のかかるクエリ結果で あったり、複雑な計算の結果、等が挙げられる。
実装
AWSにはElastiCacheと呼ばれるインメモリキャッシュ専用のサービスがある。このサービスは構築が容易で障害時の自動復旧機能などももっている。
- インメモリキャッシュを用意する。インメモリキャッシュはElastiCacheを用いても良いし、EC2上に、オープンソースのmemcachedのようなサーバを構築しても良い。
- アプリケーションサーバでは、データを読み込む際にまずインメモリキャッシュ上のキャッシュを確認し、もしデータが無い場合は、DBから読み込んで今後のためにキャッシュ上に登録しておく。
構造
利点
- インメモリ上の高速なキャッシュを用いることで、データベースの読み込み負荷を下げ、システム全体のパフォーマンスを向上できる。
- ElastiCacheを用いれば、さらに運用を効率化でき、障害にも強くなる。
注意
- データベースに対するクエリの結果をキャッシュする場合にはトレードオフを考える必要がある。その特定のクエリが行う読み込みと、 クエリに関連するテーブルに対する書き込みの比率が重要である。例えば、参照を非常に頻繁に行い(毎分何回も)、更新をあまり行わない(日次、もしくは毎時程度)場合は、キャッシュするのは価値があるであろう。しかし、キャッシュが古い情報を含まないように、友人のリストを更新する度に、このキーのデータを廃棄する必要があることに注意する。(参考情報: http://highscalability.com/bunch-great-strategies-using-memcached-and-mysql-better-together)
- キャッシュを利用するためには、DBアクセスを行うプログラムに手を入れる必要がある。