Hatena::ブログ(Diary)

naoyaのはてなダイアリー

October 20, 2006

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

まるごと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 に負荷がかかります。その両者の特性を考えると共存させるのが効率が良い、というものです。

こんなとこでしょうか。

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

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

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

[ThinkIT

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

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

ところで同じ時期に偶然

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

はてなのサーバ台数は2chの5倍 : ひろゆき@オープンSNS

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

自作のサーバーって?

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

まるごとPerl! Vol.1

まるごとPerl! Vol.1

garyogaryo 2006/10/20 22:33 はてなのブックマークをブックマークの多い順に並べる方法はまだありますか?(全ブックマークを人気順で調べる方法)
http://d.hatena.ne.jp/garyo/20050525/1116984292
今でもべき乗則が成立しているか調べてみたいのですが。

YuhtoYuhto 2006/10/21 07:43 はじめまして。「お気に入り」機能も活用させて頂き、id:naoya様、id:jkondo様、勝手ながら登録させて頂いて日ごろよりみなさんの関心事を拝見しています。最近、「メンテナンス」時間が多いようですが、「実はユーザー向けに利用しているサーバーはそれほど増えていません。」とのこと。ユーザー向けのサーバーはぜひとも追加していただきたいです。ミラーリングなり、バックアップは確実に行っていただきたいです。とあるバグなりサーバー故障で全ユーザのブックマークないし、ダイアリが消滅してしまうことのないように、慎重なご対応をお願いいたします。もう一点。LVS(ロードバランサーですよね?)充分な検証のうえで、慎重な選定・運用をお願いいたします。過去、ロードバランサー自体のバグでえらい目にあった経験もあります。。。私などが申し上げるものお恐れ多いですがwそれでは、今後とも宜しくお願いいたします!

tarotaro 2006/10/21 10:53 「ユーザー」というのは、閲覧している人のUUですか?それとも、1ヶ月間に1度でもブックマークしたはてなユーザーの数でしょうか?
ページビューは「b.hatena.ne.jp」以下のすべてのページのPVってことですよね?(ユーザーページ含む?)

kimata24kimata24 2006/10/22 22:39 >これに対する回答も結構面白い話だと思うのでまたあとで。
期待してます!素人の直感ですが,5 倍ってのはかなり頑張ってるきがするので興味があります.

つち★つち★ 2006/10/23 23:30 DBをPentium4でやっておられるとのことですが、アクセスのレスポンスは悪くありませんか?
それと、そのアクセス数の規模から、DBにXeonクラスDualのマシンを3台ぐらいでさばけそうな気がするのですが、やはり同じマシンを用意することによる故障時の置き換えなどを優先しているのですか?
場合によってはDBに使うP4のマシンの数ぐらいあれば、Xeonクラスを利用した場合、Xeonの方が安くなるケースはありませんか?