CDP:Temporary Tableパターン
From AWS-CloudDesignPattern
Contents |
解決したい課題
RDBMSは集計の処理などをするのに、非常に優れたデータベースです。 しかし、大量のデータを一気に書き込むような場合は、高負荷になり それに耐えうる高価なハードウェアや、ハイスペックなインスタンスを用いなければならない。 常に一定の高負荷であればよいが、負荷の状況にむらがある場合はコスト効率が非常に悪い。
クラウドでの解決/パターンの説明
- 一時的に高負荷にも耐えられるサービスを利用し、データのバッファを作る。
- バッファから一定の負荷でRDBMSに書き込む
- 必要があれば、集計結果を書き込む
- 読込の時にはReadReplicaなどを使う
実装
- 書込データ(ログなどの情報)を一時的にSQSや、SimpleDB、DynamoDB、S3、CloudWatchに書き込む これらをTemporaryTableと呼ぶ
- 定期的にこれらのTemporaryTableからデータを取り出し、RDSに格納しておく。
- RDSに格納する際に、生のデータが必要ない場合は、ある程度の集計をして書き込むとさらに負荷低減につながり、RDSのコストは下がる
- 定期的に動かす処理はScheduled Auto Scalingパターンを使うとさらに効率が良いことが多い。
- RDSから情報を集計し、取り出す時にはReadReplicaを利用すると、さらに効率が良いことが多い。
構造
利点
高負荷に耐えうる安価なサービスを一時利用することで、RDSの負荷の平準化を図ることができ、ピークに合わせた費用をかけなくて済む。 集計しなからRDSに書込をすることで、負荷軽減すなわちインスタンスタイプを落とすことが出来る。 また、CloudWatchを利用することで、サービス側で集計も行うことができ、バッチ用EC2の負荷を落とす事ができ、更にコストを削減出来る。 ReadReplicaパターンと組み合わせる事で、読込時の負荷を考慮しなくて良くなるため、RDSのインスタンスタイプを極限まで下げることが出来る。
注意
- データの内容によっては利用できない可能性がある。バイナリデータ等
- リアルタイム性の確保は実現出来ない。
- データ量、集計粒度によっては、TemporaryTableからRDSに移すためのEC2コストの方が高く可能性もある。
寄贈したアーキテクト
得上 竜一 (@tottokug)
好きなAWS:DynamoDB ,SimpleDB ,CloudSearch