この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Railsでセッションの保存先として、memcacheを使用する場合があります。 しかし、memcachedが落ちてしまった場合、サイトにログインできないトラブルが起きてしまうなどの懸念があります。 そこでepcachedを使用してみたいと思います。
■ Repcachedとは?
- memcachedにレプリケーション機能を追加
- 非同期のレプリケーション
- マルチマスタのレプリケーションをサポート(バージョン2.0より)
詳細、repcachedのインストール手順は公式サイトを参照してください。
http://lab.klab.org/wiki/Repcached
■ Railsで使えるようにする
Railsのアプリケーションでrepcachedを使用するためには、memcachedクライアントのインストールとアプリケーション側の設定が必要です。
memcachedクライアントの導入
repachedの大本はmemcachedなのでmemcachedクライアントがそのまま使えます。
gem install memcached-client
gem install system-timer
railsでの設定
ここではセッションの保存先として使用する場合と、
フラグメントキャッシュで使用する場合を例示したいと思います。
※この例では、192.168.1.10と192.168.1.11でrepcachedが立ち上がっており、
この2台でレプリケーションしているとします。(ポートはいずれも11211番を使用)
セッションの保存の場合
ActionController::Base.session = {
:memcache_server => ['192.168.1.10:11211', '192.168.1.11:11211'],
:expire_after => 86400,
:namespace => "app-session-#{ENV['RAILS_ENV']}"
}
ActionController::Base.session_store = :mem_cache_store
フラグメントキャッシュの保存の場合
ActionController::Base.cache_store = [
:mem_cache_store,
['192.168.1.10:11211','192.168.1.11:11211'],
{
:namespace => "app-flagment-#{ENV['RAILS_ENV']}"
}
]
※フラグメントキャッシュの保存にrepcachce(memcache)を使用する場合は、
expire_fragmentの引数に正規表現を取ることができなくなってしまいます。
セッションの場合も、フラグメントキャッシュの設定の場合も、基本的には通常のmemcachedとほぼ同じです。
ポイントはmemcacheのサーバの指定に、レプリケーションしているmemcachedを双方指定することです。
これによって、セッションやフラグメントキャッシュは一旦指定したmemcachedのいずれかに配置されますが、
レプリケーションによって最終的には双方のmemcachedに配置されます。
仮に片方のrepcachedが落ちた場合でも、レプリケーションされているためほとんどのセッションやキャッシュは
失われずにすみます。(※非同期のレプリケーションのため、生成されたばかりにセッションやキャッシュは失われる可能性があります)
落ちた場合も、repcahcedの再起動時にレプリケーション先を指定することによって、
内容の同期が行われ、再びレプリケーションを行うことができます。