概要
この部分は、コア原理、利点および増分更新の例を使用して、スクリプトのElasticsearch 6.3.1バージョン(また、部分的な更新として知られている部分更新)増分更新を記述する。
インクリメンタル更新プロセスと原則
寸評
我々は以前、単純な増分構文、簡単な審査要求の例を紹介しています:
POST /music/children/1/_update
{
"doc": {
"length": "76"
}
}
次のようにクライアントからのElasticsearch、アプリケーションの要求プロセスの基本的な整合性に一般的です。
- クライアント最初を開始を編集するユーザーのために、フロントページに表示する文書情報を取得するための要求をGET。
- 編集へのユーザーデータの後、[送信]をクリックします。
- バックグラウンドデータ処理システムは変更され、完全な文書パケットを組み立てました。
- PUTリクエストは、ES、完全に置き換えるの量に送られます。
- ES古い文書は、新しいドキュメントを再作成後、削除済みとしてマークされ、。
Elasticsearch文書は不変モードに基づいて設計され、すべてのドキュメントの更新は、実際には、新しい文書を作成し、その後、古い文書が削除されたものとして、増分更新も例外ではありません、ただ、新しいの統合を文書データの全額をGETマークされていますドキュメント、完全にミリ秒シャード、フルに完了するには、この3ステップの操作古いドキュメントを交換します。
断片間の増分更新対話
増分更新手順書は以下のとおりです。
- Javaクライアントは、ESクラスタを更新する要求を送信します。
- コーディネートノードは、文書の要求を受けたが、現在のノード上で、それがP0は、ノード2のシャードのノードに要求を転送しません。
- 他のスレッドは、文書が変更された場合、ノード2の文書を、文書を取得_source下JSONを変更し、再インデックスするために、その矛盾のバージョンが存在する、再びあきらめて再試行回数を超えた後、最大再試行retry_on_conflict回、文書を更新しようとします。
- ステップ3が成功した場合、ノード2は、転送文書の完全な内容は、Node1および非同期レプリカはノード3の再インデックスをシャード。すべてのレプリカリターン成功したら、ノード2は、コーディネートノードに成功メッセージを返します。
- クライアントへの更新成功メッセージにコーディネートノードの応答、プライマリー断片とレプリカクラスタESでこの時間は更新されていシャード。
それに注意してください。
- レプリカのシャードを同期させるためのプライマリー断片の文書データの髪は、その後、順番が混乱の文書内容の誤りにつながる場合は、非同期リクエストは整然とした、増分情報を保証するものではありませんので、送信は、完全な情報文書です。
- Javaクライアントにコーディネートノード応答が成功している限り、それはレプリカへのプライマリー断片の全てが、更新操作を完了したシャードという意味として、その後、ESクラスタ内のデータは、一貫性の更新が安全です。
- retry_on_conflict = 5:再試行戦略、ESは、文書データを再取得し、最新のバージョン番号、更新の成功は、失敗し、再試行してください、あなたは、5として最大数を設定することができます
- 再試行戦略は少しやって、最終的な結果は、ライン上で、実行する必要があり、誰の実装後に無関係なシーケンスは、そのようなカウント動作を操作するインクリメンタルシーンで、より適しています。このような確かに在庫の変化、口座残高が変化すると、指定された値に直接更新、等のいくつかの他のシナリオは、使用リトライポリシーにすることはできませんが、同様に、加算及び減算に変換することができる場合に論理「現在の数に直接単一の更新インベントリ在庫数=在庫数は - 程度のオーダーの独立した商品の注文数」、更新口座残高プラスまたはマイナスの変化量なので、あなたがある程度できることが、順番に変換、対立を再試行し、問題解決の戦略を使用する方が便利なことができます。
増分更新の利点
- クエリのすべての変更、及びライトバック操作は、パフォーマンスを向上させるために、ネットワークデータ伝送オーバーヘッド(2)還元、ES内に完了されています。
- あるいは時間間隔(秒以上)の総量、クエリと比較さ(ミリ秒)より短い間隔を変更し、効果的に同時実行の競合を減少させることができます。
増分更新を達成するためのスクリプトを使用
Elasticsearchは、バージョン6.0以降、より柔軟なロジックを実現するためのスクリプトの使用をサポートし、デフォルトのスクリプトのサポートは無痛でなく、一定の確率は、最終的に完全なGCの問題をリードし、メモリのNO放出がないことがあるので、もはやGroovyの、Groovyのコンパイラがサポートしています。
背景として、当社の場合、英語の歌、このような文書データを仮定:
{
"_index": "music",
"_type": "children",
"_id": "2",
"_version": 6,
"found": true,
"_source": {
"name": "wake me, shark me",
"content": "don't let me sleep too late, gonna get up brightly early in the morning",
"language": "english",
"length": "55",
"likes": 0
}
}
内蔵スクリプティング
さて、このような需要があります:曲を再生するたびに誰かをクリックすると、ドキュメント上のフィールドを好きに1を加算され、我々は達成するために簡単なスクリプトを使用することができます。
POST /music/children/2/_update
{
"script" : "ctx._source.likes++"
}
文書を照会するために、再度実行した後、一つになるのが好きなことが判明、各々が一回、同類は、一つ、期待に沿った結果だけインクリメントされます。
外部脚本
ただ、増加の需要にいくつかの変更を行い、サポートのバッチ更新は、渡されたパラメータが増えているから、スクリプトは、通話に使用、ESに保存した場合、事前にコンパイルの方法によって導入することができ、ボリュームを再生します。
スクリプトを作成します。
POST _scripts/music-likes
{
"script": {
"lang": "painless",
"source": "ctx._source.likes += params.new_likes"
}
}
呼び出すときに音楽好きのためのスクリプトIDは、パラメータnew_likesは、渡すことができます。
スクリプトを使用します
我々は、更新以下の要求を実行するときは、作成したスクリプトを呼び出すことができます
POST /music/children/2/_update
{
"script": {
"id": "music-likes",
"params": {
"new_likes": 2
}
}
}
スクリプトの音楽好きは、のparamsはnew_likes、情報の実装のためのパラメータ内で、文言を修正して、文書を表示する際に、IDが作成され、あなたは値によって渡された累積好き場、期待に沿った結果の値を見ることができます。
ビュースクリプト
コマンド:
GET _scripts/music-likes
スラッシュID以下、そのスクリプトパラメータ
削除スクリプト
コマンド:
DELETE _scripts/music-likes
スラッシュID以下、そのスクリプトパラメータ
スクリプトについて
- それは新しいスクリプトを検出したときESは、スクリプトは、コンパイル、実行し、キャッシュに、コンパイル時間がかかり、それを格納します。
- スクリプトをパラメータ化することができ、スクリプトの再利用性を向上させるためにハードコーディングされていません。
- クマはES、ES直接報告circuit_breaking_exceptionエラーの範囲を超えて、デフォルトの範囲は15 /分である場合には、あまりにも多くのスクリプトは、短い時間をコンパイルしています。
- スクリプトキャッシュ100デフォルトなしデフォルトの有効期限は、各スクリプトの文字、最大65535バイト、自己設定をしたいが、あなたはscript.cache.expire、script.cache.max_sizeとscript.max_size_in_bytesパラメータを変更することができます。
要するに、スクリプトの再利用性を向上させます。
文法アップサート
念のように、実装は、カウンタプレイの機能は、カウンタが別々に格納されている場合、現在のカウンタが新曲の棚があるかもしれません、コンテンツと一緒に保存されますが、存在しない可能性がカウンター文書が、しようとする試みでありますそれが更新document_missing_exceptionの間違ったことを報告され、我々は構文アップサート、このシナリオを使用する必要がありません。
POST /music/children/3/_update
{
"script" : "ctx._source.likes++",
"upsert": {
"likes": 0
}
}
レコードID 3は、存在しない最初の要求である場合、実行JSONの内部に、新しい初期設定ファイル、3のIDアップサート含有量は、0である好き、第2の要求は、ドキュメントが既に存在する場合、スクリプト実行します更新スクリプトは、インクリメントが好き。
概要
Benpianは、単にプロセスと増分アップデートの原理を説明し、実装ケースにスクリプトを導入し、簡単なカウントシーンのために、単純な比較を行うため、交換の全額と、スクリプトはの公式ホームページを参照して、非常に豊かな内容を備えて実装することができます無痛紹介。
Javaの並行性の高いフォーカス、分散アーキテクチャ、より乾燥品シェアの技術と経験、公共の数にしてください注意を払う:Javaのアーキテクチャコミュニティ