回路ブレーカーエラー

Elasticsearchは、ノードがJVMヒープメモリを使い果たすのを防ぐために回路ブレーカーを使用します。Elasticsearchが操作が回路ブレーカーを超えると推定した場合、その操作を停止し、エラーを返します。

デフォルトでは、親回路ブレーカーはJVMメモリ使用量が95%に達したときにトリガーされます。エラーを防ぐために、使用量が85%を一貫して超える場合は、メモリ圧力を軽減するための手段を講じることをお勧めします。

回路ブレーカーエラーの診断

エラーメッセージ

リクエストが回路ブレーカーをトリガーすると、Elasticsearchは429 HTTPステータスコードを持つエラーを返します。

Js

  1. {
  2. 'error': {
  3. 'type': 'circuit_breaking_exception',
  4. 'reason': '[parent] Data too large, data for [<http_request>] would be [123848638/118.1mb], which is larger than the limit of [123273216/117.5mb], real usage: [120182112/114.6mb], new bytes reserved: [3666526/3.4mb]',
  5. 'bytes_wanted': 123848638,
  6. 'bytes_limit': 123273216,
  7. 'durability': 'TRANSIENT'
  8. },
  9. 'status': 429
  10. }

Elasticsearchはまた、回路ブレーカーエラーをelasticsearch.logに書き込みます。これは、割り当てなどの自動化プロセスが回路ブレーカーをトリガーしたときに役立ちます。

Txt

  1. Caused by: org.elasticsearch.common.breaker.CircuitBreakingException: [parent] Data too large, data for [<transport_request>] would be [num/numGB], which is larger than the limit of [num/numGB], usages [request=0/0b, fielddata=num/numKB, in_flight_requests=num/numGB, accounting=num/numGB]

JVMメモリ使用量の確認

Stack Monitoringを有効にしている場合、KibanaでJVMメモリ使用量を表示できます。メインメニューでStack Monitoringをクリックします。Stack Monitoringの概要ページでノードをクリックします。JVMヒープ列には、各ノードの現在のメモリ使用量が表示されます。

また、cat nodes APIを使用して、各ノードの現在のheap.percentを取得することもできます。

Python

  1. resp = client.cat.nodes(
  2. v=True,
  3. h="name,node*,heap*",
  4. )
  5. print(resp)

Ruby

  1. response = client.cat.nodes(
  2. v: true,
  3. h: 'name,node*,heap*'
  4. )
  5. puts response

Js

  1. const response = await client.cat.nodes({
  2. v: "true",
  3. h: "name,node*,heap*",
  4. });
  5. console.log(response);

Console

  1. GET _cat/nodes?v=true&h=name,node*,heap*

各回路ブレーカーのJVMメモリ使用量を取得するには、node stats APIを使用します。

Python

  1. resp = client.nodes.stats(
  2. metric="breaker",
  3. )
  4. print(resp)

Ruby

  1. response = client.nodes.stats(
  2. metric: 'breaker'
  3. )
  4. puts response

Js

  1. const response = await client.nodes.stats({
  2. metric: "breaker",
  3. });
  4. console.log(response);

Console

  1. GET _nodes/stats/breaker

回路ブレーカーエラーの防止

JVMメモリ圧力の軽減

高いJVMメモリ圧力は、しばしば回路ブレーカーエラーを引き起こします。高いJVMメモリ圧力を参照してください。

textフィールドでのフィールドデータの使用を避ける

高カーディナリティのtextフィールドでは、フィールドデータが大量のJVMメモリを使用する可能性があります。これを避けるために、Elasticsearchはデフォルトでtextフィールドでのフィールドデータを無効にします。フィールドデータを有効にしていて、フィールドデータ回路ブレーカーをトリガーした場合は、それを無効にし、keywordフィールドを使用することを検討してください。fielddataマッピングパラメータを参照してください。

フィールドデータキャッシュのクリア

フィールドデータ回路ブレーカーをトリガーし、フィールドデータを無効にできない場合は、clear cache APIを使用してフィールドデータキャッシュをクリアします。これにより、フィールドデータを使用する進行中の検索が中断される可能性があります。

Python

  1. resp = client.indices.clear_cache(
  2. fielddata=True,
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.clear_cache(
  2. fielddata: true
  3. )
  4. puts response

Js

  1. const response = await client.indices.clearCache({
  2. fielddata: "true",
  3. });
  4. console.log(response);

Console

  1. POST _cache/clear?fielddata=true