joppot

コピペで絶対動く。説明を妥協しない

サーバ プログラミング

ElastiCacheのmemcachedとEC2上のrailsとdalli-elasticacheを使ってキャッシュ管理する

投稿日:

Pocket

Photographers

概要

皆さんこんにちはcandleです。今回はaws上にあるElastiCacheというサービスを使って
railsのキャッシュを管理したいと思います。

キャッシュというのはwebサービス上でよく使うページをサーバが使いやすい形に変換して、溜めておき必要とあらば
キャッシュからページをユーザーに返したりする機能です。

キャッシュの保管場所としてよく使われるのがデータベースです。一時的に保持して、そこからユーザーにページ情報を返答するやり方します。

しかし、データベースは単純かつ高速なインプット・アウトプットに適しているわけではありません。

キャッシュはもっと短時間で意味不明なものを素早く保存、取り出しするものです。

そこで登場するのがmemcachedサーバです。これはキー=>バリューの形式でデータを保存、アウトプットします。
ここにセッション情報やキャッシュ情報を保存し取り出せば、アプリケーションの動作が速くなると言われています。

cacheela

memcachedサーバの運用として、AWSのEC2にmemcachedを立てて、
そこに他のEC2のrailsサーバからアクセスさせても良いのですが、
セキュリティ面、立ち上げや停止のやりやすさも兼ねて、
AWSのサービスの1つElastiCache(EC)を使ってみましょう。

前提

railsアプリケーションがEC2上で起動している

ElastiCacheはセキュリティ面も考慮して、AWSのEC2からしかアクセス
できないようになっています。
ローカルのrailsからはアクセスできないので
注意してください。

SPONSORED LINK

EC2上のrailsにdalli-elasticacheをインストールする

EC2のサーバににアクセスして、railsプロジェクトに移動します。
Gemfileを開いて、下の内容を書き込みます。

gem 'dalli-elasticache'

保存したら、下のコマンドでインストールします。

bundle install

dalliがインストールできました。

 

EC2とElastiCacheを繋ぐSecurity Groupを作る

これがすごい大変です。複雑です。

現在EC2上のrailsサーバが属しているsecurity group 「myec2」というが
あるとします。

ec2securitygroup

次に、新しくSecurity Groupを作ります。名前は「ec2-memcached」にしておきます。
「Inbound」を「All TCP」にします。
カスタムIPのところに、「myec2」と書き込みます。
すると入力補完でmyec2のIDが出てくるのでそれを選びます。

「Outbound」も同じ様に「All TCP」にして、カスタムIPのところに同じく「myec2」と書き込み、
でてくるmyec2のIDをクリックします。

最終的に下の様になります。
createsecuritygroup

様は、カスタムIPのところにrailsサーバが属しているSecurity GroupのIDを入力するということです。
最後に「Create」を押せばEC2とElastiCacheを結ぶSecurity Groupが作られます。

今作ったec2-memcachedというSecurity GroupをElastiCacheに付与していきます。

ElastiCacheを起動させる

AWSのサイトにログインして上のメニューから
ElastiCacheを選びます。
awsmanagement

「Launch Cache Cluster」をクリックして起動します。

launchcache

必要事項を埋めていきます。

「Name」は自分のサービスの名前とかにします。
testと名前付けてみました。

「Number of Nodes」は分散処理をどのぐらい持つかみたいなのだと思うのですが、実はよく理解していません。

調べてみると、だいたい2と設定しておけば問題ないっぽいですね。
今回はテストですので、1でやっていきます。

「Node Type」はそのサービスの規模によりますが、普通のサービスならm1.smallでいいと思います。

今回は最も小さい、t1.microにします。

「Topic for SNS Notification」はCPUの稼働率とかで警告をだす
設定ですが、もしも予めARNを作っていなければ、「Disable Notifications」
にしておきます。

「engine」はmemcachedにします。

あとは写真のとおりです。
elasticsetting1

Nextを押して次の設定に移動します。

次の所が重要なのですが、「Security Group」という項目があると思います。

Security Groupは先ほど作ったec2-memcachedを選びます。

choosesecuritygroup

nextボタンを押します。

最後に設定の一覧が出てきますので、確認してから、「Launch Cache Cluster」を押します。

submit

これで少し待っていると、memcachedが起動します。

 

memcachedのendpointを確認する

作成したmemachedを選択して、エンドポイントのURLをクリックします。

elasticacheconsole

ウィンドウで2つのURLが出てくると思います。
上の方をクリックしてコピーして、URLをどこかに控えておきます。
elasticcacheurl

これでmemachedのサーバの設定およびElastiCacheの設定が終わりました。

railsのmemcachedの設定

今度はec2のrailsに移動します。dalli-elasticacheはすでにインストールされています。

railsが本番環境ならばconfig/environments/production.rbを開き、
もしも、ディベロップメント環境ならconfig/environments/develpment.rbを開きます。

下の記述を書き込みます。

endpoint = "先ほどコピーしたmemachedのURL:11211"
elasticache = Dalli::ElastiCache.new(endpoint)
config.cache_store = :dalli_store, elasticache.servers, {:expires_in => 1.day, :compress => true}

保存しましょう。

セッションを使ったサービスをだしているなら、下のファイルが作られていると思います。
無い場合はセッションを使ったサービスをしてないと思います。その場合は無理に作って
設定する必要はありません。

config/initializers/session_store.rbを開きます。

Rails.application.config.session_store ActionDispatch::Session::CacheStore, :expire_after => 1.day

を書いて、保存しましょう。

これで終わりです。実に簡単ですね。

動作確認

本番環境ならapacheのpassengerとかnginx unicornを使っていると思います。
railsプロジェクトのlogからproduction.logを見て、
本当にキャッシュをされているか確認して下さい。

ちなみに私の環境では下のように良い感じにキャッシュされました。
Cache Write とかCache readとかされていますね。
memcachelog

まとめ

実は、この記事は全て実際に作ってから思い出して書いているので、試行錯誤もテストも
できないところで書きました。もしかすると、security groupの設定が間違っていたり
memachedのところがおかしかったりするかもしれません。
気付いた点などがありましたら、コメント欄かtiwtterで報告お願いします。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ, プログラミング
-

執筆者:


  1. Is there any information about this subject in other languages?

comment

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

関連記事

apache2.4でvirtualhost毎に環境変数を定義しphpで使用する方法

English 日本語 概要 みなさんこんにちはcandleです。 今回はapache2.4でバーチャルホスト毎に環境変数を定義して、それをphp側で受け取る方法を紹介します。 例えば、wordpre …

MysqlのSELECT FROMの結果を美しく、見やすく表示する

概要 みなさんこんにちはcandleです。今回はmysqlのデータベースに関する簡単な記事です。 データベース系の言語は最近、様々出てきましたが、私は未だにMysqlくらいしか触っていません。 私はp …

gitpythonでfirst commitする

概要 みなさんこんにちはcandleです。今回はgitpythonで、初めてのコミットをする方法を紹介します。 gitpythonでコミットは難しくないのですが、初めてのコミットは要領が違ったので、ま …

AMIMOTO AMIのnginx上でvirtual hostを設定してphpサービスをリリースする

概要 みなさんこんにちはcandleです。今回はAMIMOTO AMIのnginx上でバーチャルホストを使う場合の設定をやってみたいと思います。 AMIMOTO AMIは高速でwordpressを作成 …

ruby on railsのckeditor gemの使い方をscaffoldを用いて解説する

概要 みなさんこんにちはcandleです。今回はruby on railsのckeditorという素晴らしいgemを使って見たいと思います。 ckeditorとはweb版の高機能なwordとかテキスト …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ