どのようにElasticsearchはミリ秒単位で返さ億のデータクエリを実行しますか?

インタビューは、このような顔の質問が発生した場合:大量のデータの場合はES(レベルの十億)クエリ効率を向上させる方法は?


この問題は、はっきり、どのようなので、あなたが実際にESを使用していないことを確認することですか?実際には、ESのパフォーマンスは、あなたが考えるほど良くありません。

データの数百万があるときに何度も大量のデータは、特に、あなたはピットの父、5〜10秒で検索を実行する方法、無知見つけることを余儀なくされます。

最初のタイムサーチは、5〜10秒ですが、戻って速く、百、おそらく数ミリ秒に。

あなたは初めて、各ユーザーのアクセスが遅くなり、非常に無知で、より多くのカードそれ?あなたもESを再生し、あるいは単に子どもたちと自分のデモをプレイしていないのであれば、あなたが本当にESにあまりにもよく果たしていることを示し、この質問は簡単無知な力を尋ねましたか?

正直に言うと、ESのパフォーマンスの最適化は特効薬ではありません。それは何を意味するのでしょうか?ちょうどあなたが全能のパフォーマンスが低下シーンのすべてを扱うことができ、容易にパラメータを調整するために楽しみにしていません。

たぶん、あなたはパラメータを変更したり、構文を調整するいくつかのシーンは、あなたが得ることができますが、間違いではないすべてのシーンでは、このようなものです。

パフォーマンスの最適化キラー:ファイルシステムキャッシュ

ESあなたは、クエリ時間を実際に行ってディスクファイルに書き込まれたデータを書き込むために行く、オペレーティングシステムのディスク・ファイルは、自動的に内部のファイルシステムキャッシュにデータがキャッシュされます。

ESの検索エンジンは、パフォーマンス、あなたがファイルシステムキャッシュに多くのメモリを与えれば、メモリはIDXセグメントファイルのインデックスデータファイルのすべてを収容することができますので、あなたは基本的に行くメモリ上で検索したときにしようと、基本となるファイルシステムキャッシュに大きく依存していますそれは非常に高くなります。

どのくらいのパフォーマンスのギャップができますか?私たちの前のテストや圧力テストの多くは、一般的な肯定秒で検索パフォーマンスを行くために、ディスクは間違いなくセカンドレベル、1秒、5秒、10秒の場合。

それはファイルシステムキャッシュを行くことである場合でも、純粋なメモリ、大きさの順に行くよりも、その後、一般的なディスクパフォ​​ーマンスを取って、基本的には数ミリ秒から数百ミリ秒の範囲で、ミリ秒。

ここでは実際のケースです: ESノードは3台のマシンを持っている会社は、各マシンがメモリ64Gの多くのように見える、合計メモリは64 * 3 = 192Gです。

ES JVMヒープに各マシンは、次いで、残りのファイルシステムキャッシュのみ32G、ファイルシステムキャッシュへの総クラスタである各マシンに残され32G、あるメモリの32 * 3 = 96Gです。

この時点で、ディスク上のインデックス全体のデータファイルは、3台のマシンの1Tのディスク容量の合計を取る上で、ESは、データ1Tの量は、その後、データの量は、各マシンは300Gです。このような性能大丈夫?

ファイルシステムキャッシュメモリのみ100G、データメモリの10分の1を解放することができ、他の人がディスクにあり、その後、あなたが検索操作を実行する操作のほとんどは、ディスクを取っている、パフォーマンスは確かに悪いです。

最終的に、あなたはES良好なパフォーマンスをさせる必要があり、最良の環境の下で、あなたのマシンのメモリであり、あなたはデータの総量の少なくとも半分を収めることができます。

左のファイルシステムのキャッシュメモリが100Gである場合に最良の環境下では、本番環境での私たち自身の実際の経験に基づいて、それは、あなたは意志、あなたはそれらのインデックス検索を使用するデータのES少量でのみ存在さ100G内のインデックスデータコントロール。

この場合は、ほとんどすべてのデータがメモリを検索するために行く、パフォーマンスは1秒よりも一般的に小さい、非常に高いです。

ID、名前、年齢.... 30フィールド:たとえば、あなたが今、データの1行を持っています。しかし、今あなたが検索し、あなただけのID、名前、年齢三つのフィールドで検索する必要があります。

データのあなたの愚かな行はすべてのフィールドでESに書かれている場合、それは検索に使用されていないデータの90%につながると述べました。

結果は、単にファイルシステムキャッシュESマシン上のスペースを占有し、データシートのデータの量が多いほど、それはより少ないエネルギーファイルシステムCahceキャッシュされたデータにつながります。

実際には、単にいくつかのフィールドは、ESを取得するために使用されるように、例えば、ESのID、名前、年齢3つのフィールドが書かれていることができ、書き込み。

そして、あなたは、データは、MySQL / HBaseのが存在する他のフィールドを置くことができ、我々は一般的にES + HBaseのようなフレームワークを使用することをお勧めします。

HBaseのはつまり、HBaseのは、膨大な量のデータを書き込むことができますが、複雑な検索をしない、いくつかの非常に簡単な操作をその上にIDまたは範囲に基づいて、このようなクエリを実行する、大規模なデータのオンラインストレージへの適用を特徴としています。

名前と年齢がESから検索し、その結果は、ID DOC 20を取得する可能性がありますし、その後、チェックアウトするドキュメントに応じて先端に戻るには、各DOC IDに対応するHBaseの完全なクエリデータにIDを行きます。

ESデータ書き込み好ましく以下、またはESファイルシステムキャッシュのメモリ容量よりもわずかに大きいです。

そして、あなたはその後、ESがクエリでのHBaseに返されたIDの下で、20msのを過ごすかもしれないESから検索し、検索データは20も30ミリ秒を費やすことがあります。

あなたは、パフォーマンスが高くなりますことがあり、今、各クエリは、5〜10秒であるだろう、オリジナル、1TデータはES入れてプレイしてもよい、それぞれのお問い合わせは50ミリ秒です。

データ予熱

あなたは上記のスキームは、クラスタ内の各マシンに書き込まれるデータの量に応じてそれを行う場合でも、言うESまたは超えた場合はファイルシステムのキャッシュが倍増しました。

たとえば、あなたがマシン60Gデータを書き込み、ファイルシステムのキャッシュは30G、30Gに結果またはディスクに残ったデータを持っています。

実際には、あなたはウォームアップのデータを行うことができます。例えば、人々は通常、データの多くは、バックグラウンドで前方に早く入れてシステムを参照してください、あなたはいくつかの大きなVを置くことができ、マイクロブログを取ります。

すべての瞬間、彼らのバックオフィスシステムは、熱データを検索し、ファイルシステムキャッシュのブラシは、彼らはすぐにメモリから直接検索、およびされている場合、ホット、実際にデータを見て、ユーザの後ろに行きます。

または電気の供給者が、あなたは通常、iPhone 8などの一部の商品のほとんどを見ることができ、先にバックグラウンドデータの熱は、プログラム、自らのイニシアチブで毎分のアクセス時間を前方に置くために、ファイルシステムキャッシュのブラシが行きます。

あなたが熱い、多くの場合、誰かの訪問だと思うデータについては、それは特別な事前キャッシュ・サブシステムを行うのがベストです。

熱データは随時で、内部のファイルシステムキャッシュにデータをアクセスを進めるとしましょう。だから、誰かが訪問した次回は、パフォーマンスが大幅に向上します。

ホットとコールドの分離

ESは、小さな、非常に低い周波数の多数のデータにアクセスする単一のインデックスを作成し、その後、非常に頻繁にホットデータにアクセスするために、別のインデックスを作成しますMySQLのスプリットレベル、のようなものを行うことができます。

最高のは、データがインデックスに書き込まれ、その後、ホット予熱された後のデータを確実に別の不快指数、にデータを書き込むされ、それらがでファイルシステムのOSのキャッシュに滞在できるようにしようと寒いです寒データを徹底的に調査することはできません。アウト。

見て、あなたが6機、2つのインデックス、放冷したデータ、熱データ、各インデックス3シャードがあるとします。3発熱マシンデータのインデックスは、追加のデータは、マシン3インデックスを冷却させました。

この場合、あなたは多くの時間が、データ量が少ない。この時点で、データの総量のおそらく10%ホットデータインデックス、熱データにアクセスしている、ほとんどすべてを使用すると、データアクセス性能の熱を確保することができ、内部のファイルシステムキャッシュに残っていますそれは非常に高いです。

しかし、寒さのデータをインデックスに他にある、熱データとインデックスが同じマシンではない、私たちはお互いに何のタッチを持っていません。

誰かが風邪データを訪れる場合は、ディスク上のデータをたくさんすることができ、パフォーマンスハンデその場合には、人々の10%が風邪データ、ホットデータにアクセスする人の90%を訪問することを行く、それは問題ではありません。

ドキュメントモデルの設計

MySQLの場合、私たちはしばしば、クエリに関連付けられているいくつかの複雑なを持っています。ESで再生する方法、クエリ内のESの複雑な関係は、一般的には非常に良くないパフォーマンスで一度、使用しないようにしてください。

最高のは、協会の良いデータがESに直接書き込まれている関連付けを完了するためにJavaシステムで初めてです。検索するときは、検索のような参加に関連する検索構文のESを完了するために使用する必要はありません。

ドキュメントモデルの設計が非常に重要であり、多くの操作は、検索の際に様々な操作の複雑な混乱を実行する必要はありません。

ESはそんなに上の操作をサポートすることができ、ESの使用を考慮していない、それが作動悪い何かをします。書き込みが完了すると、あなたは本当に、可能な限り時に文書モデルの設計、操作のようなものを持っている場合。

避けるべきであるように/ネストされた/親子検索に参加するように非常に複雑な操作の一部に加えて、パフォーマンスが悪いです。

ページングパフォーマンスの最適化

ESページングは​​あまりピットであるので、なぜそれから?ページあたり10のデータであり、あなたは今、100ページで照会したい場合の例を与えるために、実際には、1000の前に各シャードに格納されたデータは、すべてのコーディネータノード上で発見されます。

あなたは5シャードを持っている場合は、5000件のデータがあり、その後、コーディネーター・ノードこれらの5000回のデータマージ処理の一部、およびそのデータの100ページの最後の10に到達します。

分散、あなたはデータの100ページの10をチェックする必要があり、各チェック2つのデータに5シャード、シャードから言うことは不可能で、最終的にコーディネータノードには右、10のデータにマージ?

あなたは、100ページ内のデータを取得するために、もう一度、最後のページにすべてのデータをチェックし、各シャードのために1000年から来た、その後、必要に応じて並べ替えられ、スクリーニングなどの操作する必要があります。

あなたは、ページをめくる各シャードのデータが返されるより、より深く、より長いコーディネータノード処理、非常にピットの父を回します。だから、ESで改ページを行い、あなたはもっともっとゆっくり、引き返すいます。

また、基本的にデータのページをチェックアウトするために5から10秒に行って、10ページまたは数十回に回し、ページングなどES、数十ミリ秒に最初の数ページで、前にこの問題が発生しました。

解決策は何ですか?深さは、ページング(デフォルトの深さのページングパフォーマンスの低下)を許可していません。連絡先のプロダクトマネージャーは、システムはあなたがとても深いページ、より深いデフォルトのターン、より悪いパフォーマンスをオンにすることはできませんと述べました。

類似した商品でのアプリの勧告は、ページによってページをドロップダウンし続けて、ページ単位で磨く、ドロップダウンブラシマイクロブロギング、マイクロブログのように、あなたは自分のインターネット検索を使用する方法については、スクロールのAPIを使用することができます。

スクロールは、すべてのデータのワンタイムスナップショットを生成するあなたを与えるし、各スライドがカーソルscroll_idによって移動され、バックフリップ、次のページを取得するには、このような次のページになる、上記以外の性能は、ページング性能が高いことを言いました多くは、基本的にはミリ秒。

しかし、唯一のものであり、これは同様のマイクロブログのプルダウンフリップの種類に適しており、シーンの任意のページにジャンプすることはできません。

つまり、あなたが最初の10ページに入ることができない、そのページ120に行き、その後、戻って58ページに、ページをバウンスすることはできません。

だから今、あなたがランダムに反転することが許可されていない多くの製品、アプリケーションは、いくつかのサイトがありますが、あなただけのページでページをめくる、プルダウンされないことができます。

スクロール初期化パラメータを指定する必要があり、ESあなたが検索のコンテキストを保存したいどのくらい言います。あなたは、ユーザーが常に数時間を有効に反転していない、またはそれがタイムアウトのために失敗する可能性があることを確認する必要があります。

スクロールAPIを使用するだけで、あなたもsearch_afterで行うことができます。アイデアsearch_after次のページを取得を支援するために、データの前のページの結果を使用することです。

明らかに、このアプローチは、あなただけのページを元に戻すことができ、あなたが自由にページをめくることができません。初期設定では、フィールドがソートフィールドとして一意の値を使用する必要があります。


終わり

個人公開番号:フペルジンアーキテクチャノート(ID:shishan100)

長押しへようこそマップはありません公共の懸念:ヒューペルジンノートのアーキテクチャ!

応答なし公共の背景情報なし、学習教材の排他的な秘密へのアクセス

フペルジンアーキテクチャノート、BATアーキテクチャの経験財布


おすすめ

転載: juejin.im/post/5cf7200df265da1b855c43ae