Disqus のスケール - Django 編
やり直し。2010 年の Django Con のスライドより。
Disqus は多くのサイトに組み込まれているサービスのため、メンテナンスによる停止が難しい。
>>> サーバの構成
- エッジロードバランサーに 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 に付き QuerySe
t を再利用しない場合はキャッシュしない方が良い。そして再利用しない場合がほとんど。
>>> 更新はアトミックに
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 楽しみですね!
コメント
コメントを投稿