John Engates氏(rackspace社のCTO)がMySQLカンファレンス(2007)
で発表したプレゼン

The 7 Stages of Scaling Web Applications: Strategies for Architects

(Webアプリスケーリングの7つのステージ-アーキテクチャー戦略)が面白かったので簡単に訳してみました。

ステージ1-The Beginning 始まり

・古典的2層アーキテクチャー
Firewall    1台
ロードバランサ 1台
Webサーバ    2台
DBサーバ    1台(内蔵ディスク)
・単純な仕組み
・多くの機能を速く実現する
・冗長性なし
・低い運用コスト

ステージ2-More of the same, just bigger 少し拡大

・ビジネスがうまく行き始める(まだリスクは低い)
・Firewallとロードバランサを冗長化のために一台づつ追加
・パフォーマンスのためにWebサーバを何台か追加
・DBサーバを少し高性能機にスケールアップ
・DBサーバをチューニング
・DBサーバを冗長化
・DBサーバのストレージをSANDASに置き換え
・アプリケーションもまだまだ単純

ステージ3-The Pain Begins 苦悩が始まる

・宣伝がヒットした!(トラフィックが指数関数的に急増!)
・チューニングだけでは耐えきれない
・Webサーバをどんどん追加=>コンテンツ管理が大変になって来た
・DBサーバ1台では、もう耐えられない
・DBサーバを読込専用と更新専用にとりあえず分離
(でも更新用は一台だけ 読込用は複数台でロードバランス)
・レプリケーションでデータを同期
・アプリケーションの見直しが必要になってきた

ステージ4-The Pain Intensifies 苦悩が深まる

・レプリケーションだけでは解決不能
更新用が一台だけでは耐えられない
レプリケーションも負荷が高すぎ
・データベースのパーティショニング(分割)を検討
機能毎にDBサーバを用意する
・コンテンツ共有のために共有ディスクを考え始める
・アプリケーションとDBのアーキテクチャーの根本的な再検討が必要
・開発チームはそんなのしたことないし

ステージ5-This Really Hurts! もうダメ!

・パニックが始まる。こんなこと前にだれかやってなかった?
アプリとビジネスモデル全体の再考
どうしてスケーラビリティを考慮して設計しなかったのか・・・後悔
・機能別のパーティショニングだけじゃだめ? なんか他に無い?
ユーザ名やユーザIDでパーティショニング?
ユーザ別のクラスタを作成
・各ユーザ別クラスタで全機能別を実行可能に!
・どのクラスターに属しているかを判断するのにマスタDBを使用

ステージ6-Getting (a little) less painful だいたい落ち着いて来た

・スケーラブルなアプリケーションとDBのアーキテクチャ
・パフォーマンスもなんとかなって来た
・新しい機能が追加可能に
・コードの最適化も続けている
・成長は続いているが管理可能な状態

ステージ7-Entering the unknown… 未知の領域へ

・さらなるボトルネックはどこにあるのか?
Firewallか? ローバランサか?
ネットワーク?
ストレージ?
ユーザ接続? プロセス?
バックアップ、リカバリ?
・すべての卵をおなじかごに入れる?
一カ所のデータセンター
データのシングルインスタンス
データのレプリケーションやロードバランスの難しさ

Good Practices グッドプラクティス

・判りきったことを繰り返すな。
・シンプルに考えよう!
物事は可能な限り単純化されるべきであり、ただ単純なだけでは不十分である。-アインシュタイン
・すべてを「水平」に考えよう! 「垂直」ではなく・・・
How many対how fast
・stateless(ステートレス)で考えよう!
・開発者をインフラチームに参加させよう
・トラブルシューティングを楽にするために
サービスを独立させる
一度にたくさん変更しない

More good practices… さらにグッドプラクティス

・すべての卵をおなじかごに入れるのを避ける
・必要以上の最適化に時間を費やさない
正しいアーキテクチャー、頻繁に調整、最適化はその後で
・適切な負荷テストでスケーラビリティをテストしよう
必要と思う基準を押さえておくこと
・適切な場所とタイミングでキャッシュを使おう
・メモリーと64bitアーキテクチャーがとても助けになる
・「機能の多さ」と「パフォーマンス/スケーラビリティ」を天秤にかけよう
つまり「あったらよいな・・」対「なきゃ絶対ダメ!」を区別すること