キャッシュの仕組み
アプリのクライアントとサーバー間の通信の高速化を実現するための手法として、「キャッシュ」が存在します。キャッシュは時間のかかる処理を、キャッシュサーバーにデータを保存することで、2回目以降の通信は保存済みのデータから処理の結果を返すことによって、通信の高速化を実現化しています。
オリジンサーバーは、配信するデータの元となるオリジナルのコンテンツ(動画・画像・文字データなど)を格納しているサーバーです。キャッシュサーバーは、このオリジンサーバーから配信されるデータを複製して格納したサーバーのことで、複数のキャッシュサーバーは物理的に離れたところに配置されており、2回目のサーバーへの接続はユーザーから一番近いキャッシュサーバーから配信されます。
キャッシュサーバーがあることで、オリジンサーバーへのアクセスが集中することを防ぐことができ、ユーザーはWebコンテンツなどのレスポンスが向上するなど、メリットがあります。しかし、デメリットも存在しています。具体的には、サーバー内に残っているキャッシュが古い場合は、最新の情報が配信されない、キャッシュに個人情報が残っていると、個人情報の漏洩のリスクなどが挙げられます。これらを解決するためにも、キャッシュを最新なものにする、そしてキャッシュの保持する期間を短くするなど、さまざまな対応が求められます。
キャッシュサービスの種類
オープンソースで提供されているキャッシュで、よく利用されているものにRedis、Memcachedと呼ばれるものがあります。これらはより効率的、高速、信頼性を実現するのに適しています。
AWSには、ElastiCacheと呼ばれるRedis、Memcachedと互換性のあるマネージドサービスが用意されています。利用者は単に、利用するキャッシュを選択するだけで簡単にキャッシュサーバーを構築できます。また、キーバリュー方式型の仕組みを採用しており、データ種類や量に応じて効率的に管理をすることができます。
ElasiCacheの特徴
ElastiCacheには、ノードと呼ばれるキャッシュを保存する場所が存在します。また、ノードが1~6個集まるとシャードと呼ばれます。ノードには2種類存在し、更新と照会を行うプライマリーノードと、プライマリーノードが行った更新をコピーしたレプリカノードがあり、シャード1単位をこれら2つを含めたものになります。データの照会はプライマリーノードが行い、レプリカノードはプライマリーノードが更新されると、複数のレプリカノードにコピーを行います。これによって、例えプライマリーノードに障害が発生しても、照会はレプリカノードでもできるといった耐障害性を持っています。
そして、複数のシャードで構成されているものをクラスターと呼び、ElastiCacheではクラスター構成を取ることができます。クラスター構成によって、複数のサーバを一つに集約させて、利用者や他のサーバから、全体で1台のサーバであるかのように見せることができます。
ElastiCacheの作成
今回は、キャッシュエンジンにRedisを使って、シャード内にノードを3つ(プライマリー1+レプリカ2)の構成で作成していきます。
ElastiCacheダッシュボード=>Redisクラスターを作成 をクリックします。
名前 | 説明 | ロケーション | マルチAZ |
---|---|---|---|
sample-elasticache | Sample Elasticache | AWSクラウド | 有効化 |
マルチAZ構成を有効化することで、片方のAZに障害が発生してもキャッシュサーバーが機能するようにします。
ネットワークタイプ | 名前 | 説明 | VPC |
---|---|---|---|
IPv4 | sample-elasticache-sg | 任意の説明 | 作成したVPC |
動作確認
$ ssh web01
Amazon linnux2にはredis-cliコマンドがインストールされていないため、まずはインストールします。
$ amazon-linux-extras list (redis6ライブラリーがあるかの確認)
$ sudo amazon-linux-extras install redis6
次に、クラスターに接続テストを行っていきます。まずは、キャッシュサーバーに接続して、キーのオブジェクトを取得した際に、バリューが返ってくるかを確認していきます。
$ redis-cli -c -h <Redisクラスターの設定からエンドポイントを指定(末尾のポート番号は消去)>
$ set key1 "hello wrold"
$ expire key1 10
$ get key1
setで"key1"に"hello world"を設定し、expireで"key1"の有効期限を10秒間とします。getで"key1"の中身が帰ってきますが、10秒たった後にgetコマンドを入力すると、nillが返ってきます。
参考
AWSではじめるインフラ構築入門 翔泳社出版