回路ブレーカーエラー
Elasticsearchは、ノードがJVMヒープメモリを使い果たすのを防ぐために回路ブレーカーを使用します。Elasticsearchが操作が回路ブレーカーを超えると推定した場合、その操作を停止し、エラーを返します。
デフォルトでは、親回路ブレーカーはJVMメモリ使用量が95%に達したときにトリガーされます。エラーを防ぐために、使用量が85%を一貫して超える場合は、メモリ圧力を軽減するための手段を講じることをお勧めします。
回路ブレーカーエラーの診断
エラーメッセージ
リクエストが回路ブレーカーをトリガーすると、Elasticsearchは429
HTTPステータスコードを持つエラーを返します。
Js
{
'error': {
'type': 'circuit_breaking_exception',
'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]',
'bytes_wanted': 123848638,
'bytes_limit': 123273216,
'durability': 'TRANSIENT'
},
'status': 429
}
Elasticsearchはまた、回路ブレーカーエラーをelasticsearch.log
に書き込みます。これは、割り当てなどの自動化プロセスが回路ブレーカーをトリガーしたときに役立ちます。
Txt
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
resp = client.cat.nodes(
v=True,
h="name,node*,heap*",
)
print(resp)
Ruby
response = client.cat.nodes(
v: true,
h: 'name,node*,heap*'
)
puts response
Js
const response = await client.cat.nodes({
v: "true",
h: "name,node*,heap*",
});
console.log(response);
Console
GET _cat/nodes?v=true&h=name,node*,heap*
各回路ブレーカーのJVMメモリ使用量を取得するには、node stats APIを使用します。
Python
resp = client.nodes.stats(
metric="breaker",
)
print(resp)
Ruby
response = client.nodes.stats(
metric: 'breaker'
)
puts response
Js
const response = await client.nodes.stats({
metric: "breaker",
});
console.log(response);
Console
GET _nodes/stats/breaker
回路ブレーカーエラーの防止
JVMメモリ圧力の軽減
高いJVMメモリ圧力は、しばしば回路ブレーカーエラーを引き起こします。高いJVMメモリ圧力を参照してください。
text
フィールドでのフィールドデータの使用を避ける
高カーディナリティのtext
フィールドでは、フィールドデータが大量のJVMメモリを使用する可能性があります。これを避けるために、Elasticsearchはデフォルトでtext
フィールドでのフィールドデータを無効にします。フィールドデータを有効にしていて、フィールドデータ回路ブレーカーをトリガーした場合は、それを無効にし、keyword
フィールドを使用することを検討してください。fielddata
マッピングパラメータを参照してください。
フィールドデータキャッシュのクリア
フィールドデータ回路ブレーカーをトリガーし、フィールドデータを無効にできない場合は、clear cache APIを使用してフィールドデータキャッシュをクリアします。これにより、フィールドデータを使用する進行中の検索が中断される可能性があります。
Python
resp = client.indices.clear_cache(
fielddata=True,
)
print(resp)
Ruby
response = client.indices.clear_cache(
fielddata: true
)
puts response
Js
const response = await client.indices.clearCache({
fielddata: "true",
});
console.log(response);
Console
POST _cache/clear?fielddata=true