Elasticsearch のインデックスチューニング

freja-nelson-vDJ0LQJkp6s-unsplash.jpg

質問

Elasticsearch のインデックスチューニングはどのように行いますか?


解答

Elasticsearch のインデックスチューニングは、性能(検索速度、書き込み速度、安定性)、

メモリ効率、容量効率を最大化するための重要な作業です。


特に “デフォルト設定のまま大量データを入れる” と、検索・集約が急に遅くなったり、クラスタが不安定になりがちです。

以下では、現場でよく使われる実践的なインデックスチューニング手法 を体系的に解説します。


1. シャードとレプリカの適正化(最重要)

(1) プライマリシャード数の決め方

原則:

1インデックスあたり シャード数を少なくする

  • 小規模なら 1 シャード

  • 中規模(100GB超〜数百GB)なら 1〜3 シャード

  • 巨大(数TB)でようやく複数(5〜10など)

シャードが多すぎると

  • JVMヒープを無駄に消費

  • オーバーヘッド増加

  • クラスタ不安定化

  • 検索性能低下

よって、「多いほど良い」は間違いです。


(2) レプリカ数の決め方

  • 高可用性:1(最も一般的)

  • 読み取り性能重視:2以上

  • 開発用途:0


2. マッピング(Mapping)の最適化

Mapping は性能に大きく影響します。

(1) 動的マッピング(dynamic)を禁止する

"dynamic": false

を基本とし、フィールド定義を明示する。

理由:

  • 意図しないフィールド生成がパフォーマンス劣化を招く

  • フィールドが増えると inverted index が肥大化


(2) 不要なフィールドを index しない

ログやJSON入力では余計なフィールドが大量に入ることが多い。

"index": false

or

"enabled": false

とすることで 検索対象外にして負荷軽減


(3) keywordtext の誤用を避ける

  • text → 全文検索向け、トークナイズされる

  • keyword → 完全一致、集約用、ソート用

原則:

  • ログ・ID・タグは keyword

  • 長文は text

  • 不要な text は作らない


(4) 正しい analyzer の選択

  • 日本語:kuromoji

  • 英語:standard / whitespace

  • 特殊用途:n-gram / edge-ngram

誤った analyzer は検索精度と速度を悪化させます。


3. インデックス設定のチューニング

(1) Refresh Interval を伸ばす

デフォルトは 1秒 (高頻度 refresh)

書き込み重視なら:

"refresh_interval": "30s"

あるいは bulk import 中だけ:

"refresh_interval": -1

にして refresh を無効化。


(2) index.translog.durability を async にする

書き込み性能向上(ただしクラッシュ時に最新変更が失われる可能性あり)

"index.translog.durability": "async"

(3) merge のチューニング(Luceneレベル)

大型環境では merge は性能に大きく影響。

例:スループット重視の設定(公式推奨の一例)

"index.merge.policy.max_merged_segment": "5gb","index.merge.scheduler.max_thread_count": 1

4. データ構造のチューニング

(1) doc_values の有無を制御

集約・ソート用の値が必要な keyword フィールドには有効だが、
長文 text フィールドでは不要。

"doc_values": false

でメモリ節約できる。


(2) フィールド数を制限する

大量のフィールドを持つと検索遅延が発生。

"index.mapping.total_fields.limit": 2000

などで制限可能。


(3) nested は必要なときのみ使う

nested は非常に重い。
巨大な array を無理に nested にしない。


5. ライフサイクル管理(ILM)を使う

大量ログ・時系列データでは Indices Lifecycle Management が有効。

例:

  • Hot:高速書き込み用

  • Warm:検索主体

  • Cold:滅多に使わない

  • Delete:一定期間後に削除

ILMにより:

  • シャード数削減

  • 圧縮ルール

  • アーキテクチャ最適化

が自動化される。


6. クエリのチューニング

(1) match_all の使用に注意

巨大インデックスで match_all は危険(膨大なスキャン)。

(2) 適切なフィルタを使う

filter はスコア計算なしで高速。

(3) track_total_hits: false

件数を正確に数えないことで高速化。


7. ハードウェア・OSレベルのチューニング

  • JVMヒープはメモリの 50% かつ最大32GB

  • スワップを無効化

  • NVMe SSD 推奨

  • max_map_count を適切に調整

  • ノードの役割分離(master/data/ingest)


まとめ:最も効果のあるチューニング Top 5

  1. シャード数を適正化(1〜3シャード推奨)

  2. mapping を明示し、不要なフィールドは index しない

  3. refresh_interval を延長( bulk 時は -1)

  4. keyword/text の選択を厳密にする

  5. ILM を使い運用を自動化

実務的には、これらの調整だけで 検索速度が2〜10倍改善
クラスタ安定性も大きく向上します。





Elastic Stack実践ガイド[Logstash/Beats編]【電子書籍】[ 日比野 恒 ]

価格:3850円
(2025/12/11 19:57時点)
感想(0件)


すべてわかる仮想化大全 2016(日経BP Next ICT選書)【電子書籍】

価格:2970円
(2025/11/2 23:01時点)
感想(0件)


 



この記事へのコメント

広告です。クリックいただけると励みになります。