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

本文记录了解决SpringBoot项目连接Elasticsearch异常NoNodeAvailableException的过程,包括检查IP、端口、版本匹配,以及解决maxfiledescriptors和thread数限制等问题。最终通过调整Elasticsearch配置文件实现远程服务器上的项目和本地项目的连接。
摘要由CSDN通过智能技术生成

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

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

elasticsearch:
  ip: 192.168.0.85
  port: 9300
  pool: 5
  cluster-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地址(配成本机地址,允许访问),如下:
在这里插入图片描述

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值