Elastic提示错误no Elasticsearch node available
问题
golang 使用 github.com/olivere/elastic 包进行连接 远程 es 或者docker搭建的es时(只要golang所在主机与es所在主机不同),报错信息如下
no active connection found: no Elasticsearch node available
原因
如果您elastic
不禁用嗅探功能,则Golang客户端将在后台运行进程,该进程/_nodes
每15分钟轮询一次API(上面的URL)并维护正常节点列表。如果没有健康的节点,则以该错误结束。
您的集群配置有私有IP时,也会发生这种情况(注意:我们在OP上进行了调试,我们调试了问题)(因此在/_nodes
API输出中,您看到的是私有IP,而不是公共IP)。
具有嗅探功能的客户端开始轮询,获取节点列表并尝试连接到专用IP,但由于该节点无响应(甚至无法在客户端所在的网络中解决)而收到HTTP错误。因此,它标志着它已经死了并发展到另一个。
当群集中没有其他节点时,它将报告no active connection found: no Elasticsearch node available
。
解决方案
查看node信息
1 | curl -s -XGET 'http://localhost:9200/_nodes/http?pretty=true' |
可以看到对应信息
1 | curl -s -XGET 'http://localhost:9200/_nodes/http?pretty=true’ |
发现 publish_address(172.17.0.2) 地址是一个内网地址,无法正常访问,所以 会报错上面的信息,无可用的node节点.
方案一
1 | esClient, err := elastic.NewClient( |
新增参数 elastic.SetSniff(false)
, 用于关闭 Sniff
方案二
调整es node 的 publish_address 配置
新增 network.publish_host: 127.0.0.1, 整体配置文件如下:
[root@e33229400bf1 config]# cat elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
network.publish_host: 127.0.0.1 # 新增配置项
参考文章
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 螃蟹壳!