どうすればグーグルはそんなに速くなることができますか?


89

Googleが非常に高速にクエリを処理できるようにするテクノロジーとプログラミングの決定は何ですか?

私は何かを検索するたびに(1日に数回のうちの1つ)、1秒近くまたは1秒未満で結果を提供する方法をいつも驚かせます。これを実現するために、どのような構成とアルゴリズムを導入できますか?

補足:デスクトップアプリケーションを置いて自分のマシンで使用したとしても、おそらくGoogleの半分の速度ではないと考えるのは、圧倒的な考え方です。私が言うことを学び続けなさい。


提供されたすばらしい答えとポインタのいくつかを以下に示します。

回答:


47

レイテンシはディスクアクセスによって強制終了されます。したがって、クエリに応答するために使用されるすべてのデータがメモリに保持されていると信じることは合理的です。これは、数千のサーバーがそれぞれに多くのシャードの1つを複製することを意味します。したがって、検索のクリティカルパスが、GFS、MapReduce、BigTableなどの主要な分散システムテクノロジーにヒットする可能性はほとんどありません。これらは、クローラーの結果を大まかに処理するために使用されます。

検索の便利な点は、強い整合性のある結果や完全に最新のデータを持つ必要がないため、より最新の検索結果が利用可能になったため、Googleがクエリに応答するのを妨げられないことです。

したがって、可能なアーキテクチャは非常に単純です。フロントエンドサーバーがクエリを処理し、正規化して(ストップワードを削除するなどして)、クエリスペースのその部分を所有するレプリカのサブセットに分散します(別のアーキテクチャは、すべてのレプリカセットの1つにクエリごとにアクセスする必要があるように、Webページごとにデータをアップします。多くの場合、多くのレプリカが照会され、最も速い応答が優先されます。各レプリカには、ドキュメントへのインデックスマッピングクエリ(または個々のクエリ用語)があり、メモリ内の結果を非常にすばやく検索するために使用できます。異なるソースから異なる結果が返された場合、フロントエンドサーバーは、htmlを吐き出すときにそれらをランク付けできます。

これはおそらくGoogleが実際に行うこととはかなり異なることに注意してください。これらのシステムは、このシステムの寿命を設計しているので、奇妙な領域、奇妙なインデックス、および他の考えられる違いの中である種のファンキーなロードバランシングスキームがある可能性があります。 。



22

私が面白くないと思った1つの事実は、Googleが実際にバイオインフォマティクスによって運営されているということです(そうですね、私はbioinfだ... 説明させてください。

初期のバイオインフォマティクスでは、巨大な文字列内の小さなテキストを非常に高速に検索するという課題がありました。私たちにとって、「巨大なひも」はもちろんDNAです。多くの場合、単一のDNAではなく、異なる種/個体からのいくつかのDNAのデータベースです。小さなテキストは、タンパク質またはその遺伝的対応物である遺伝子です。計算生物学者の最初の研究のほとんどは、遺伝子間の相同性を見つけることに限定されていました。これは、既知の遺伝子との類似性に注目することにより、新たに発見された遺伝子の機能を確立するために行われます。

現在、これらのDNAストリングは非常に大きくなり、(損失!)検索は非常に効率的に実行する必要があります。したがって、文字列ルックアップの現代の理論のほとんどは、計算生物学のコンテキストで開発されました。

しかし、かなり前に、従来のテキスト検索は使い果たされていました。大きな文字列を準線形時間で検索できるようにする、つまり各文字を1つずつ確認する必要がない新しいアプローチが必要でした。これは、大きな文字列を前処理し、その上に特別なインデックスデータ構造を構築することで解決できることが発見されました。多くの異なるそのようなデータ構造が提案されてきた。それぞれに長所と短所がありますが、一定の時間で検索できるため、特に注目すべきものがあります。現在、Googleが運用している規模では、これは厳密には真実ではありません。サーバー間でのロードバランシング、前処理、およびその他の高度な処理を考慮する必要があるためです。

しかし、本質的には、いわゆるq-gramインデックスを使用すると、一定の時間で検索できます。唯一の欠点:データ構造が途方もなく大きくなる。基本的に、までを含む文字列の検索を可能にするために、Qの文字(名前)、それはそれぞれの可能な組み合わせのための一つのフィールドを持つテーブルが必要ですQのある文字(、q個のSSをアルファベットのサイズですが、たとえば36(= 26 + 10))とします。さらに、インデックス付けされた文字列の各文字位置(またはGoogleの場合は各Webサイト)ごとに1つのフィールドが必要です。

純粋なサイズを軽減するために、Googleはおそらく複数のインデックスを使用します(実際に、スペル修正などのサービスを提供するために使用します)。最上位のものは文字レベルでは機能せず、代わりに単語レベルで機能します。これによりqは減少しますが、Sが無限に大きくなるため、ハッシュと衝突テーブルを使用して無数の異なる単語に対処する必要があります。

次のレベルでは、これらのハッシュ化された単語は他のインデックスデータ構造を指し、次に、ウェブサイトを指す文字をハッシュします。

要するに、これらのq -gramインデックスデータ構造は、おそらくGoogleの検索アルゴリズムの最も中心的な部分です。残念ながら、q - gramインデックスがどのように機能するかを説明する非技術的な論文はありません。そのようなインデックスがどのように機能するかについての説明が含まれている私が知っている唯一の出版物は、悲しいことに、私の学士論文です。


4
私は5年間バイオインフォマティクスを利用しており、その後は検索エンジンを使用します。q-gramは、あなたが思っているほど重要ではありません。Googleが(非常に基本的なレベルで)行う検索の種類の基本的なデータ構造は、逆インデックスです。
SquareCog 2008年

それは間違っているようです。Googleが実行されているか、逆インデックスで実行されていました。q-gramはフレーズには役立ちますが、一般的には役立ちません
Stefan Savev

@Stefan:同じコメントがSquareCogによってすでに行われました–そして、私は反転インデックスが大きな(そしておそらくn-gramインデックスよりはるかに大きな)役割を果たすことを否定しません。私はこの1つのテクノロジーを選びました。n-gramは私のデータ構造であり、重要な洞察だと思います。Googleは実際に「検索」する必要がないため高速であり、多かれ少なかれ直接ルックアップを行うことができます。そのようなインデックスに依存します(nb:これはおそらくハッシュを介して行われますが、これはまだ n-gramインデックスです)。このインデックスもたまたま反転しているのは私の指摘に付随することです(おそらくGoogleではありませんが;-))。
Konrad Rudolph



4

最も重要な遅延の1つは、WebサーバーがクエリをWebサーバーに送信し、応答を返すことです。このレイテンシは、Googleさえ従わなければならない光の速度によって制限されます。ただし、世界中にデータセンターがあります。その結果、それらのいずれかとの平均距離は短くなります。これにより、遅延が抑えられます。もちろん、違いはミリ秒単位で測定されますが、応答が1000ミリ秒以内に到着する必要があるかどうかは重要です。



3

彼らは、インターネットのローカルコピーをカスタムファイルシステム上の何千ものPCにキャッシュしています。


ディスクベースのファイルシステムにアクセスすると、レイテンシの点で多くのコストがかかります(AmazonはこれをDynamoで発見し、回復力を犠牲にしました)。クリティカルパス上のすべてがメモリに保持されていると思います。
HenryR 2008

3

Googleは最高のものを採用します。ITの最も賢い人々の一部は、グーグルで働いています。彼らはハードウェアとエンジニアに投入する実質的に無限のお金を持っています。

彼らは彼らが実行しているタスクのために高度に最適化されたストレージメカニズムを使用しています。

彼らは地理的に配置されたサーバーファームを持っています。


3

一般的なリストでの試み(Googleの内部ツールにアクセスできるかどうかに依存しません):

  1. 要求を並列化する(たとえば、単一の要求をより小さなセットに分割する)
  2. 非同期(できるだけ非同期にする、たとえばユーザーの要求をブロックしない)
  3. メモリ /キャッシュ(ディスクI / Oは低速ですが、メモリにできるだけ多く保存してください)
  4. 事前計算事前にできる限り多くの作業を行い、ユーザーがデータ/処理を要求するのを待たないでください)
  5. フロントエンドHTMLに注意する(Yslowとその仲間を参照)



1

ハードウェア。

たくさんのハードウェア。彼らは、サーバーファームとして市販のPCの大規模なクラスターを使用しています。


「大規模」を明確にするために:数十万のサーバー。Googleの外では実際の数を知らないので、常に変化しているはずです。
セルジオアコスタ

1

TraumaPonyは正しいです。大量のサーバーと負荷分散/キャッシングのためのスマートアーキテクチャ、そして1秒未満でクエリを実行できます。ネットには、Googleサービスのアーキテクチャについて説明する記事がたくさんありました。私はあなたがグーグル経由でそれらを見つけることができると確信しています:)




0

そして、そのハードウェア能力を利用できるアルゴリズム。同様のMapReduce例えば。


MapReduceはクエリへの応答には使用されません。
MSalters 2008

MapReduceは、大規模なマシンのクラスターで実行され、非常にスケーラブルです。典型的なMapReduceの計算では、数千のマシンで何テラバイトものデータが処理されます。何百ものMapReduceプログラムが実装され、毎日1,000以上のMapReduceジョブがGoogleのクラスターで毎日実行されています
Vinko Vrsalovic '25 / 09/25

MapReduceは、クローラーデータの非同期インデックス作成にほぼ確実に使用されます。それが検索のクリティカルパス上にあったとしたら、私は非常に驚きます。MapReduceジョブを実行すると、レイテンシが本当になくなります。
HenryR 2008

ヘンリー-ルート/マップのルーティングに使用している可能性があります。しかし、はい、一般的なケースです。通常のユーザークエリに応答するためにハードコア計算を実行したくない場合。
SquareCog 2008年

0

Googleクラスターがどのように機能するかについて詳しく知りたい場合は、HDFSのこのオープンソース実装をお勧めします。

それはグーグルによるMapreduceに基づいています。


HDFSは分散ファイルシステムです。mapreduceクローンはHadoopと呼ばれ、HDFSまたはローカルファイルシステムで実行できます。
SquareCog 2008年

0
  1. 多段階のデータ保存、処理、検索

  2. 上記のタスクの効率的な分散(数千から数百のマシン)

  3. 生データと処理結果を保存するための優れたフレームワーク

  4. 結果を取得するための優れたフレームワーク

これらがどのように正確に行われるかは、質問の要約にあるすべてのリンクによって要約されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.