Alexey Kovyrin’s Blog に Scribd での Squid によるキャッシング方法が紹介されていました。
かなり興味深い記事だったので、日本語で要約としてまとめておきます。このエントリでは、ハードウェア設定、ソフトウェア設定、キャッシングクラスター設定、の3つの章から説明されています。
ハードウェア設定
次のようなハードウェア仕様のサーバを使っています。
CPU: Xeon 5418 x 1(CPU 使用率平均は 1% 以下なので安い CPU を使っているとのことです)
RAM: 8GB
Disk: SAS 15000回転 x 4 で、JBOD(RAID 未使用、すべての RAID のタイプを試してみたが、I/O パフォーマンスを改善する助けになるものはなかった)
高回転型のディスクを使っていて、JBOD にしているところが興味深いです。CPU の負荷グラフも公開されています。

ソフトウェア設定
さまざまな Squid のバージョンを試したようです。最終的には、独自のビルドをした Squid 2.7 STABLE 6 を使っているとのことです。
それまでの過程は、次のようになっています。
最初は、Debin の apt-get コマンドでインストールできる Squid を使った。Squid 2.6 リリースでは I/O 操作が遅く、ファイルディスクプリタがリークする問題があったそうです。Squid 3.0 リリースまで待ちたかったが正式版のリリースに約5ヶ月ほどかかりそうという結論したそうです。
次に Squid 2.7 リリースを試してみたとのことです。2.7 リリースでは、Vary HTTP ヘッダによるキャッシングが改善に実装されている唯一のバージョンだそうです。3.0 でも同様の機能があるようですが、C++ へ以降されているようです。
キャッシングクラスター設定
ロードバランサーは HAProxy、ウェブサーバは Nginx を使っているようです。HAProxy と Nginx との間に Squid を挟んで URL ハッシュベースによる負荷分散をセットアップしているとのことです。
この方法で、とてもよく動いているとのことですが、一つだけ深刻な問題点があるとのことです。それは、もし一つの Squid サーバが落ちると HAProxy はすぐに問題を検出して、プールから落ちた Squid サーバを外します。そしてここで問題が起きるようです。それはプールからサーバを外すときハッシュされているキー空間が完全に変わってしまって、すべてのキャッシュされているリクエストが無効になってしまうとのことです。この問題を解決するために、 URL をハッシュする Nginx モジュールを開発して、現在は本番環境へ投入されているようです。(この Nginx モジュールは公開されていないようで残念です。)
かなり要約しましたが、d は Rails で動いている大規模サイト(Alexa ランキング第2位)なので、こういう大規模サイトの情報はとても貴重です。先日の Velocity でも HAProxy はロードバランサーとして LVS よりも人気があったので HAProxy もどんなものか試してみたいと思いましたし、Squid もサーバインフラ本で読んだだけなので Varnish とあわせて試してみたいと思います。
僕はセンスがないせいか、実際に試してみないとどんな問題を解決するツールなのかほとんど理解できないので悔しいところです。
Tags: squid scribed






