はてなのDB運用キター! | 闇プロジェクト::zoe

はてなのDB運用キター!

DBMagazine 4月号にて「数十台のMySQLサーバーで月間2億ページビューを支える「はてな」のDB運用の裏側すべて見せます!」として、はてなの伊藤さんの記事が!!

闇プロジェクトをやる上で課題である、システム構成の設計ですごーく勉強になりました!

isiもzoeもインフラとかシステム構成付近にあまり経験がないので、ネットサービスを立ち上げるときサーバどうするよ?というのが大きな問題で、是非ともはてなの構成が知りたかったので今日早速帰りに雑誌購入して帰り道の電車で一生懸命読みました(w

■リバースプロキシによるトラフィック分散
1つのリバースプロキシがリクエストの入り口となって、トラフィック分散して、複数あるwebサーバへリクエストを渡す。
なるほど~。分散の方法はどうしてるんでしょう??ランダムかなぁ。

■mysqlをレプリケーションする
1つのマスタから、複数のレプリカを作る。各々のテーブルは別サーバに置く。
マスタ:更新処理はマスタのみ。
レプリカ:参照のみ。はてなの大半のリクエストは参照。

■ストレージエンジンは?
マスタ:InnoDB
レプリカ:参照なのでMyISAM

■テーブルロックをなるべく回避
書き込みが頻発するテーブルをなるべく作らない
書き込みが頻発するテーブルと結合しないといけないテーブルを作らない

がちがちに正規化しないようにするのでしょうかね。
セッション情報とかを1つのテーブルに格納しないようにして、負荷分散すると。

■テーブルの結合をしない
別サーバの別DBのテーブル同士を1つのsqlで取れない。
いっそのこと2回sqlを投げたほうが速い。

これよりも
select
 b.name
from
 tbl1 a,
 tbl2 b
where
 a.id = '0001'
 and a.key = b.key;


こっちのがイイ
select
 a.key
from
 tbl1 a
where
 a.id = '0001';

select
 b.name
from
 tbl2 b
where
 b.key = [上のa.key];


■レプリカはメモリ上に全データを展開
なんとレプリカのリクエストから参照されるテーブルはすべてメモリに展開するらしいです!すげ~。
で、テーブルメモリに乗らなくなってきたらそのテーブルを分割するのだそう。
う~~。どうやってテーブルを分割するんだろう。分割できるようにテーブル内容を設計するにはどうしたらいいんかなぁ。。年月日でテーブルを分けるのかなぁ。

■オブジェクトは全部DBで管理する
画像、xmlとかをNFSを使わずDBに入れて使用


この他にも色々とほんとに楽しく勉強させて頂きました。
naoyaさん素敵すぎます!