画像配信の負荷分散も比較的簡単?(その1)
で静的な配信サーバに関することが述べられている.
naoyaさんが公開されてるInside Hatena Bookmark's Backend の資料などを読むと、mod_perlなサーバーやMySQLサーバーの選び方の参考になったりするわけですが、世の中を見渡してみても、静的コンテンツ(画像とか)を配信するサーバーの指南書らしきものはなかなか見あたりませんでした。
なので、経験を元に書いてみることにします。
ということらしい.書いてあることはすべて同意だけど,
つい3ヶ月くらい前まで
- 平均15k×1万URL×50億httpアクセス/day
- 平均4KByte×100万URL×3億HTTPアクセス/day
な画像サーバと某所で向き合ってたため,ちょっとは役に立てるかもしれないと思ったので,私の経験を書いてみようと思う.
のつづきと思ってもらえるとありがたい.
最近はそうでもないが,1年くらい前あちこちのサイトの画像配信はとても遅かった(あえてどこのとはいわないが).2chとか見ると「お金をケチってサーバ足してないから」とかいう意見もあるが、たいていの意見は間違ってる.
この理由はたった一つ!システムのアーキテクチャが参加人数やアクセスが大規模になったときに耐えられる出来じゃなかったからだ.この場合いくらサーバを足してもお金の無駄で、根本的な解決はシステムのアーキテクチャを変えるしかない。
今回は某サイトがとっている/いたであろうアーキテクチャとその問題点、そしてどう解決してきたか,そして本来どうすべきかを論じようと思う*1.
本題に入る前に待ち行列における簡単なクイズを出したい。
「ATMが1台しかなくっていつ行っても50人並んでるATMコーナがあったとする.ここで新たにATMを1台足すと行列の人数はどうなるでしょう?」
答えは15分後!
...
...
...
も待ってられないので、もう答え書いちゃうけど、答えは0人です.
解説するとATMコーナに常に50人いるということはATMコーナに訪れる人と出て行く人はちょうどつりあってるということになる。ここでATMを1台足すと訪れる人数より出て行く人数が増えるので、待っている行列が少しずつ減っていく。よって最終的には待ち行列は0人になる。
意外なことにこの簡単なクイズすらわかってない人が多いので驚く.私の元部下や同僚に聞いてもほぼ全滅だったので、これはあまり感覚的に理解されてない事実なんだろうなぁと思う(たいていの人は半分の25人になると答える).
待ち行列理論で一番最初に習うリトルの公式の教えるところはすごく簡単で、
1. 単位時間のATMの処理人数 > 人間の到着数の場合.
これは処理が追いついてないってことなので,待ち行列はどんどん増える.
→最終的にめちゃくちゃ遅くなる
2. 単位時間のATMの処理人数 < 人間の到着数
1と逆なので待ち行列はどんどんなくなって最終的には0になる.
3. ただ一時的なバッファは必要なので、それに関してはリトルの公式
平均待ち行列数= 平均到着率×平均待ち時間
で決定される.
というものだ.これを平均到着間隔だとか処理時間だとかややこしい単語でくるんだ言い方をしてるだけで日常の言葉に直すとこんな単純なことを言っていることになる.
*1:先に言っておくが,これはあくまである体験から得た知識から想像で言ってることで,各サイトの実態を知って言ってるわけではない.へんな誤解されちゃうのがいやなので、念のため