その他
    ホーム 技術発信 DoRuby Railsでrepcachedを使ってみる

    Railsでrepcachedを使ってみる

    この記事はアピリッツの技術ブログ「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の再起動時にレプリケーション先を指定することによって、

    内容の同期が行われ、再びレプリケーションを行うことができます。