公式のJavascriptクライアントを使用して、Elasticsearchとインターフェースする簡単なNode.js RESTサービスを設定しています。このコードをローカルで実行していますが、クラスターはリモートにあります。トラフに行くとブラウザ、_head
プラグインを使用すると、問題なくESに接続してクエリを実行できます。ただし、Javascriptクライアントを介して接続すると、すべてのリクエストがタイムアウトします。ElasticSearchオブジェクトを設定しましたが、リクエストを送信すると、動作しません。ブラウザからESにアクセスできるので、ネットワークの問題だとは思いません。これは、非常に基本的なgetで何かを要求する方法です。
var elasticsearch = require("elasticsearch");
var es = new elasticsearch.Client({
Host: "https://my-address:9200/", // also tried without protocol part and trailing slashes
log: "error",
sniffOnStart: true
});
es.get({
index: "things",
type: "someThing",
id: "42"
}).then(doSomeStuff, handleStuffFailed);
これは単純なエラーメッセージErrror: Request timeout after 30000ms.
で失敗します
ここで何か不足していますか?私はクライアントのドキュメントを読みましたが、これはクライアントの基本的な「Hello World」のようです。
ESクライアントをインスタンス化するときにrequestTimeoutパラメータを拡張してみてください。
client = new elasticsearch.Client({
Host : 'http://localhost:9200',
requestTimeout: 60000
});
10分弱かかる長時間のプロセスがありました。 requestTimeout値を60000(10分)にすることで、プロセスはタイムアウトせずに完了することができます。
sniffOnStartのため、QBoxでもこの問題が発生しました。この設定で試してください:
var es = new elasticsearch.Client({
Host: "my-address:9200",
log: "trace",
sniffOnStart: true
});
追加されたノードのIPがプライベートIPであることがわかります。私たちの側では、次のようにスニッフィングを無効にし、パブリックノードのホストアドレスの配列を手動で追加することにしました。
var es = new elasticsearch.Client({
hosts: ["my-address1:9200", "my-address2:9200", "my-address3:9200"],
log: "error"
});
エラスティック検索のタイムアウトについては、2つのタイプのタイムアウトを区別する必要があります。
初期化タイムアウト:ESを初期化するとき:requestTimeout
、pingTimeout
両方ともデフォルトで30000msです。続きを読む: エラスティック検索ドキュメントの構成ドキュメント
操作ベースのタイムアウト:bulk
、create
、delete
、index
などの多くの操作は、timeout
も設定できます。挿入する巨大なバルクオブジェクトがある場合は、操作ベースのタイムアウトを設定できます。 Elastic Search documentation
操作ベースのタイムアウトにより、initializationRequestTimeout
が上書きされることを知っておく必要があります。
この問題については、こちらを確認してください: https://github.com/elastic/elasticsearch-js/issues/186
上記のようにrequestTimeout
変数を使用する必要があると思います。
見えたら以下の項目をチェック
検出:30000ms後のリクエストタイムアウト