Disqus のスケール - Django 編

やり直し。2010 年の Django Con のスライドより。

Disqus は多くのサイトに組み込まれているサービスのため、メンテナンスによる停止が難しい。

>>> サーバの構成

Server Architecture

  • エッジロードバランサーに HAProxy: heartbeat 構成。レポートが素敵。
  • HTTP ゲートウェイキャッシュに Varnish
  • Django サーバとして Apache + mod_wsgi: 30 台ぐらい。メモリリークを防ぐために maximum-requests をセット。Ganglia で監視
  • キャッシュに memcached: 25 台ぐらい
  • PostgreSQL ロードバランサーに HAProxy/PgBouncer: コネクションプール用。
  • PostgreSQL: 10 台ぐらい。Slony-I で非同期レプリケーションとフェイルオーバー。
  • ログは syslog-ng: pgFouine でスロークエリーをロギング。

全部でサーバ 100 台ぐらい。他にユーティリティサーバ 15 台、後は HAProxy と heartbeat 用に 20 台ぐらいの構成。Varnish と syslog-ng を除けば Django のデプロイ手順に掲載されているような教科書通り (良い意味です) の構成です。(なんで Apache なの?nginx + gunicorn 速いよって突っ込まれてますね

>>> データベースのパーティショニング

Django はアプリケーションレベルで簡単に垂直パーティショニングができます。アプリケーションごとに DB 分けたり、DB をアプリケーションレベルでルーティングできます (ドキュメント)。水平パーティショニング (a.k.a シャーディング) もアプリケーションで書ける (なるほど・・・)。

>>> キャッシュの削除

Django は QuerySet の結果をキャッシュするけど、それがかなりメモリを消費する。なので SkinnyQuerySet を作った (たぶん Johnny Cache の方が有名?)。view に付き QuerySet を再利用しない場合はキャッシュしない方が良い。そして再利用しない場合がほとんど。

>>> 更新はアトミックに

save() はスレッドセーフではありません。update() の方がよきに計らってくれる (スライド: save vs update)。django-tips-and-tricks より。余談ですが、 Django 1.6 より アトミック更新 がサポートされますよ!あと、Django 1.6 からは autocommit です。Django 1.6 を使いましょう。

>>> キャッシュフレームワーク

Memcached のバックエンドには python-memcached ではなく pylibmc を使う。1.3 以降で pylibmc 使えるようになっています。理由は書いてありませんでしたが、ベンチ結果とか、ノンブロッキングリクエストが出来るとか、TCP nodelay 等の色んなオプションがサポートされたりしています。

>>> CI

  • Fabric を使ってデプロイ
  • Jenkins (Hudson) と Selenium (django-selenium) を使ってテスト (7万行, カバレッジ 73%, 実行に要 20 分) を自動化
  • ポストコミットフックを使って Pyflakes のような簡単なテストを実行
  • 簡単に以前のバージョンに戻せるようにしている

>>> バグトラック

Sentry を利用 (旧 django-db-log)。結果を redmine に。

基本に忠実な感じで。2年前のスライドで、他にも色んなハックが載っていましたが、ほとんど Django 1.6 でカバーされていました。1.6 楽しみですね!

コメント

このブログの人気の投稿

Python から Win32 API 経由で印刷する

財務諸表 (Financial Statements)

Netflix のスケール - オートメーション編