クラスター間検索

クラスター間検索を使用すると、1つまたは複数のリモートクラスターに対して単一の検索リクエストを実行できます。たとえば、クラスター間検索を使用して、異なるデータセンターに保存されているログデータをフィルタリングおよび分析できます。

サポートされているAPI

次のAPIはクラスター間検索をサポートしています:

  • 検索
  • 非同期検索
  • マルチ検索
  • 検索テンプレート
  • マルチ検索テンプレート
  • フィールド機能
  • Painless実行API
  • インデックス解決API
  • [プレビュー] この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。 EQL検索
  • [プレビュー] この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。 SQL検索
  • [プレビュー] この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。 ベクトルタイル検索
  • [プレビュー] この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。 ES|QL

前提条件

  • クラスター間検索にはリモートクラスターが必要です。Elasticsearch Serviceでリモートクラスターを設定するには、Elasticsearch Serviceでのリモートクラスターの構成を参照してください。自分のハードウェアでElasticsearchを実行している場合は、リモートクラスターを参照してください。
    リモートクラスターの構成がクラスター間検索をサポートしていることを確認するには、サポートされているクラスター間検索構成を参照してください。
  • 完全なクラスター間検索機能を利用するには、ローカルクラスターとリモートクラスターが同じサブスクリプションレベルである必要があります。
  • ローカルコーディネーティングノードは、remote_cluster_clientノードロールを持っている必要があります。

  • スニッフモードを使用する場合、ローカルコーディネーティングノードはリモートクラスターのシードノードおよびゲートウェイノードに接続できる必要があります。
    コーディネーティングノードとして機能できるゲートウェイノードの使用をお勧めします。シードノードはこれらのゲートウェイノードのサブセットである可能性があります。

  • プロキシモードを使用する場合、ローカルコーディネーティングノードは構成されたproxy_addressに接続できる必要があります。このアドレスのプロキシは、リモートクラスターのゲートウェイおよびコーディネーティングノードへの接続をルーティングできる必要があります。

  • クラスター間検索には、ローカルクラスターとリモートクラスターで異なるセキュリティ権限が必要です。クラスター間検索のための権限の構成およびリモートクラスターを参照してください。

クラスター間検索の例

リモートクラスターの設定

次のクラスター更新設定APIリクエストは、3つのリモートクラスターを追加します: cluster_onecluster_twocluster_three

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "cluster": {
  4. "remote": {
  5. "cluster_one": {
  6. "seeds": [
  7. "35.238.149.1:9300"
  8. ],
  9. "skip_unavailable": True
  10. },
  11. "cluster_two": {
  12. "seeds": [
  13. "35.238.149.2:9300"
  14. ],
  15. "skip_unavailable": False
  16. },
  17. "cluster_three": {
  18. "seeds": [
  19. "35.238.149.3:9300"
  20. ]
  21. }
  22. }
  23. }
  24. },
  25. )
  26. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. cluster: {
  5. remote: {
  6. cluster_one: {
  7. seeds: [
  8. '35.238.149.1:9300'
  9. ],
  10. skip_unavailable: true
  11. },
  12. cluster_two: {
  13. seeds: [
  14. '35.238.149.2:9300'
  15. ],
  16. skip_unavailable: false
  17. },
  18. cluster_three: {
  19. seeds: [
  20. '35.238.149.3:9300'
  21. ]
  22. }
  23. }
  24. }
  25. }
  26. }
  27. )
  28. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. cluster: {
  4. remote: {
  5. cluster_one: {
  6. seeds: ["35.238.149.1:9300"],
  7. skip_unavailable: true,
  8. },
  9. cluster_two: {
  10. seeds: ["35.238.149.2:9300"],
  11. skip_unavailable: false,
  12. },
  13. cluster_three: {
  14. seeds: ["35.238.149.3:9300"],
  15. },
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

コンソール

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster": {
  5. "remote": {
  6. "cluster_one": {
  7. "seeds": [
  8. "35.238.149.1:9300"
  9. ],
  10. "skip_unavailable": true
  11. },
  12. "cluster_two": {
  13. "seeds": [
  14. "35.238.149.2:9300"
  15. ],
  16. "skip_unavailable": false
  17. },
  18. "cluster_three": {
  19. "seeds": [
  20. "35.238.149.3:9300"
  21. ]
  22. }
  23. }
  24. }
  25. }
  26. }
skip_unavailablecluster_threeに設定されていないため、falseのデフォルトを使用します。詳細については、オプションのリモートクラスターセクションを参照してください。

単一のリモートクラスターを検索

検索リクエストでは、リモートクラスターのデータストリームとインデックスを<remote_cluster_name>:<target>として指定します。

次の検索APIリクエストは、単一のリモートクラスターcluster_onemy-index-000001インデックスを検索します。

Python

  1. resp = client.search(
  2. index="cluster_one:my-index-000001",
  3. size=1,
  4. query={
  5. "match": {
  6. "user.id": "kimchy"
  7. }
  8. },
  9. source=[
  10. "user.id",
  11. "message",
  12. "http.response.status_code"
  13. ],
  14. )
  15. print(resp)

Ruby

  1. response = client.search(
  2. index: 'cluster_one:my-index-000001',
  3. body: {
  4. size: 1,
  5. query: {
  6. match: {
  7. 'user.id' => 'kimchy'
  8. }
  9. },
  10. _source: [
  11. 'user.id',
  12. 'message',
  13. 'http.response.status_code'
  14. ]
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.search({
  2. index: "cluster_one:my-index-000001",
  3. size: 1,
  4. query: {
  5. match: {
  6. "user.id": "kimchy",
  7. },
  8. },
  9. _source: ["user.id", "message", "http.response.status_code"],
  10. });
  11. console.log(response);

コンソール

  1. GET /cluster_one:my-index-000001/_search
  2. {
  3. "size": 1,
  4. "query": {
  5. "match": {
  6. "user.id": "kimchy"
  7. }
  8. },
  9. "_source": ["user.id", "message", "http.response.status_code"]
  10. }

APIは次の応答を返します。1つ以上のリモートクラスターを検索する場合、各クラスターでの検索に関する情報を提供するために_clustersセクションが含まれます。

コンソール-結果

  1. {
  2. "took": 150,
  3. "timed_out": false,
  4. "_shards": {
  5. "total": 12,
  6. "successful": 12,
  7. "failed": 0,
  8. "skipped": 0
  9. },
  10. "_clusters": {
  11. "total": 1,
  12. "successful": 1,
  13. "skipped": 0,
  14. "running": 0,
  15. "partial": 0,
  16. "failed": 0,
  17. "details": {
  18. "cluster_one": {
  19. "status": "successful",
  20. "indices": "my-index-000001",
  21. "took": 148,
  22. "timed_out": false,
  23. "_shards": {
  24. "total": 12,
  25. "successful": 12,
  26. "skipped": 0,
  27. "failed": 0
  28. }
  29. }
  30. }
  31. },
  32. "hits": {
  33. "total" : {
  34. "value": 1,
  35. "relation": "eq"
  36. },
  37. "max_score": 1,
  38. "hits": [
  39. {
  40. "_index": "cluster_one:my-index-000001",
  41. "_id": "0",
  42. "_score": 1,
  43. "_source": {
  44. "user": {
  45. "id": "kimchy"
  46. },
  47. "message": "GET /search HTTP/1.1 200 1070000",
  48. "http": {
  49. "response":
  50. {
  51. "status_code": 200
  52. }
  53. }
  54. }
  55. }
  56. ]
  57. }
  58. }
このカウンターのセクションは、すべての可能なクラスター検索状態と、現在その状態にあるクラスター検索の数を示しています。クラスターは次のいずれかのステータスのいずれかです:実行中成功(すべてのシャードでの検索が成功した)、部分的(クラスターの少なくとも1つのシャードでの検索が成功し、少なくとも1つが失敗した)、スキップskip_unavailable=trueでマークされたクラスターでの検索が失敗した)または失敗skip_unavailable=falseでマークされたクラスターでの検索が失敗した)。
_clusters/detailsセクションは、各クラスターでの検索に関するメタデータを示します。
ユーザーが提供したインデックス式。ワイルドカードlogs-*のようなものを提供した場合、このセクションは具体的に検索されているインデックスではなく、ワイルドカードを含む値を表示します。
そのクラスターでのサブ検索にかかった時間(ミリ秒単位)。
そのクラスターでのサブ検索のシャードの詳細。
検索応答ボディには、_indexパラメータにリモートクラスターの名前が含まれています。

複数のリモートクラスターを検索

次の検索APIリクエストは、3つのクラスターでmy-index-000001インデックスを検索します:

  • ローカル(「クエリ中」)クラスター、10シャード
  • 2つのリモートクラスター、cluster_one、12シャードおよびcluster_two、6シャード。

Python

  1. resp = client.search(
  2. index="my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001",
  3. query={
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. source=[
  9. "user.id",
  10. "message",
  11. "http.response.status_code"
  12. ],
  13. )
  14. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001',
  3. body: {
  4. query: {
  5. match: {
  6. 'user.id' => 'kimchy'
  7. }
  8. },
  9. _source: [
  10. 'user.id',
  11. 'message',
  12. 'http.response.status_code'
  13. ]
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.search({
  2. index:
  3. "my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001",
  4. query: {
  5. match: {
  6. "user.id": "kimchy",
  7. },
  8. },
  9. _source: ["user.id", "message", "http.response.status_code"],
  10. });
  11. console.log(response);

コンソール

  1. GET /my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001/_search
  2. {
  3. "query": {
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. "_source": ["user.id", "message", "http.response.status_code"]
  9. }

APIは次の応答を返します:

コンソール-結果

  1. {
  2. "took": 150,
  3. "timed_out": false,
  4. "num_reduce_phases": 4,
  5. "_shards": {
  6. "total": 28,
  7. "successful": 28,
  8. "failed": 0,
  9. "skipped": 0
  10. },
  11. "_clusters": {
  12. "total": 3,
  13. "successful": 3,
  14. "skipped": 0,
  15. "running": 0,
  16. "partial": 0,
  17. "failed": 0,
  18. "details": {
  19. "(local)": {
  20. "status": "successful",
  21. "indices": "my-index-000001",
  22. "took": 21,
  23. "timed_out": false,
  24. "_shards": {
  25. "total": 10,
  26. "successful": 10,
  27. "skipped": 0,
  28. "failed": 0
  29. }
  30. },
  31. "cluster_one": {
  32. "status": "successful",
  33. "indices": "my-index-000001",
  34. "took": 48,
  35. "timed_out": false,
  36. "_shards": {
  37. "total": 12,
  38. "successful": 12,
  39. "skipped": 0,
  40. "failed": 0
  41. }
  42. },
  43. "cluster_two": {
  44. "status": "successful",
  45. "indices": "my-index-000001",
  46. "took": 141,
  47. "timed_out": false,
  48. "_shards": {
  49. "total" : 6,
  50. "successful" : 6,
  51. "skipped": 0,
  52. "failed": 0
  53. }
  54. }
  55. }
  56. },
  57. "hits": {
  58. "total" : {
  59. "value": 3,
  60. "relation": "eq"
  61. },
  62. "max_score": 1,
  63. "hits": [
  64. {
  65. "_index": "my-index-000001",
  66. "_id": "0",
  67. "_score": 2,
  68. "_source": {
  69. "user": {
  70. "id": "kimchy"
  71. },
  72. "message": "GET /search HTTP/1.1 200 1070000",
  73. "http": {
  74. "response":
  75. {
  76. "status_code": 200
  77. }
  78. }
  79. }
  80. },
  81. {
  82. "_index": "cluster_one:my-index-000001",
  83. "_id": "0",
  84. "_score": 1,
  85. "_source": {
  86. "user": {
  87. "id": "kimchy"
  88. },
  89. "message": "GET /search HTTP/1.1 200 1070000",
  90. "http": {
  91. "response":
  92. {
  93. "status_code": 200
  94. }
  95. }
  96. }
  97. },
  98. {
  99. "_index": "cluster_two:my-index-000001",
  100. "_id": "0",
  101. "_score": 1,
  102. "_source": {
  103. "user": {
  104. "id": "kimchy"
  105. },
  106. "message": "GET /search HTTP/1.1 200 1070000",
  107. "http": {
  108. "response":
  109. {
  110. "status_code": 200
  111. }
  112. }
  113. }
  114. }
  115. ]
  116. }
  117. }
ローカル(クエリ中)クラスターは「(local)」として識別されます。
このドキュメントの_indexパラメータにはクラスター名が含まれていません。これは、ドキュメントがローカルクラスターから来たことを意味します。
このドキュメントはcluster_oneから来ました。
このドキュメントはcluster_twoから来ました。

ccs_minimize_roundtrips=trueを使用したクラスター間検索の非同期検索

リモートクラスターは、非同期検索APIを使用して非同期にクエリできます。クラスター間検索は、ccs_minimize_roundtripsパラメータを受け入れます。非同期検索の場合、デフォルトはfalseです。(注:同期検索の場合、デフォルトはtrueです。)クラスター間検索でラウンドトリップを最小限に抑えるかどうかを選択する際の考慮事項を参照して、このオプションについて詳しく学んでください。

次のリクエストは、my-index-000001インデックスをccs_minimize_roundtrips=trueを使用して3つのクラスター(前の例と同じ)に対して非同期検索を実行します。

Python

  1. resp = client.async_search.submit(
  2. index="my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001",
  3. ccs_minimize_roundtrips=True,
  4. query={
  5. "match": {
  6. "user.id": "kimchy"
  7. }
  8. },
  9. source=[
  10. "user.id",
  11. "message",
  12. "http.response.status_code"
  13. ],
  14. )
  15. print(resp)

Ruby

  1. response = client.async_search.submit(
  2. index: 'my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001',
  3. ccs_minimize_roundtrips: true,
  4. body: {
  5. query: {
  6. match: {
  7. 'user.id' => 'kimchy'
  8. }
  9. },
  10. _source: [
  11. 'user.id',
  12. 'message',
  13. 'http.response.status_code'
  14. ]
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.asyncSearch.submit({
  2. index:
  3. "my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001",
  4. ccs_minimize_roundtrips: "true",
  5. query: {
  6. match: {
  7. "user.id": "kimchy",
  8. },
  9. },
  10. _source: ["user.id", "message", "http.response.status_code"],
  11. });
  12. console.log(response);

コンソール

  1. POST /my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001/_async_search?ccs_minimize_roundtrips=true
  2. {
  3. "query": {
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. "_source": ["user.id", "message", "http.response.status_code"]
  9. }

APIは次の応答を返します:

コンソール-結果

  1. {
  2. "id": "FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU=",
  3. "is_partial": true,
  4. "is_running": true,
  5. "start_time_in_millis": 1685563581380,
  6. "expiration_time_in_millis": 1685995581380,
  7. "response": {
  8. "took": 1020,
  9. "timed_out": false,
  10. "num_reduce_phases": 0,
  11. "_shards": {
  12. "total": 10,
  13. "successful": 0,
  14. "failed": 0,
  15. "skipped": 0
  16. },
  17. "_clusters": {
  18. "total" : 3,
  19. "successful" : 0,
  20. "skipped": 0,
  21. "running": 3,
  22. "partial": 0,
  23. "failed": 0,
  24. "details": {
  25. "(local)": {
  26. "status": "running",
  27. "indices": "my-index-000001",
  28. "timed_out": false
  29. },
  30. "cluster_one": {
  31. "status": "running",
  32. "indices": "my-index-000001",
  33. "timed_out": false
  34. },
  35. "cluster_one": {
  36. "status": "running",
  37. "indices": "my-index-000001",
  38. "timed_out": false
  39. }
  40. }
  41. },
  42. "hits": {
  43. "total" : {
  44. "value": 0,
  45. "relation": "eq"
  46. },
  47. "max_score": null,
  48. "hits": []
  49. }
  50. }
  51. }
非同期検索ID。
ccs_minimize_roundtrips = trueで、リモートクラスターでの検索がまだ実行中の場合、このセクションはローカルクラスターのみのスコープ内のシャード数を示し、検索が完了したクラスターの数も示します。検索が完了したときに、すべてのクラスターの合計シャード数が含まれるように更新されます。ccs_minimize_roundtrips= falseの場合、すべてのクラスターの合計シャード数は事前に知られており、正確になります。
_clustersセクションは、検索のスコープ内に3つのクラスターがあり、すべてが現在「実行中」状態であることを示しています。

非同期検索を取得するエンドポイントをクエリ中に実行すると、各クラスターが検索を完了するたびに、応答の_clustersおよび_shardsセクションに更新が表示されます。

  1. `````ccs_minimize_roundtrips=true`````を設定すると、これまでに完了したすべてのクラスターからの「ヒット」および「集計」セクションの部分的な結果も表示されます。(注:ローカルクラスターからの部分的な集計結果も、完了する前に表示されることがあります。)以下の例は`````ccs_minimize_roundtrips=true`````のケースを示しています。
  2. #### Python
  3. ``````python
  4. resp = client.async_search.get(
  5. id="FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU=",
  6. )
  7. print(resp)
  8. `

Ruby

  1. response = client.async_search.get(
  2. id: 'FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU='
  3. )
  4. puts response

Js

  1. const response = await client.asyncSearch.get({
  2. id: "FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU=",
  3. });
  4. console.log(response);

コンソール

  1. GET /_async_search/FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU=

応答:

コンソール-結果

  1. {
  2. "id": "FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU=",
  3. "is_partial": true,
  4. "is_running": true,
  5. "start_time_in_millis": 1685564911108,
  6. "expiration_time_in_millis": 1685996911108,
  7. "response": {
  8. "took": 11164,
  9. "timed_out": false,
  10. "terminated_early": false,
  11. "_shards": {
  12. "total": 22,
  13. "successful": 22,
  14. "skipped": 0,
  15. "failed": 0
  16. },
  17. "_clusters": {
  18. "total": 3,
  19. "successful": 2,
  20. "skipped": 0,
  21. "running": 1,
  22. "partial": 0,
  23. "failed": 0,
  24. "details": {
  25. "(local)": {
  26. "status": "successful",
  27. "indices": "my-index-000001",
  28. "took": 2034,
  29. "timed_out": false,
  30. "_shards": {
  31. "total": 10,
  32. "successful": 10,
  33. "skipped": 0,
  34. "failed": 0
  35. }
  36. },
  37. "cluster_one": {
  38. "status": "successful",
  39. "indices": "my-index-000001",
  40. "took": 9039,
  41. "timed_out": false,
  42. "_shards": {
  43. "total": 12,
  44. "successful": 12,
  45. "skipped": 0,
  46. "failed": 0
  47. }
  48. },
  49. "cluster_two": {
  50. "status": "running",
  51. "indices": "my-index-000001",
  52. "timed_out": false
  53. }
  54. }
  55. },
  56. "hits": {
  57. "total": {
  58. "value": 542,
  59. "relation": "eq"
  60. },
  61. "max_score": 1.7232,
  62. "hits": [...list of hits here...]
  63. }
  64. }
  65. }
ローカルクラスターとリモートcluster_oneクラスターのすべてのシャードでの検索が完了しました。
2つのクラスターが検索を完了したため、「成功した」クラスターのエントリは2に設定され、「実行中」クラスターのエントリは1に減少します。_clusters応答メタデータは、各クラスターが完了するにつれて更新されます。
完了した検索からのヒットの数。すべてのクラスターでの検索が完了し、マージされるまで、最終的なヒットは表示されません。したがって、「ヒット」セクションは、検索が完全に終了するまで、このエンドポイントを呼び出すと変更される可能性があります。

すべてのクラスターでの検索が完了した後、非同期検索を取得するエンドポイントをクエリすると、_clustersおよび_shardsセクションの最終ステータスとヒット、集計結果が表示されます。

Python

  1. resp = client.async_search.get(
  2. id="FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU=",
  3. )
  4. print(resp)

Ruby

  1. response = client.async_search.get(
  2. id: 'FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU='
  3. )
  4. puts response

Js

  1. const response = await client.asyncSearch.get({
  2. id: "FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU=",
  3. });
  4. console.log(response);

コンソール

  1. GET /_async_search/FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU=

応答:

コンソール-結果

  1. {
  2. "id": "FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU=",
  3. "is_partial": false,
  4. "is_running": false,
  5. "start_time_in_millis": 1685564911108,
  6. "expiration_time_in_millis": 1685996911108,
  7. "completion_time_in_millis": 1685564938727,
  8. "response": {
  9. "took": 27619,
  10. "timed_out": false,
  11. "num_reduce_phases": 4,
  12. "_shards": {
  13. "total": 28,
  14. "successful": 28,
  15. "skipped": 0,
  16. "failed": 0
  17. },
  18. "_clusters": {
  19. "total": 3,
  20. "successful": 3,
  21. "skipped": 0,
  22. "running": 0,
  23. "partial": 0,
  24. "failed": 0,
  25. "details": {
  26. "(local)": {
  27. "status": "successful",
  28. "indices": "my-index-000001",
  29. "took": 2034,
  30. "timed_out": false,
  31. "_shards": {
  32. "total": 10,
  33. "successful": 10,
  34. "skipped": 0,
  35. "failed": 0
  36. }
  37. },
  38. "cluster_one": {
  39. "status": "successful",
  40. "indices": "my-index-000001",
  41. "took": 9039,
  42. "timed_out": false,
  43. "_shards": {
  44. "total": 12,
  45. "successful": 12,
  46. "skipped": 0,
  47. "failed": 0
  48. }
  49. },
  50. "cluster_two": {
  51. "status": "successful",
  52. "indices": "my-index-000001",
  53. "took": 27550,
  54. "timed_out": false,
  55. "_shards": {
  56. "total": 6,
  57. "successful": 6,
  58. "skipped": 0,
  59. "failed": 0
  60. }
  61. }
  62. }
  63. },
  64. "hits": {
  65. "total": {
  66. "value": 1067,
  67. "relation": "eq"
  68. },
  69. "max_score": 1.8293576,
  70. "hits": [...list of hits here...]
  71. }
  72. }
  73. }
検索が完了すると、completion_timeが表示されます。
_shardsセクションは、すべてのクラスターで検索された合計28シャードが成功したことを示すように更新されます。
_clustersセクションは、3つのクラスターでの検索が成功したことを示しています。

クラスター間検索の失敗

クラスター間検索中の失敗は、次の2つの条件のいずれかを引き起こす可能性があります:

  • 1. 部分的な結果(2xx HTTPステータスコード)
  • 2. 失敗した検索(4xxまたは5xx HTTPステータスコード)

失敗の詳細は、両方のケースで検索応答に表示されます。

  1. 個々のシャードでの検索の失敗は、応答の`````_shards`````セクションと`````_clusters`````セクションの両方に表示されます。
  2. 失敗した検索には、応答に追加のトップレベル`````errors`````エントリがあります。
  3. 以下は、1つのクラスターの1つのシャードの失敗による部分的な結果を持つ検索の例です。この検索は、以前に示されたものと似ています。`````_async_search/status`````エンドポイントは、完了ステータスを表示し、ヒットを表示しないために使用されます。
  4. #### Python
  5. ``````python
  6. resp = client.async_search.status(
  7. id="FmpwbThueVB4UkRDeUxqb1l4akIza3cbWEJyeVBPQldTV3FGZGdIeUVabXBldzoyMDIw",
  8. )
  9. print(resp)
  10. `

Ruby

  1. response = client.async_search.status(
  2. id: 'FmpwbThueVB4UkRDeUxqb1l4akIza3cbWEJyeVBPQldTV3FGZGdIeUVabXBldzoyMDIw'
  3. )
  4. puts response

Js

  1. const response = await client.asyncSearch.status({
  2. id: "FmpwbThueVB4UkRDeUxqb1l4akIza3cbWEJyeVBPQldTV3FGZGdIeUVabXBldzoyMDIw",
  3. });
  4. console.log(response);

コンソール

  1. GET /_async_search/status/FmpwbThueVB4UkRDeUxqb1l4akIza3cbWEJyeVBPQldTV3FGZGdIeUVabXBldzoyMDIw

応答:

コンソール-結果

  1. {
  2. "id": "FmpwbThueVB4UkRDeUxqb1l4akIza3cbWEJyeVBPQldTV3FGZGdIeUVabXBldzoyMDIw",
  3. "is_partial": true,
  4. "is_running": false,
  5. "start_time_in_millis": 1692106901478,
  6. "expiration_time_in_millis": 1692538901478,
  7. "completion_time_in_millis": 1692106903547,
  8. "response": {
  9. "took": 2069,
  10. "timed_out": false,
  11. "num_reduce_phases": 4,
  12. "_shards": {
  13. "total": 28,
  14. "successful": 27,
  15. "skipped": 0,
  16. "failed": 1,
  17. "failures": [
  18. {
  19. "shard": 1,
  20. "index": "cluster_two:my-index-000001",
  21. "node": "LMpUnAu0QEeCUMfg_56sAg",
  22. "reason": {
  23. "type": "query_shard_exception",
  24. "reason": "failed to create query: [my-index-000001][1] exception message here",
  25. "index_uuid": "4F2VWx8RQSeIhUE-nksvCQ",
  26. "index": "cluster_two:my-index-000001",
  27. "caused_by": {
  28. "type": "runtime_exception",
  29. "reason": "runtime_exception: [my-index-000001][1] exception message here"
  30. }
  31. }
  32. }
  33. ]
  34. },
  35. "_clusters": {
  36. "total": 3,
  37. "successful": 2,
  38. "skipped": 0,
  39. "running": 0,
  40. "partial": 1,
  41. "failed": 0,
  42. "details": {
  43. "(local)": {
  44. "status": "successful",
  45. "indices": "my-index-000001",
  46. "took": 1753,
  47. "timed_out": false,
  48. "_shards": {
  49. "total": 10,
  50. "successful": 10,
  51. "skipped": 0,
  52. "failed": 0
  53. }
  54. },
  55. "cluster_one": {
  56. "status": "successful",
  57. "indices": "my-index-000001",
  58. "took": 2054,
  59. "timed_out": false,
  60. "_shards": {
  61. "total": 12,
  62. "successful": 12,
  63. "skipped": 0,
  64. "failed": 0
  65. }
  66. },
  67. "cluster_two": {
  68. "status": "partial",
  69. "indices": "my-index-000001",
  70. "took": 2039,
  71. "timed_out": false,
  72. "_shards": {
  73. "total": 6,
  74. "successful": 5,
  75. "skipped": 0,
  76. "failed": 1
  77. },
  78. "failures": [
  79. {
  80. "shard": 1,
  81. "index": "cluster_two:my-index-000001",
  82. "node": "LMpUnAu0QEeCUMfg_56sAg",
  83. "reason": {
  84. "type": "query_shard_exception",
  85. "reason": "failed to create query: [my-index-000001][1] exception message here",
  86. "index_uuid": "4F2VWx8RQSeIhUE-nksvCQ",
  87. "index": "cluster_two:my-index-000001",
  88. "caused_by": {
  89. "type": "runtime_exception",
  90. "reason": "runtime_exception: [my-index-000001][1] exception message here"
  91. }
  92. }
  93. }
  94. ]
  95. }
  96. }
  97. },
  98. "hits": {
  99. }
  100. }
  101. }
検索結果は部分的としてマークされます。少なくとも1つのシャード検索が失敗したためです。
_shardsセクションにはシャードの失敗情報が含まれています。
部分的な結果を持つクラスターは、依然として「部分的」としてマークされます。データが検索から返されなかった場合にのみ、ステータスは「スキップ」(または「失敗」)としてマークされます。
partialステータスは、部分的な結果を持つクラスターに適用されます。
失敗したシャードの数が表示されます。
シャードの失敗は、クラスター/詳細エントリの下にもリストされます。

以下は、cluster_onecluster_twoの両方がクラスター間検索中に接続を失った例です。cluster_oneskip_unavailable=trueとしてマークされているため、そのステータスはskippedであり、cluster_twoskip_unavailable=falseとしてマークされているため、そのステータスはfailedです。failedクラスターがあったため、トップレベルerrorも存在し、HTTPステータス500(表示されていません)を返します。

クラスターが利用できない場合でも検索が結果を返すようにするには、すべてのリモートクラスターに対してskip_unavailable=trueを設定します。

Python

  1. resp = client.async_search.get(
  2. id="FjktRGJ1Y2w1U0phLTRhZnVyeUZ2MVEbWEJyeVBPQldTV3FGZGdIeUVabXBldzo5NzA4",
  3. )
  4. print(resp)

Ruby

  1. response = client.async_search.get(
  2. id: 'FjktRGJ1Y2w1U0phLTRhZnVyeUZ2MVEbWEJyeVBPQldTV3FGZGdIeUVabXBldzo5NzA4'
  3. )
  4. puts response

Js

  1. const response = await client.asyncSearch.get({
  2. id: "FjktRGJ1Y2w1U0phLTRhZnVyeUZ2MVEbWEJyeVBPQldTV3FGZGdIeUVabXBldzo5NzA4",
  3. });
  4. console.log(response);

コンソール

  1. GET /_async_search/FjktRGJ1Y2w1U0phLTRhZnVyeUZ2MVEbWEJyeVBPQldTV3FGZGdIeUVabXBldzo5NzA4

応答:

コンソール-結果

  1. {
  2. "id": "FjktRGJ1Y2w1U0phLTRhZnVyeUZ2MVEbWEJyeVBPQldTV3FGZGdIeUVabXBldzo5NzA4",
  3. "is_partial": true,
  4. "is_running": false,
  5. "start_time_in_millis": 1692112102650,
  6. "expiration_time_in_millis": 1692544102650,
  7. "completion_time_in_millis": 1692112106177,
  8. "response": {
  9. "took": 3527,
  10. "timed_out": false,
  11. "terminated_early": false,
  12. "_shards": {
  13. "total": 10,
  14. "successful": 10,
  15. "skipped": 0,
  16. "failed": 0
  17. },
  18. "_clusters": {
  19. "total": 3,
  20. "successful": 1,
  21. "skipped": 1,
  22. "running": 0,
  23. "partial": 0,
  24. "failed": 1,
  25. "details": {
  26. "(local)": {
  27. "status": "successful",
  28. "indices": "my-index-000001",
  29. "took": 1473,
  30. "timed_out": false,
  31. "_shards": {
  32. "total": 10,
  33. "successful": 10,
  34. "skipped": 0,
  35. "failed": 0
  36. }
  37. },
  38. "cluster_one": {
  39. "status": "skipped",
  40. "indices": "my-index-000001",
  41. "timed_out": false,
  42. "failures": [
  43. {
  44. "shard": -1,
  45. "index": null,
  46. "reason": {
  47. "type": "node_disconnected_exception",
  48. "reason": "[myhostname1][35.238.149.1:9300][indices:data/read/search] disconnected"
  49. }
  50. }
  51. ]
  52. },
  53. "cluster_two": {
  54. "status": "failed",
  55. "indices": "my-index-000001",
  56. "timed_out": false,
  57. "failures": [
  58. {
  59. "shard": -1,
  60. "index": null,
  61. "reason": {
  62. "type": "node_disconnected_exception",
  63. "reason": "[myhostname2][35.238.149.2:9300][indices:data/read/search] disconnected"
  64. }
  65. }
  66. ]
  67. }
  68. }
  69. },
  70. "hits": {
  71. },
  72. }
  73. "error": {
  74. "type": "status_exception",
  75. "reason": "error while executing search",
  76. "caused_by": {
  77. "type": "node_disconnected_exception",
  78. "reason": "[myhostname2][35.238.149.2:9300][indices:data/read/search] disconnected"
  79. }
  80. }
  81. }
このようなエラーが発生した場合、シャードの会計はしばしば部分的なものになります。リモートクラスターからのシャード情報を各検索で取得できる必要があります。
cluster_oneが検索中に切断され、結果を返しませんでした。リモートクラスター構成でskip_unavailable=trueとしてマークされているため、そのステータスは「スキップ」であり、全体の検索を失敗させることはありません。
失敗リストには、リモートクラスターのノードがクエリ中のクラスターから切断されたことが示されています。
cluster_twoステータスは「失敗」となります。リモートクラスター構成でskip_unavailable=falseとしてマークされているためです。
「失敗した」クラスターがある場合、トップレベルerrorエントリが含まれます。

クラスター間検索からクラスターまたはインデックスを除外する

大規模なクラスターおよび/またはインデックスのリストを含めるためにワイルドカードを使用する場合、クラスターまたはインデックスの前に-マイナス記号を付けて、1つ以上のクラスターまたはインデックスを明示的に除外できます。

クラスター全体を除外するには、クラスターエイリアスの前にマイナス記号を付けます。たとえば、-mycluster:*のようにします。クラスターを除外する場合、インデックス位置に*を使用する必要があります。さもなければエラーが返されます。

特定のリモートインデックスを除外するには、インデックスの前にマイナス記号を付けます。たとえば、mycluster:-myindexのようにします。

リモートクラスターを除外する

ワイルドカードを使用してクラスターのリストを指定するクラスター間検索からcluster_threeを除外する方法は次のとおりです:

Python

  1. resp = client.async_search.submit(
  2. index="my-index-000001,cluster*:my-index-000001,-cluster_three:*",
  3. query={
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. source=[
  9. "user.id",
  10. "message",
  11. "http.response.status_code"
  12. ],
  13. )
  14. print(resp)

Js

  1. const response = await client.asyncSearch.submit({
  2. index: "my-index-000001,cluster*:my-index-000001,-cluster_three:*",
  3. query: {
  4. match: {
  5. "user.id": "kimchy",
  6. },
  7. },
  8. _source: ["user.id", "message", "http.response.status_code"],
  9. });
  10. console.log(response);

コンソール

  1. POST /my-index-000001,cluster*:my-index-000001,-cluster_three:*/_async_search
  2. {
  3. "query": {
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. "_source": ["user.id", "message", "http.response.status_code"]
  9. }
cluster*表記はcluster_onecluster_twocluster_threeを自然に含むでしょう。
クラスター名の前に-を使用してcluster_threeを除外し、インデックス位置にシンプルなワイルドカード*を使用します。これは、cluster_threeとの接触を望まないことを示します。

リモートインデックスを除外する

  1. #### Python
  2. ``````python
  3. resp = client.async_search.submit(
  4. index="my-index-000001,cluster*:my-index-*,cluster_three:-my-index-000001",
  5. query={
  6. "match": {
  7. "user.id": "kimchy"
  8. }
  9. },
  10. source=[
  11. "user.id",
  12. "message",
  13. "http.response.status_code"
  14. ],
  15. )
  16. print(resp)
  17. `

Js

  1. const response = await client.asyncSearch.submit({
  2. index: "my-index-000001,cluster*:my-index-*,cluster_three:-my-index-000001",
  3. query: {
  4. match: {
  5. "user.id": "kimchy",
  6. },
  7. },
  8. _source: ["user.id", "message", "http.response.status_code"],
  9. });
  10. console.log(response);

コンソール

  1. POST /my-index-000001,cluster*:my-index-*,cluster_three:-my-index-000001/_async_search
  2. {
  3. "query": {
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. "_source": ["user.id", "message", "http.response.status_code"]
  9. }
これはcluster_threeを検索から除外しません。my-index-*に一致するインデックスを検索するように依然として連絡されますが、my-index-000001を除外します。

ccs_minimize_roundtrips=falseを使用したクラスター間検索の非同期検索

応答の_shardsおよび_clustersセクションは、ccs_minimize_roundtripsfalseの場合に異なる動作をします。

主な違いは:

  • 1. _shardsセクションの合計カウントは、検索が開始される前にすべてのクラスターからのシャードの合計数が収集されるため、すぐに正確になります。
  • 2. _shardsセクションは、個々のシャードの検索が完了するにつれて段階的に更新されますが、ラウンドトリップを最小限に抑える場合、シャードセクションはローカルクラスターでのシャードの検索が完了したときに更新され、その後、各リモートクラスターが完全な検索結果を報告するたびに更新されます。
  • 3. _clusterセクションは、クエリフェーズが開始される前に取得されるため、すべてのシャードカウントをリストします。

前のセクション(ccs_minimize_roundtrips=true)と同じセットアップを使用した例:

Python

  1. resp = client.async_search.submit(
  2. index="my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001",
  3. ccs_minimize_roundtrips=False,
  4. query={
  5. "match": {
  6. "user.id": "kimchy"
  7. }
  8. },
  9. source=[
  10. "user.id",
  11. "message",
  12. "http.response.status_code"
  13. ],
  14. )
  15. print(resp)

Js

  1. const response = await client.asyncSearch.submit({
  2. index:
  3. "my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001",
  4. ccs_minimize_roundtrips: "false",
  5. query: {
  6. match: {
  7. "user.id": "kimchy",
  8. },
  9. },
  10. _source: ["user.id", "message", "http.response.status_code"],
  11. });
  12. console.log(response);

コンソール

  1. POST /my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001/_async_search?ccs_minimize_roundtrips=false
  2. {
  3. "query": {
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. "_source": ["user.id", "message", "http.response.status_code"]
  9. }

APIは、クエリがwait_for_completion_timeoutの期間を超えると、次の応答を返します(非同期検索を参照)。

コンソール-結果

  1. {
  2. "id": "FklQYndoTDJ2VEFlMEVBTzFJMGhJVFEaLVlKYndBWWZSMUdicUc4WVlEaFl4ZzoxNTU=",
  3. "is_partial": true,
  4. "is_running": true,
  5. "start_time_in_millis": 1685563581380,
  6. "expiration_time_in_millis": 1685995581380,
  7. "response": {
  8. "took": 1020,
  9. "timed_out": false,
  10. "_shards": {
  11. "total": 28,
  12. "successful": 0,
  13. "failed": 0,
  14. "skipped": 0
  15. },
  16. "_clusters": {
  17. "total" : 3,
  18. "successful": 0,
  19. "skipped": 0,
  20. "running": 3,
  21. "partial": 0,
  22. "failed": 0,
  23. "details": {
  24. "(local)": {
  25. "status": "running",
  26. "indices": "my-index-000001",
  27. "timed_out": false,
  28. "_shards": {
  29. "total": 10,
  30. "successful": 0,
  31. "skipped": 0,
  32. "failed": 0
  33. }
  34. },
  35. "cluster_one": {
  36. "status": "running",
  37. "indices": "my-index-000001",
  38. "timed_out": false,
  39. "_shards": {
  40. "total": 12,
  41. "successful": 0,
  42. "skipped": 0,
  43. "failed": 0
  44. }
  45. },
  46. "cluster_two": {
  47. "status": "running",
  48. "indices": "my-index-000001",
  49. "timed_out": false,
  50. "_shards": {
  51. "total": 6,
  52. "successful": 0,
  53. "skipped": 0,
  54. "failed": 0
  55. }
  56. }
  57. }
  58. },
  59. "hits": {
  60. "total" : {
  61. "value": 0,
  62. "relation": "eq"
  63. },
  64. "max_score": null,
  65. "hits": []
  66. }
  67. }
  68. }
検索のスコープ内のすべてのクラスターからのすべてのシャードがここにリストされています。このセクションや/または_clustersセクションを監視して、検索の進行状況を監視します。
_clustersセクションから、すべてのクラスターが「実行中」状態であることがわかります。
_clustersセクションは、すべての3つのクラスターからシャード情報が正常に収集され、各クラスターの合計シャード数がリストされていることを示しています。

オプションのリモートクラスター

デフォルトでは、リクエスト内のリモートクラスターが利用できない場合、またはすべてのシャードでの検索が失敗した場合、クラスター間検索は失敗します。特定のリモートクラスターをオプションまたは必須としてマークするには、skip_unavailableクラスター設定を使用します。

Elasticsearch 8.15では、skip_unavailableのデフォルト値がfalseからtrueに変更されました。Elasticsearch 8.15以前は、クラスターをクラスター間検索のオプションとして扱うには、その構成を設定する必要がありました。Elasticsearch 8.15以降は、クラスターをクラスター間検索の必須とするには、その構成を設定する必要があります。

  1. - 検索中にノードが利用できない場合、リモートクラスターをスキップします。応答の`````_clusters.skipped`````値には、スキップされたクラスターの数が含まれ、応答の`````_clusters.details`````セクションには`````skipped`````ステータスが表示されます。
  2. - 利用できないシャードやインデックスに関連するエラーなど、リモートクラスターから返されたエラーを無視します。これには、[`````allow_no_indices`````](b10cb0563daae284.md#api-multi-index)や[`````ignore_unavailable`````](b10cb0563daae284.md#api-multi-index)などの検索パラメータに関連するエラーが含まれる場合があります。
  3. - リモートクラスターを検索する際に、[`````allow_partial_search_results`````](89159571f146b334.md#search-partial-responses)パラメータと関連する`````search.default_allow_partial_results`````クラスター設定を無視します。これは、リモートクラスターでの検索が部分的な結果を返す可能性があることを意味します。
  4. `````skip_unavailable`````設定は、elasticsearch.yml構成ファイルの`````cluster.remote.<cluster_alias>`````設定を編集することで変更できます。たとえば:
  5. ``````bash
  6. cluster:
  7. remote:
  8. cluster_one:
  9. seeds: 35.238.149.1:9300
  10. skip_unavailable: false
  11. cluster_two:
  12. seeds: 35.238.149.2:9300
  13. skip_unavailable: true
  14. `

または、クラスター更新設定APIを介してクラスターのリモート設定を設定することもできます。

skip_unavailable: true(上記のcluster_twoなど)で構成されたリモートクラスターがクラスター間検索中に切断または利用できない場合、Elasticsearchはそのクラスターからの一致するドキュメントを最終結果に含めず、検索は成功と見なされます(HTTPステータス200 OK)。

クラスターの少なくとも1つのシャードが検索結果を提供する場合、それらの結果が使用され、検索は部分的なデータを返します。これは、リモートクラスターのskip_unavailable設定に関係なく真です。(非同期検索を使用してクラスター間検索を行う場合、is_partialフィールドは部分的な結果を示すためにtrueに設定されます。)

クラスター間検索がネットワーク遅延を処理する方法

クラスター間検索はリモートクラスターにリクエストを送信するため、ネットワーク遅延が検索速度に影響を与える可能性があります。遅い検索を避けるために、クラスター間検索はネットワーク遅延を処理するための2つのオプションを提供します:

ベクトルタイル検索APIは常にネットワークラウンドトリップを最小限に抑え、ccs_minimize_roundtripsパラメータを含みません。

近似kNN検索はネットワークラウンドトリップを最小限に抑えることをサポートしておらず、ccs_minimize_roundtripsパラメータをfalseに設定します。

クラスター間検索でラウンドトリップを最小限に抑えるかどうかを選択する際の考慮事項

ラウンドトリップを最小限に抑える利点:

  • 1. 大量のシャードをクエリするクラスター間検索では、ラウンドトリップを最小限に抑えるオプションが通常はるかに優れたパフォーマンスを提供します。これは、検索されるクラスターが高いネットワーク遅延を持つ場合(例:遠隔地)に特に当てはまります。
  • 2. 非同期クラスター間検索を行うと、GET _async_search/<search_id>エンドポイントは、他のクラスターでの検索がまだ実行中であっても、結果を報告したすべてのクラスターからのトップヒットと集計を提供します。言い換えれば、検索が進行するにつれて「増分」部分結果を提供します。ローカルクラスターが検索に含まれている場合、特別な処理が行われ、ローカルクラスターでの検索がまだ実行中である間に部分的な集計を表示できます(ただし、部分的なトップヒットは表示されません)。

非同期検索を使用してラウンドトリップを最小限に抑えない場合、検索がまだ実行中である間に、個々のシャードが完了するたびにクエリの集計の部分的な結果を取得できます(クラスター全体ではなく)。ただし、すべてのクラスターでの検索が完了するまで、トップヒットは表示されません。

デフォルトでは、同期検索はラウンドトリップを最小限に抑え、非同期検索はそうではありません。ccs_minimize_roundtripsパラメータを使用してデフォルトをオーバーライドし、trueまたはfalseのいずれかに設定できます。これは、このドキュメントのいくつかの例で示されています。

ネットワークの往復回数を最小限に抑える

ネットワークの往復回数を最小限に抑えた場合のクロスクラスター検索の動作は次のとおりです。

  • 1. クロスクラスター検索リクエストをローカルクラスターに送信します。そのクラスターのコーディネーショニングノードがリクエストを受信し、解析します。
    ccs min roundtrip client request
  • 2. コーディネーショニングノードは、ローカルクラスターを含む各クラスターに対して単一の検索リクエストを送信します。各クラスターは独立して検索リクエストを実行し、リクエストに自分のクラスター設定を適用します。
    ccs min roundtrip cluster search
  • 3. 各リモートクラスターは、検索結果をコーディネーショニングノードに返します。
    ccs min roundtrip cluster results
  • 4. 各クラスターから結果を収集した後、コーディネーショニングノードはクロスクラスター検索応答で最終結果を返します。
    ccs min roundtrip client response

ネットワークの往復回数を最小限に抑えない

ネットワークの往復回数を最小限に抑えない場合のクロスクラスター検索の動作は次のとおりです。

  • 1. クロスクラスター検索リクエストをローカルクラスターに送信します。そのクラスターのコーディネーショニングノードがリクエストを受信し、解析します。
    ccs min roundtrip client request
  • 2. コーディネーショニングノードは、各リモートクラスターに「検索シャード」トランスポートレイヤーリクエストを送信し、各クラスターのどのシャードを検索すべきかを判断するために「マッチ可能」検索を実行させます。
    ccs min roundtrip cluster search
  • 3. 各リモートクラスターは、コーディネーショニングノードに応答を返します。この応答には、クロスクラスター検索リクエストが実行されるインデックスとシャードに関する情報が含まれています。
    ccs min roundtrip cluster results
  • 4. コーディネーショニングノードは、各シャードに検索リクエストを送信します。自分のクラスター内のシャードも含まれます。各シャードは独立して検索リクエストを実行します。
    ネットワークの往復回数が最小限に抑えられない場合、検索はすべてのデータがコーディネーショニングノードのクラスターにあるかのように実行されます。このため、action.search.shard_count.limitpre_filter_shard_size、およびmax_concurrent_shard_requestsのような検索を制限するクラスター設定を更新することをお勧めします。これらの制限が低すぎると、検索が拒否される可能性があります。
    ccs dont min roundtrip shard search
  • 5. 各シャードは、検索結果をコーディネーショニングノードに返します。
    ccs dont min roundtrip shard results
  • 6. 各クラスターから結果を収集した後、コーディネーショニングノードはクロスクラスター検索応答で最終結果を返します。
    ccs min roundtrip client response

サポートされているクロスクラスター検索構成

8.0以降、Elasticはローカルクラスターから次のようなリモートクラスターへの検索をサポートしています:

  • 前のマイナーバージョン。
  • 同じバージョン。
  • 同じメジャーバージョン内の新しいマイナーバージョン。

Elasticは、メジャーバージョンの最後のマイナーバージョンを実行しているローカルクラスターから、次のメジャーバージョンの任意のマイナーバージョンを実行しているリモートクラスターへの検索もサポートしています。たとえば、ローカルの7.17クラスターは、任意のリモート8.xクラスターを検索できます。

リモートクラスターのバージョン
ローカルクラスターのバージョン 6.8 7.1–7.16 7.17 8.0 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 8.10 8.11 8.12 8.13 8.14 8.15
6.8 Yes Yes Yes No No No No No No No No No No No No No No No No
7.1–7.16 Yes Yes Yes No No No No No No No No No No No No No No No No
7.17 Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
8.0 No No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
8.1 No No No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
8.2 No No No No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
8.3 No No No No No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
8.4 No No No No No No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
8.5 No No No No No No No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
8.6 No No No No No No No No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
8.7 No No No No No No No No No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
8.8 No No No No No No No No No No Yes Yes Yes Yes Yes Yes Yes Yes Yes
8.9 No No No No No No No No No No No Yes Yes Yes Yes Yes Yes Yes Yes
8.10 No No No No No No No No No No No No Yes Yes Yes Yes Yes Yes Yes
8.11 No No No No No No No No No No No No No Yes Yes Yes Yes Yes Yes
8.12 No No No No No No No No No No No No No No Yes Yes Yes Yes Yes
8.13 No No No No No No No No No No No No No No No Yes Yes Yes Yes
8.14 No No No No No No No No No No No No No No No No Yes Yes Yes
8.15 No No No No No No No No No No No No No No No No No Yes Yes

EQL検索APIでは、ローカルクラスターとリモートクラスターは、7.17.7(含む)以前または8.5.1(含む)以前のバージョンを使用している場合、同じElasticsearchバージョンを使用する必要があります。

たとえば、ローカルの8.0クラスターは、リモートの7.17または任意のリモート8.xクラスターを検索できます。ただし、ローカルの8.0クラスターからリモートの7.16または6.8クラスターへの検索はサポートされていません。

すべての検索されたクラスターに存在する機能のみがサポートされています。機能がサポートされていないリモートクラスターで機能を使用すると、未定義の動作が発生します。

サポートされていない構成を使用したクロスクラスター検索は、まだ機能する可能性があります。ただし、そのような検索はElasticによってテストされておらず、その動作は保証されていません。

クロスクラスター検索のサポートを確保する

クラスターがクロスクラスター検索をサポートしていることを確認する最も簡単な方法は、各クラスターを同じElasticsearchバージョンに保つことです。異なるバージョンのクラスターを維持する必要がある場合は、次のことができます:

  • クロスクラスター検索専用のクラスターを維持します。このクラスターは、他のクラスターを検索するために必要な最も古いバージョンに保ちます。たとえば、7.17と8.xのクラスターがある場合、クロスクラスター検索のローカルクラスターとして使用するために専用の7.17クラスターを維持できます。
  • 各クラスターを1つのマイナーバージョン以上離さないようにします。これにより、クロスクラスター検索を実行する際に任意のクラスターをローカルクラスターとして使用できます。

アップグレード中のクロスクラスター検索

ローカルクラスターでローリングアップグレードを実行している間でも、リモートクラスターを検索することができます。ただし、ローカルコーディネーティングノードの「アップグレード元」と「アップグレード先」バージョンは、リモートクラスターのゲートウェイノードと互換性がある必要があります。

アップグレードの期間を超えて同じクラスター内で複数のバージョンのElasticsearchを実行することはサポートされていません。

アップグレードに関する詳細については、Elasticsearchのアップグレードを参照してください。