問題の説明
- キーワードに基づいてデータをクエリする場合、前回は検索できますが、再度クエリを実行しても検索されない場合があります(データが書き込まれた直後に表示されます)
- 一般的なクエリインターフェースを使用すると、クエリの数が不安定になります(データが書き込まれた直後に表示されます)
概要:データ消費量がESに書き込まれた後、更新サイクル(大量のデータの場合は通常30秒または60秒)の後、データはバッチで処理され、セグメントとインデックスプレフィックスが生成されます。これらは外部からクエリできますが、クエリは実行されません安定した状態。通常、安定するまで1分を超えません。
原因分析
Elasticsearchのインデックスシャードには、プライマリシャードとレプリカの2つの属性があり、レプリカの機能はフェイルオーバーと負荷分散です。
フェイルオーバー:プライマリー断片が配置されているホストまたはノードに障害が発生すると、レプリカは自動的にプライマリー断片にアップグレードされます。
負荷分散:プライマリシャードとレプリカの両方で、外部から同じクエリ機能を提供します。
データが書き込まれると、最初にメインスライスに書き込まれ、次にメインスライスから対応するインデックススライスに同期されます。この期間に複数のクエリが実行されると、esは負荷分散を実行し、クエリタスクを実行するプライマリシャードまたはレプリカをランダムに選択します。このとき、レプリカにはデータがなく、クエリは不安定になります。
解決
ESは、バージョン5.5で以下のパラメーターを持つ設定照会モード設定を提供します。
- _primaryはプライマリシャードでのみクエリされます
- _primary_first最初にプライマリシャードでクエリを実行します。プライマリシャードが利用できない場合やクエリが失敗した場合は、レプリカでクエリを実行します
- レプリカでの_replicaクエリのみ
- _replica_firstレプリカで最初にクエリを実行します。レプリカが利用できない場合やクエリが失敗した場合は、プライマリシャードでクエリを実行します。
- _localローカルシャードが使用可能な場合、クエリは最初にローカルシャードで実行されます
- _prefer_nodes:abc、xyzは、指定されたIDのノードを優先的に照会します
- _shards:2、3指定されたIDのシャードでクエリする優先度
- _only_nodesは特定のノードでの操作の実行に制限されています
- カスタム(文字列)値
ほとんどの場合、プリファレンス関数を意図的に使用する必要はありません。
現在のデータシナリオによると、primary_firstまたはreplica_firstを使用してクエリの不安定性を解決できますが、クラスターのクエリ圧力が高まり、負荷分散機能を使用できません。