2007-05-20 [長年日記]
● 前半: QueryCache / MMC
QueryCache とは、AR.find の結果を memcached を用いてキャッシュする plugin。(rakuto 作)
rakuto式 QueryCache の課題
- with_scope どうする?
- memcache のキー
- 削除戦略
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.3 | ○ | ○ | fastcgi | Rails1.0 時代のデファクト | 略 |
| Apache2.2 | ○ | ○ | http proxy | Rails1.2 時代のデファクト | 略 |
| IIS | ○ | ○ | ? | 勉強会に一人いて驚いた | 略 |
| LiteSpeed | ○ | ? | lsapi | Railsのサポートに力が入ってる | http://www.litespeedtech.com/ |
| Nginx | ○ | ○ | ? | これが一番速いと噂 | http://wiki.codemongers.com/Nginx |
| Pen | ? | ? | ? | 検索し辛いのでダメ | 忘れた |
| Pound | ○ | × | http proxy | 簡単で使いやすい | http://www.apsis.ch/pound/ |
バック
| サーバ名 | メモリ | 速度 | 複数 |
|---|---|---|---|
| Lighttpd | ○ | ○ | ○ |
| Mongrel | △ | ○ | cluster |
| Webrick | △ | △ | × |
それぞれ好きなサーバを選択して、組み合わせてOK。次は、Aapache2.2 + mod_proxy_balancer + Lighttpd でやってみようかと思った。
● 参考
- Rails勉強会@東京#18 http://wiki.fdiary.net/rails/?RailsMeetingTokyo-0018
- ActiveRecord::QueryCacheを実装した http://rakuto.blogspot.com/2007/04/rails-activerecordquerycachecachestorem.html


2 ** 64なんて当たらないから気にしない
えー、2**64の確率で大爆発する目覚まし時計とか、<br>2**64の確率で確実に墜落すると保障された飛行機とか、<br>気分悪くないですか?実際には遭遇しないにしても。
2 ** 128 でないですか?
SSLとか電子署名とかそゆもんですから。例えば1億台のPCで秒間1000回計算し続けて。。。あれ、6年で1組当たるな。じゃSHA1でー