<< >>

2007-05-20 [長年日記]

[Rails] Rails勉強会@東京#18

  • 前半: QueryCache / MMC
  • 後半: 今だからこそ運用環境を考える

に参加。

前半: QueryCache / MMC

QueryCache とは、AR.find の結果を memcached を用いてキャッシュする plugin。(rakuto 作)

rakuto式 QueryCache の課題

  1. with_scope どうする?
  2. memcache のキー
  3. 削除戦略

1は、AR.find の引数だけを見てキャッシュのキーを作成しているため、with_scope と混ぜるな危険。解決策の1つは「キャッシュするレイヤーを select_xxx まで引き下げる」こと。そうすると find_by_sql まで対象に入るという嬉しい副作用もある。ただその場合、キャッシュの対象も同レイヤーにするとARオブジェクトでなく生の結果セットになると思うので、何か面倒な気もしてきた。うーん、悩ましい。

2は、今は MD5 でキーを作っているので低確率ながら衝突の危険性があること。3は、時限式、更新トリガー式、とか色々あるけど、どうするのがいいんだろうね?という話。

ちなみに、Rails Edge の AR には同名の QueryCache というモジュールが既に存在し、2.0 に向けて開発が進んでいる模様。

QueryCacheあれこれ

種類宣言削除戦略複数(分散)説明
Edge 版不要自動×単体サーバ用でお手軽
rakuto 式必要選択式中〜大規模用の分散向け

Edge 版の方は、ユーザの手間要らずでキャッシュしてくれるので使い勝手がよい。何もしなくても二度目の参照はキャッシュの値を利用し、ARメソッドによる更新があればキャッシュが自動的に破棄される。イメージとしては、AR の関連が一番近い。

ただ、Rails は分散系を core ではサポートしない方針ぽいので(今のところは)、複数台で利用する場合はキャッシュはできるものの、10台のサーバが同じキャッシュ100Mをそれぞれに持つ(合計1G)という悲しい状況になりえる。rakuto 式では、複数サーバでの共有を意図しているため、同じ場合でも1台のmemcachedサーバが100M消費するだけで済む。また、キャッシュサーバとアプリケーションサーバを分離できるので、よりメモリに優しい。1台なら Edge 版、複数台の規模なら rakuto 式になりそうだ。

後半: 今だからこそ運用環境を考える

勉強会参加者の8割が「Apache2.2 + mod_proxy_balancer + mongrel(cluster)」という構成で運用していた。これが現在の日本の Rails 運用のデファクトぽいので、迷ったらこの構成がよいだろう。その他の選択肢はこんな感じ。

フロント

サーバ名証明書ストリーミングprotocol説明サイト
Apache1.3fastcgiRails1.0 時代のデファクト
Apache2.2http proxyRails1.2 時代のデファクト
IIS勉強会に一人いて驚いた
LiteSpeedlsapiRailsのサポートに力が入ってるhttp://www.litespeedtech.com/
Nginxこれが一番速いと噂http://wiki.codemongers.com/Nginx
Pen検索し辛いのでダメ忘れた
Pound×http proxy簡単で使いやすいhttp://www.apsis.ch/pound/

バック

サーバ名メモリ速度複数
Lighttpd
Mongrelcluster
Webrick×

それぞれ好きなサーバを選択して、組み合わせてOK。次は、Aapache2.2 + mod_proxy_balancer + Lighttpd でやってみようかと思った。

本日のツッコミ(全4件) [ツッコミを入れる]
_ なひ (2007-05-22 21:17)

2 ** 64なんて当たらないから気にしない

_ 舞波 (2007-05-22 22:55)

えー、2**64の確率で大爆発する目覚まし時計とか、<br>2**64の確率で確実に墜落すると保障された飛行機とか、<br>気分悪くないですか?実際には遭遇しないにしても。

_ shio (2007-05-23 11:46)

2 ** 128 でないですか?

_ なひ (2007-05-25 15:19)

SSLとか電子署名とかそゆもんですから。例えば1億台のPCで秒間1000回計算し続けて。。。あれ、6年で1組当たるな。じゃSHA1でー