Amazon ElastiCacheで高速DB実現

はじめに

近年ではビッグデータや機械学習など大量のデータをシステムに計算させるニーズが高まっています。そうした中で必要になるのが、DBの高速化です。本記事では、ビッグデータやリアルタイム性を求められる用途に適した「Amazon ElastiCache」というサービスを紹介していきたいと思います。AWSでは様々なDBサービスが提供されているので、どれを使えばいいかわからないという方もいらっしゃるかと思います。Amazon ElastiCacheはその中でも最も高速なDBサービスと言えるでしょう。AWSのDBサービスの比較をしたい方や高速なDBをお探しであれば是非本記事を読んでみてください。サービスの紹介だけではなく、高速化を実現させる諸々の仕組みや、本サービスの使用例などを紹介しておりますので、サービスの理解を深めて頂けると思います。

Amazon ElastiCacheとは?

Amazon ElastiCacheとはAWS上で動作するインメモリデータストアを操作、運用できるサービスです。インメモリデータストアとは、簡単に言うと、メモリ上で動作するDBと考えることができます。通常データを取得する際、データの保存されているHDDやSSDなどのディスクを読み込みますが、ディスクの読み取りはメモリなどの記憶装置に比べると低速になります。ElastiCacheではそうしてディスクの読み取りを行わず、メモリ上にDBを作成しておくことで、レスポンスを飛躍的に短縮させることができるようになります。Amazon ElastiCacheではRedisとMemcachedの2つのエンジンを利用しています。後に二つのエンジンの違いを説明しますが、まずインメモリデータストアについて具体例を交えて紹介していきたいと思います。

インメモリデータストアの使用例

インメモリデータストアは、リアルタイム性を要求する処理で効力を発揮します。
ポピュラーな使用例はキャッシュとして利用することです。キャッシュとは、HDDなどから読みこんだデータを一時的にメモリ上に保存しておく技術です。このキャッシュを利用したデータ維持の方法に「遅延読み込み」と呼ばれものがありますが、これは、最初にDBから読んだデータをメモリ上にキャッシュしておき、次に同じリクエストを要求した場合には、保存されているキャッシュからデータを取得してきます。

リクエストはまず最初にキャッシュに問い合わせますので、もしキャッシュ上にデータが存在しない場合のみ、DBに問い合わせてデータを取得できるようになります。こうすることで、リクエストの多いデータを対象に高速に処理することができるようになります。またアクセスの無いデータはキャッシュされないので、キャッシュのリソースを有効に使うことができます。ただし、一度キャッシュに書き込まれたデータは更新されなくなるので、古いデータのまま残ります。そうした場合、書き込みスルーや(DBが更新されたらキャッシュも更新する)ややTTLの追加(キャッシュに有効期限を持たせて、有効期限が切れたら更新する)と併用してキャッシュが常に新しく保たれるよう工夫します。こうすることでリアルタイム性を要求するリクエストに高速で対応することが可能になります。

他には、オンラインゲームでプレイヤーのランキング表示するリーダーボードなどで利用されています。多数の同時プレイヤーが存在し、スコアが絶えず変化している中で、瞬時にプレイヤーのスコアを計算し、再ランキングさせています。

またリアルタイム入札などでも利用されます。リアルタイム入札とは、RTB(Real-Time Bidding)と言われ、WEBページで広告を表示させるための仕組みです。WEBページへアクセスした時に自動で広告が切り替わるのを見たことがあると思いますが、あれが表示されるまでに我々の行動履歴などが送信されて、広告主たちが広告枠を狙って入札しています。そして落札された広告が我々のWEBページに表示されています。この一連の流れがRTBとなります。ここでもユーザー情報やターゲット広告などをキャッシュしておくことで高速化が実現されています。

ほかにもリアルタイム性を要求するチャットツールやサブスクライブ、機械学習などでも利用されており、ElastiCacheではそれらの専用の機能が豊富に備わっています。キャッシュとしての利用だけでなく、目的に合わせた柔軟なアプリケーションを作成することが可能です。

ElastiCacheでは、RedisとMemcachedの二つのエンジンを使用することが可能です。Amazon ElastiCacheの全般的な特徴とそれぞれの差異を挙げていきたいと思います。

全般的な特徴

ElastiCacheの最大の特徴はインメモリデータストアの機能です。
ディスク読み取りとメモリ読み取りで実際どれくらい差が出るかというと、なんと処理速度が10倍向上します。その結果平均でミリ秒未満の読み書き操作が可能なります。さらに1秒間に数百万件の操作が可能になります。

ElastiCacheはフルマネージド型のサービスとなります。フルマネージド型というのは、コンピュータ障害監視・バックアップ・ソフトウェアのバージョンアップなどの運用に関わる作業をAWSが請け負ってくれるサービス体型となりますので、我々ユーザーはサービスを利用するだけでよくなります。
またスケールが簡単に行えます
スケールとは規模のことですが、負荷分散させたい場合にノードを増やしたり、規模縮小に伴って不要なノードを除去したい場合は簡単にできます。

Memcached用 Amazon ElastiCacheとRedis用 Amazon ElastiCacheの違い

可用性

まず二つの違いは、可用性に差が出てきます。
Redisでは、ノードをクラスター化し可用性を保つことが可能です。クラスター化するとは、ノードを複数接続し運用することで、仮に一つのノードで障害が発生した場合でも、システムを止めることなく稼働させることができる技術です。Redisでは自動フェールオーバー(障害復旧)機能があり、プライマリノード(メインのノード)が自分の複製(レプリカ)を作成し、障害が発生した場合や多大な負荷がかかった場合にレプリカをプライマリに昇格させ、処理させます。昇格したプライマリノードは新たにレプリカを作成し、次の障害発生時に備えます。Redisではこうした”レプリケーション機能”を備えていますので、可用性が高くなります。一方でMemcachedではクラスター化はできるようですが、レプリケーション機能は備わっておりません。可用性という観点ではRedisの方が信頼できるものになるでしょう。

柔軟性

また柔軟性という観点でも差が出てきます。RedisではList、Set、Sorted Set、Hash、Bit Arrayなど様々なデータ型を扱え、コマンドも豊富にあります。一方でMemcachedでは、シンプルなデータ(String)のみしか格納できません。String型以外のデータを扱う場合は、アプリケーション側で格納できる形に変換する必要があります。またgetやsetなどのキャッシュを操作するための簡単なコマンドしか用意されていなようです。単純にキャッシュとしての利用ではMemcachedで良さそうですが、様々なデータ型を利用したい場合や柔軟なアプリケーションを作成したい場合はRedisの方が向いていると言えるでしょう。

復元性

もう一つは、バックアップの可否があります。メモリ上にデータをストアしますので、電源が落ちたりしたらデータが消えてしまうのが一般的な考えですが、Redisの場合だと”スナップショット”を取得することができます。このスナップショットからバックアップを取得することが可能となります。Memcachedの場合は、バックアップ機能がありません。復元性という観点ではRedisが良いでしょう。

機能性

Redisではシングルスレッドを採用していますが、Memcachedではマルチスレッドを採用しています。ですので、MemcachedではCPUの性能をスケールアップすれば、処理速度を上げることが可能になります。機能性という観点ではMemcachedの方が優れています。

拡張性

拡張性にも差が出てきます。Memcachedでは、クラスターあたり最大20個のノードと12.7TiBの容量を持つインメモリキャッシュにスケールできます。Redisでは最大 170.6 TB のインメモリデータを持つクラスターまで簡単にスケールすることができます。Redis Cluster 環境を最大 250 のノードと 250 のシャードにまでスケールできます。拡張性という観点ではRedisの方が優れていそうです。

総括

どちらもインメモリデータストアであり、スケールアウトも可能ですので、どちらも高速な処理を実現可能ですが、可用性の高い柔軟なアプリケーションを作成する場合はRedisの方が良いでしょう。規模の拡大にも柔軟に対応できるはずです。Memcahcedを使う場合は、そのシンプルさとマルチスレッドを活かした高速なキャッシュとして利用するのに向いているでしょう。

まとめ

いかがでしたでしょうか?
Amazon ElastiCacheを使うことで処理速度を飛躍的に向上させることが期待できそうです。またRedisの場合では柔軟な用途に利用できますので、あらゆる場面での活躍が期待できそうです。DBを今よりも高速にしたいとお考えならこのサービスを利用してはいかがでしょうか?以上です。ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

前の記事

Amazon S3とは