转自: https://blog.csdn.net/itfootball/article/details/53637238
问题描述
为了提高保存数据到es消耗的时间,采取积攒到3000条文档的时候才保存到ES中,之前一直没有问题,昨天新上了几个log服务器后,经常会发现保存失败报如下错误:
No alive nodes found in your cluster
首先我要说这个错误真坑啊,以这个关键字搜索问题,花了两天也没解决,后来无意中翻墙搜google,网后翻了好几页看到上面的参考文章,才知道,原来真正的错误信息隐藏在ES-PHP的Connection类中,代码如下:
添加var_dump($response['error']->getMessage());一行代码来输出一下错误信息,错误信息如下:
cURL error 55: Send failure: Broken pipe
首先觉得是curl的bug,所以我升级到了最新版本,发现问题还在,然后我调整3000条文档一保存改为500条,发现保存是没问题的,后来我怀疑是curl的body体是不是对大小有限制,但是经过询问得到的回复是没有这方面的限制,但是组长给我了一个提示,curl没有限制,可能是接收方有限制,这个提示给我了新方向,查了一下es果然有配置,配置项为http.max_content_length,默认为100M,然后我尝试了发送不同大小的数据看反应。
第一次:141M,报错
第二次: 40M,保存成功
然后我跟es维护人员确认一下http.max_content_length确实是100M,由此问题定位成功,原因也知道了
解决方法
1.一次性保存500条数据,确保一次性存储数据量不超过100M
2.由原来的VIP(一个host)改为几点IP(多host),这样做的好处是可以重试多次。
查询问题:
最近使用 php cli模式 需要不断查询es内容, 也发现一直 :
No alive nodes found in your cluster
根据上文的办法 设置断点后,出现错误如下:
CURL ERROR: Recv failure: Connection reset by peer
当时想就是连接的问题, 可能存在连接复用上面存在问题, 查阅了下文档,在使用 es的client部分添加如下代码
<?php while(true) { //.... $params = []; //关键部分 if (!$this->client->ping()) { $hosts = array($this->elasticsearch_host); $this->client = ClientBuilder::create()->setHosts($hosts)->setSSLVerification(false)->build(); } $result = $this->client->search($params); //..... }
搞定。