Facebookの環境

 キーノートにおいて、Facebookの環境は以下のようになっていると発表された。

  • アクティブユーザー数…7,000万人
  • ユーザー数の増加率…多いときで4日で100万人くらいのペース
  • Webサーバ台数…1万台
  • memcachedサーバ台数…805台
  • MySQLサーバ台数…1,800台(マスター/スレーブ各900台ずつ)
  • Webサーバへのリクエスト量…毎秒2,000万回
  • memcachedのヒット率…95%
  • MySQLサーバへのSQL文発行量…毎秒50万回
  • memcachedのメモリ搭載量…15TB
  • MySQLサーバのメモリ搭載量…25TB
  • MySQLのバージョン…5.0.44 Enterpriseをベースに改変(後述)

ユーザー数や台数、クエリ量、メモリ量などは桁違いに多いのがわかる。memcachedのヒット率95%や、memcachedとMySQLサーバの台数/メモリ搭載量の比率など、参考になる数値も多い。

大規模環境のアーキテクチャ

Facebookのアーキテクチャの話に入る前に、前提知識として、MySQLやキャッシュサーバ(memcached)が、一般的にどのように使われているかを簡単に紹介しよう。この構成は日本でもよく使われている。

アプリケーションの規模が大きくなるに従って、1台のMySQLサーバでは処理が追いつかなくなるケースが出てくる。処理が追いつかなくなる原因としては、大きく分けて以下の2つ(およびその混合)が挙げられる。

  • SQL文の実行頻度が多いこと(多くの場合、CPUネックになる)
  • データ量が多いこと(多くの場合、ディスクネックになる)

読み込みが多い場合は、「スレーブの追加」や後述の「キャッシュサーバ」の追加によって、本体のMySQLサーバ(マスター)への負荷を軽減できる。一方で書き込みが多い場合やデータ量が多い場合は、マスター1台ではディスクI/Oネックになって、効率的に処理を行なえない。そこで「アプリケーションパーティショニング(Sharding)」方式によって、複数台のマスターを用意し、大量のデータと書き込み要求を分散させる。多くの大規模環境では、これらを組み合わせた形を取っている。

アプリケーションパーティショニングがうまくいく(リニアにスケールする)かどうかは、アプリケーションがどのように作られているかに大きく依存する。多くの場合、機能別に分けたり、ユーザーごとに分けたりするが、大きな副作用としてジョインがやりづらくなるという点がある。ジョインを使えばずっと効率良く書けるクエリも、アプリケーション側で処理しなければならなくなるので非効率になる。そのため、できるだけ効率が良くなるようなテーブル設計なども重要なポイントになってくる。