记一次java连接es报错棘手的问题

编程入门 行业动态 更新时间:2024-10-21 22:59:00

记一次java连接es报错<a href=https://www.elefans.com/category/jswz/34/1764338.html style=棘手的问题"/>

记一次java连接es报错棘手的问题

最近项目中要用到es中间件,本地项目java代码一直连接不上es,一直都在报NoNodeAvailableException[None of the configured nodes are available: [{#tran 这个错,各种百度各种乱七八糟的答案都试过还是无济于事。

项目中的es配置文件如下:

elasticsearch:ip: 192.168.0.85port: 9300pool: 5cluster-name: elasticsearch

综合分析,最可能出现问题的地方只能是ip了:

浏览器是能访问的通的,程序却死活连不上,后面看到网上一种说法是es版本和项目中依赖版本对不上,发现确实有这方面的原因,值得注意:

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version><relativePath/></parent><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>6.2.4</version></dependency><dependency><groupId>org.elasticsearch.plugin</groupId><artifactId>transport-netty4-client</artifactId><version>6.2.4</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>6.2.4</version></dependency>

可以看到,项目中用的es版本是6.2.4,springboot版本是2.1.6.RELEASE。

值得注意的是,项目中es版本需要和springboot相对应,对应关系可以百度,我这里是对应上了的,那就是es依赖版本和安装的版本对不上的问题了,事实上一开始我连接的es版本是7.7.0的,确实存在问题,后面重新安装了6.2.4版本的es,本以为这样就大功告成了,然而事实却是那么的残酷,项目依然报楼上同样的错误。然后又是一顿百度各种找错,搞了一天还是没解决。

后面开始考虑到es是在服务器上安装的,本地程序可能连接不到,浏览器连的是9200端口,程序中用的是9300端口,事实上这种想法也是不对的,真正的问题还是出在ip上,公网ip和本地电脑并不在同一个局域网中,本地程序连接的es在公网(服务器)ip中,所以无法连接。

如上图,程序要连接服务器上的es需要指定本地ip地址,并且需要把程序放在服务器上,才能访问。后面按照这个思路尝试了下,虽然中间又遇到一些棘手的问题(下面再说),但项目还是成功启动并且可以顺利访问redis了。

至于楼上说的棘手的问题就是:

max file descriptors [65535] for elasticsearch process is too low

Elasticsearch6.4修改配置文件./bin/elasticsearch.yml的network.host:0.0.0.0,启动报:max number of threads [2048] for user [es] is too low, increase to at least [4096]

楼上这两个主要的问题,网上其实有解决方案,但是可能有时候并不好使,对此整理出解决方案如下:

按照如下步骤安装es

  1. 创建 elasticsearch 用户组

命令:groupadd elasticsearch

useradd es

passwd es (设置es用户的密码,这个密码要在8个字符以上,如果设置不了是因为密码过于简单需要英文数字混搭)

  1. 用户es 添加到 elasticsearch 用户组

usermod -G elasticsearch es

visudo

在root ALL=(ALL) ALL 一行下面

  1. 添加es用户 如下:

es ALL=(ALL) ALL

4.添加成功保存后切换到es用户操作

su es

4.1将elasticsearch-6.2.4.tar.gz放到临时文件/tmp下

  1. 2解压

命令:tar -xvf elasticsearch-6.2.4.tar.gz

sudo mv elasticsearch-6.2.4 /usr/local

cd /usr/local/

sudo chown -R es:elasticsearch elasticsearch-6.2.4

5.修改配置文件

命令:cd elasticsearch-6.2.4/

​ vi config/elasticsearch.yml

在最下面添加:

bootstrap.memory_lock: false

bootstrap.system_call_filter: false

cluster.name: elasticsearch

http.port: 9200

node.data: true

node.ingest: true

node.master: true

node.max_local_storage_nodes: 1

node.name: PS2019GDHUSURG

path.data: /usr/local/elasticsearch-6.2.4/data

path.logs: /usr/local/elasticsearch-6.2.4/logs

transport.tcp.port: 9300

network.host: 0.0.0.0

http.cors.enabled: true

http.cors.allow-origin: “*”

\5. 切换回root用户

命令:su root

输入密码

然后修改文件

命令:vi /etc/sysctl.conf

在文件最后添加内容

vm.max_map_count=262144

保存退出

sysctl -p

\6. 修改文件/etc/security/limits.conf

命令:vi /etc/security/limits.conf

在最后添加

  • hard nofile 65536

* soft nofile 65536

* soft nproc 2048

* hard nproc 4096

\7. 切换回es用户 启动es

命令:su es

cd /usr/local/elasticsearch-6.2.4/

bin/elasticsearch -d

按上面步骤安装好es后就可以在项目中使用了,注意ip地址为局域网ip,即本地ip

虽然服务上的项目可以访问es,但是本地项目依然报最开始NoNodeAvailableException[None of the configured nodes are available: [{#tran 这个错,不过很快也解决了,之前一直把思路放在服务器上了,既然服务器上的项目需要访问服务器的es,那么本地的项目肯定也要访问本地的es,于是在自己电脑上安装了对应版本的es,值得注意的是,即便如此,ip需要指定为localhost才能访问,用127.0.0.1依然会报错,简直了。

虽然最后本地项目也可以连本地windows端的es了,但是还是心有不甘,为什么本地项目就连不了本地虚拟机上的es呢,最后经过一番探索,发现其实也是可以连的,只需要修改es的elasticsearch.yml配置文件,修改访问端口与host地址(配成本机地址,允许访问),如下:

至此,终于大功告成了!!!

更多推荐

记一次java连接es报错棘手的问题

本文发布于:2024-02-19 13:11:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1763901.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:棘手   报错   java   es

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!