ビッグプロジェクトアーキテクチャ:Facebook 
      
        
        
        
      
    
      
        
        
        
      
      Facebookが動作するレベルでは、Webサイトを整理するための従来のアプローチはまったく機能しないか、少なくとも適切なパフォーマンスを提供しません。 プロジェクトの大規模な出席は、5億人近くのアクティブユーザーでサイトのパフォーマンスを維持する必要があるため、Facebookのエンジニアに挑戦しました。 この記事では、これを可能にしたソフトウェアとテクニックについて説明します。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
     タスク 
      
        
        
        
      
    -   Facebookの月間再生回数は約570億回(Google Ad Plannerによる) 
-  他のすべての画像共有サービス(Flickrなどのサイトを含む)を合わせたよりも多くの写真がFacebookにアップロードされます 
-  毎月30億枚以上の写真がFacebookサーバーにアップロードされています。 
-   Facebookサーバーは、毎秒約120万枚の写真をアップロードします(Facebookコンテンツ配信ネットワークから送信された写真を除く) 
-  毎月、ユーザーは250億を超える情報(ステータスの更新、解説など)を交換します 
-   2010年5月現在、Facebookプロジェクトには30,000を超えるオンラインサーバーがありました 
  Facebookソフトウェア 
      
        
        
        
      
     いくつかの点で、FacebookはまだLAMPスタックで実行されていますが、プロジェクトの規模に応じて、他の多くの要素とサービスを導入する必要がありました。 既存のものへの変更と同様。 例: 
      
        
        
        
      
    
      
        
        
        
      
    -   Facebookは引き続きPHPを使用しますが、実行前にスクリプトがプロセッサのネイティブコードにコンパイルされるため、作業が高速化されます 
-   FacebookサーバーはLinuxで実行されますが、Linuxコードは最適化されています(主にネットワーク部分) 
-   FacebookはMySQLを使用しますが、主にキーバリューストアとして使用します。  (Memcachedレベルの反対側で)最適化を実行する方がはるかに簡単なので、すべてのデータ接続とビジネスロジックはスクリプトレベルに移動します。 
     プロジェクトには、ゼロから作成されたシステムがあります。 たとえば、Haystackは、写真の保存に使用される非常にスケーラブルなオブジェクトストレージです。  Scribeは、Facebook全体のロギングを提供する別のシステムの例です。 
      
        
        
        
      
    
      
        
        
        
      
     だから、まず最初に。 
      
        
        
        
      
      Memcached 
      
        
        
        
      
      Memcachedは、インターネット上で最も広く知られているプロジェクトの1つです。 その分散情報キャッシングシステムは、WebサーバーとMySQLの間のキャッシングレイヤーとして使用されます(データベースへのアクセスが比較的遅いため)。 年が経過し、FacebookはMemcachedコードと関連ソフトウェアに膨大な数の変更を加えました(たとえば、ネットワークサブシステムの最適化)。 
      
        
        
        
      
      Facebookには何千ものMemcachedサーバーがあり、常に数十テラバイトのキャッシュデータがあります。 これはおそらく、Memcachedサーバーの世界最大の配列です。 
      
        
        
        
      
    
      
        
        
        
      
      HipHop for PHP 
      
        
        
        
      
      PHPはスクリプト言語であるため、サーバーで実行されるネイティブプロセッサコードと比較すると、かなり遅いです。  HipHopは、PHPスクリプトをC ++ソースコードに変換します。C++ソースコードは、コンパイルされてパフォーマンスが向上します。 これは、FacebookがFacebookのほぼすべての場所で使用されているため、Facebookがより少ないサーバーからより多くを引き出すことを可能にします。 
      
        
        
        
      
     エンジニアの小さなグループ(最初は3人しかいませんでした)が18か月でHipHopを開発し、現在ではプロジェクトサーバーで動作します。 
      
        
        
        
      
    
      
        
        
        
      
     干し草の山 
      
        
        
        
      
      Haystackは、高性能な写真の保管/検索システムです(厳密に言えば、Haystackはオブジェクトの保管施設であるため、写真だけでなく任意のデータを保管できます)。 このシステムには膨大な量の作業が必要です。  Facebookには200億枚以上の写真がアップロードされており、それぞれが4つの異なる解像度で保存されているため、最終的に800億枚以上の写真が得られます。 
      
        
        
        
      
      Haystackは写真を保存できるだけでなく、非常に迅速に写真を提供できる必要があります。 前述したように、Facebookは毎秒120万枚以上の写真をアップロードしています。 この数には、Facebookコンテンツ配信システムから提供され、絶えず成長している写真は含まれていません。 
      
        
        
        
      
    
      
        
        
        
      
     ビッグパイプ 
      
        
        
        
      
      BigPipeは、Facebookが開発した動的なWebページ配信システムです。 パフォーマンスを最適化するために、セクション(ページレットと呼ばれる)で各Webページを配信するために使用されます。 
      
        
        
        
      
     たとえば、チャットウィンドウ、ニュースフィード、およびページの他の部分は個別に要求されます。 並行して受信できるため、生産性が向上し、ユーザーがWebサイトの一部が無効になっている場合や誤動作している場合でもWebサイトを使用できます。 
      
        
        
        
      
    
      
        
        
        
      
     カサンドラ 
      
        
        
        
      
      Cassandraは、フォールトトレラントな分散データウェアハウスです。 これは、NoSQLについて話すときに常に言及されるシステムの1つです。  Cassandraはオープンソースプロジェクトになり、Apache Foundationの子会社にもなりました。  Facebookでは、これを使用してInboxを検索します。 原則として、多くのプロジェクトで使用されています。 たとえば、Digg。  Pingdomプロジェクトでの使用が計画されています。 
      
        
        
        
      
    
      
        
        
        
      
     スクライブ 
      
        
        
        
      
      Scribeは便利なロギングシステムであり、一度にいくつかのことに使用されます。  Facebook全体のログを提供するように設計されており、新しいカテゴリのイベントが表示されたらすぐに追加できるようになっています(Facebookには数百ものイベントがあります)。 
      
        
        
        
      
    
      
        
        
        
      
      HadoopとHive 
      
        
        
        
      
      Hadoopは、オープンソースのmap-reduceアルゴリズムの実装であり、膨大な量のデータの計算を実行できます。  Facebookでは、これを使用してデータを分析します(ご存じのとおり、Facebookには十分なデータがあります)。  HiveはFacebookで開発されたもので、SQLクエリを使用してHadoopから情報を取得できるため、プログラマー以外の作業が容易になります。 
      
        
        
        
      
      HadoopとHiveはどちらもオープンソースであり、Apache Foundationの支援の下で開発されています。 これらは他の多くのプロジェクトで使用されています。 たとえば、YahooおよびTwitter。 
      
        
        
        
      
    
      
        
        
        
      
      rif約 
      
        
        
        
      
      Facebookは、システムのさまざまなコンポーネントでさまざまなプログラミング言語を使用しています。  PHPはフロントエンドとして使用され、チャット用のErlang、JavaおよびC ++もアイドル状態のままではありません。  Thriftは、システムのすべての部分を単一の全体に接続し、相互に通信できるようにする言語間フレームワークです。  Thriftはオープンソースプロジェクトとして開発されており、すでにいくつかの他のプログラミング言語のサポートを追加しています。 
      
        
        
        
      
    
      
        
        
        
      
     ワニス 
      
        
        
        
      
      Varnishは、ロードバランサーおよびコンテンツキャッシュとして機能するHTTPアクセラレーターであり、高速で配信できます。  FacebookはVarnishを使用して写真とプロフィール写真を配信し、1日に何十億ものリクエストに耐えます。  Facebook Varnishが使用するすべてのものと同様-オープンソースソフトウェア 
      
        
        
        
      
    
      
        
        
        
      
     他の何か 
      
        
        
        
      
      Facebookが負荷を保持できるソフトウェアシステムについて説明しました。 しかし、このような大規模なシステムの管理は困難な作業です。 したがって、プロジェクトが安定して動作するようにする別のことをお伝えします。 
      
        
        
        
      
    
      
        
        
        
      
     ステップリリースと新機能の暗黙的なアクティブ化 
      
        
        
        
      
      FacebookはGateKeeperと呼ばれるシステムを使用します。これにより、システムのソースコードのさまざまなバージョンを使用してさまざまなユーザーにサービスを提供できます。 これにより、段階的にリリースを実行したり、Facebookの従業員専用の一部の機能をアクティブにしたりできます。 
      
        
        
        
      
     また、GateKeeperを使用すると、Facebookは、ストレステストや動作の遅いシステムコンポーネントの特定など、新しい機能を暗黙的にアクティブにすることができます。 暗黙的なアクティベーションには、いくつかの機能が含まれていますが、ユーザーインターフェイスには表示されません。 通常、暗黙的なアクティベーションは、ユーザーに新しい機会が提供される2週間前に実行されます。 
      
        
        
        
      
    
      
        
        
        
      
     システム性能試験 
      
        
        
        
      
      Facebookはシステムのパフォーマンスを注意深く監視し、興味深いことに、システム内の各PHP機能のパフォーマンスを監視します。 これはXHProfを使用して提供されます。 
      
        
        
        
      
    
      
        
        
        
      
     機能の部分的なシャットダウン 
      
        
        
        
      
     プロジェクトの動作が遅くなった場合は、主要なシステムコンポーネントのパフォーマンスを向上させるために、いくつかの機能を(十分な数から)無効にすることができます。 
      
        
        
        
      
    
      
        
        
        
      
     私たちが言っていないこと 
      
        
        
        
      
     この記事ではFacebookのハードウェアについては触れませんでしたが、もちろんこれはスケーラブルなプロジェクトには十分です。 たとえば、Facebookはコンテンツ配信システムを使用して静的要素を配信します。 もちろん、オレゴン州には、さらに多くのサーバーを導入してスケーラビリティを高めるための大規模なデータセンターがまだあります。 
      
        
        
        
      
     特に、多くの異なる種類のソフトウェアが動作しています。 しかし、プロジェクトに関係するいくつかの興味深いソリューションについてお話できたようです。 
      
        
        
        
      
      Facebookはオープンソースプロジェクトが大好き 
      
        
        
        
      
      Facebookがどのようにオープンソースプロジェクトを愛しているか、または単に「オープンソースプロジェクトを愛している」と言わなかったら、この記事は完成しなかったでしょう。 
      
        
        
        
      
      Facebookは、Linux、Memcached、MySQL、Hadoopなどのプロジェクトの開発に関与しているだけでなく、内部開発をオープンソースソフトウェアとしてリリースしています。 たとえば、HipHop、Cassandra、Thrift、Scribe。  Facebookは、FriendFeedを作成したチームが開発した高性能フレームワークであるTornadoプロジェクトも開始しました(このプロジェクトは2009年8月にFacebookによって買収されました)。  Facebookが参加しているプロジェクトのリストは、 
このページにあります 。 
      
        
        
        
      
    
      
        
        
        
      
     さらに多くの問題 
      
        
        
        
      
      Facebookはとてつもなく成長しています。 ユーザーベースはほぼ指数関数的に成長しており、5億人のアクティブユーザーに近づいており、年末に何が起こるかを知っています。  6か月ごとにほぼ1億人のユーザーが増加しています。 
      
        
        
        
      
      Facebookには特別な「成長」チームもあり、プロジェクトの対象者を常に拡大しようとしています。 
      
        
        
        
      
     継続的な成長は、Facebookが検索、ビュー、アップロードされた画像などの数の増加に伴い、さまざまなパフォーマンスの課題に直面することを意味します。 しかし、これはサービスの日常業務の一部です。  Facebookのエンジニアは、プロジェクトのスケーラビリティを向上させる新しい方法を模索します(これは単にサーバーを追加するだけではありません)。 たとえば、Facebookの写真保管システムは、サイトの成長に数回対応していました。 
      
        
        
        
      
      Facebookのエンジニアが次に直面するものを見てみましょう。 非常に興味深い何かでそれを主張することができます。 最終的には、ほとんどの国の居住者よりも多くのユーザーがいるサイトで、彼らは夢にしか見られない規模のプロジェクトに取り組んでいます。 プロジェクトを扱っているときは、創造的に考える方が良いでしょう。 
      
        
        
        
      
    
      
        
        
        
      
     出典: 
Facebook Engineer Presentationsおよび
Facebook Engineer Blog