Elasticsearch: CircuitBreakingException
Elasticsearchのメモリ保護機能(サーキットブレーカー)が発動した際のエラー原因と解決策
概要
Elasticsearchがメモリ不足を防ぐためにリクエストを拒否するサーキットブレーカー機能が発動した際のエラーです。
エラーメッセージ
``` CircuitBreakingException: [parent] Data too large, data for [<http_request>] would be [1234567890/1.1gb], which is larger than the limit of [1073741824/1gb], real usage: [1073741824/1gb], new bytes reserved: [123456789/117mb] ```
原因
- クエリ結果が大きすぎる: 大量のドキュメント取得
- Aggregationの複雑さ: 高カーディナリティフィールドの集計
- ヒープメモリ不足: JVMヒープサイズが小さい
- 同時リクエスト過多: 複数の重いクエリが同時実行
解決策
1. クエリを最適化
```json // 悪い例: 全件取得 GET /logs/_search { “size”: 100000 }
// 良い例: scroll APIまたはsearch_after GET /logs/_search?scroll=1m { “size”: 1000, “sort”: ["_doc"] } ```
2. Aggregationを制限
```json // 悪い例: 高カーディナリティのterms { “aggs”: { “users”: { “terms”: { “field”: “user_id”, “size”: 1000000 } } } }
// 良い例: サイズ制限とfilter { “aggs”: { “users”: { “terms”: { “field”: “user_id”, “size”: 100 } } } } ```
3. サーキットブレーカー設定を調整
```yaml
elasticsearch.yml
indices.breaker.total.limit: 70% indices.breaker.request.limit: 40% indices.breaker.fielddata.limit: 30% ```
4. ヒープサイズを増加
```bash
jvm.options
-Xms8g -Xmx8g ```
よくある間違い
- サーキットブレーカーを無効化
- ヒープサイズを32GB以上に設定(圧縮ポインタが無効化)
- fielddataを多用
関連エラー
関連エラー
Elasticsearch の他のエラー
この記事は役に立ちましたか?