从节点请求Elasticsearch超时
我正在设置一个简单的Node.js REST服务来与Elasticsearch接口,使用官方的Javascript客户端。 我在本地运行此代码,但群集位于远程。 当我通过浏览器,使用_head
插件,我可以连接ES和查询没有问题。 但是,通过Javascript客户端这样做超时了所有请求。 我设置了ElasticSearch对象,但是发送任何请求都不起作用。 我不认为这是一个networking问题,因为我可以通过浏览器访问ES。 这就是我要求的东西,一个非常基本的东西:
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.
我在这里错过了什么? 我读过客户端文档,这看起来像客户端的基本“你好世界”。
尝试在实例化ES客户端时扩展requestTimeout参数。
client = new elasticsearch.Client({ host : 'http://localhost:9200', requestTimeout: 60000 });
我有一个长达10分钟的漫长过程。 通过使requestTimeout值为60000(10分钟),过程可以完成而不超时。
由于sniffOnStart,我们在QBox上也有这个问题。 试试这个configuration:
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" });
在这里检查这个问题: https : //github.com/elastic/elasticsearch-js/issues/186
我想我们需要使用上面提到的requestTimeout
variables。
关于弹性search超时,您需要区分两种types的超时:
-
初始化超时 :初始化ES:
requestTimeout
,pingTimeout
默认为30000ms。 阅读更多: 弹性search文档中的configuration文档 -
基于操作的超时 :
bulk
,create
,delete
,index
等许多操作也可以设置timeout
。 说如果你有一个巨大的批量对象插入,你可以设置基于操作的超时: 弹性search文档
您应该知道基于操作的超时会覆盖初始化的RequestTimeout
。