はてなブックマークの裏側その後

まるごとPerl! Vol.1 で執筆させていただいたはてなブックマークのシステムに関する記事が ThinkIT で読めるようになりました。記事全体を何回かにわけて掲載していただいています。まるごとPerlの記事なのですが、実は Perl のことはあまり触れていなくてはてなのサーバー運用概論みたいは話が主なところです。

せっかくなので現状報告も含めて少し補足をしてみようかなと思います。

現在の数字

記事の中での数字は6月のもので

  • ユーザー:45,000人
  • ブックマーク数:535万件
  • ページビュー:5,000万/月
  • サーバー:17台

となってますが、現在 10 月の方はというと

  • ユーザー: 60,000人
  • ブックマーク数 787万件
  • サーバー: 30台

といった構成になってます。ページビューはちょっといますぐ正確な数字がでないので省略してますが、ユーザー数の伸びよりも高い伸び率で伸びていて順調です。

60,000 ユーザーとはどれぐらい

この 60,000 という数字を少ないと感じるか多いと感じるかは結構人それぞれだろうという気がしますね。人気エントリーに掲載されたときの訪問者数とかからみるともう少しいるような気がしそうですが、実際にはこれぐらい。ユーザーにはならないで閲覧だけ、という方は結構いそう。

60,000 人の評価ですが、確か del.icio.us が買収された当時のユーザー数が 30万人で、digg 先日の Future of Webapps カンファレンスでの発表が 60万人くらいだったことからすると、日本向けに展開してて 60,000 人というのはまずまずかなという気がします。一日辺りのユーザー増加率も上昇中なので順調にいけば半年かもう少しぐらいで10万人に到達するかな?

サーバー台数の内訳

ユーザー数が 15,000 人増に対してサーバー台数がそれ以上に増えてますが、これにはちょっと事情がありまして、実はユーザー向けに利用しているサーバーはそれほど増えていません。というか当時と同じぐらいの台数で負荷はさばけてます。増えた分は主に API / bots/フィード配信用のサーバーと画像リクエスト用サーバー。実はこの API / bots/ フィード配信用などのサーバーの方が、ユーザー向けサーバーよりも多くなってます。

http://d.hatena.ne.jp/naoya/20060404/1144121846 の資料でも少し触れていますが、はてなブックマークのシステムはフロントエンドのリバースプロキシで、User-Agent やリクエストされたURL をみてどのバックエンドサーバー群にリクエストを投げるかを振り分けてます。いまそのサーバー群は大きく分けて

  • ユーザー向け
  • API / bots / フィード配信
  • 画像 (はてなブックマークカウンターや○○users画像に応答する。画像の返却じゃなくてその手前の処理まで。)

の3つに分類してます。このうち API / bots / フィード配信のところは DB への負荷が高いため MySQL のスレーブが多めに配置してあり、画像はウェブサーバーへのリクエスト数が尋常じゃない数になるので、ウェブサーバーを多めに配備してます。

あとは LVS を使い始めた影響で何台か増えてる(30台には LVS を含んでます) のとキャッシュサーバという感じです。

memcached

一部 DB のクエリをキャッシュするために memcached も使ってますが、これは専用のサーバーを用意したりはせず、mixi の真似で全ウェブサーバーに memcached を入れてます。memcached の get/set では CPU への負荷はほとんどないため、メモリ容量が云々というところだけが問題になります。一方ウェブサーバーの処理は CPU に負荷がかかります。その両者の特性を考えると共存させるのが効率が良い、というものです。

こんなとこでしょうか。

サーバー負荷の見積もりに関して

一点、記事の中でサーバー運用の話を少し大げさに書いてまして誤解を招くかもなので補足します。

どれぐらいになるか分からない負荷に対して冗長なシステムを用意するのではなく、必要になった頃に素早くそれを追加する、という方針です。これを実行するにあたって、サーバーをいつでも追加できる状態をキープできるかどうかが鍵を握っているのです。

というのは「サーバー負荷高すぎて重いっす、追加します」ということではなく。「何月何日までに 10万人になります。1台あたりで平均 5,000人処理できるので必要な台数は...」という計画を立てるのが難しく、またまずその予測は当たらないので、そこは日々 MRTGNagios、それから自作の監視フレームワークを使って負荷状況やレスポンスタイムを計測しつつ、時期を見極めてレスポンスに影響が出る前に追加してますよ、ということです。

サービスの初期に負荷を見積もったところで、その当時は API もなければ bot も来ない、今あるはてなブックマークの機能の 20% ぐらいしか持ってないわけで、それでサーバー台数を計算したところで意味がないんですよね。なので日々の負荷をグラフ化したり一覧性が高まるように工夫しつつ、サーバー増設に時間がかからないようにというところに気を遣ってます。

ところで同じ時期に偶然

う〜ん、2chのサーバって60台ぐらいだと思うのですが、 5倍の量のサーバを何に使ってるのだろう。。。

ひろゆき先生から質問がありまして。これに対する回答も結構面白い話だと思うのでまたあとで。

自作のサーバーって?

最後にもう一つ。自作サーバーってどんな感じ、というので想像がつかない方は http://bb.watch.impress.co.jp/cda/alphageek/11461.html にある昔の Google サーバーを見ていただけると。うちのはここまで密集性は高くありませんが、やっていることは同じような感じです。

まるごとPerl! Vol.1

まるごとPerl! Vol.1