java elasticsearch api 本地连接线上集群 None of the configured nodes are available

项目开发告一段落,es 从公司内网正式转到线上集群,但是在本地测试总是连接不到线上的es 集群,但是打包发布后在线上服务器是正常的。曾经一度怀疑是代码的问题或是依赖报的问题,但是都我一一被否定。

java api 连接es 一般代码都是这样的:

  Settings esSetting = Settings.builder()
                    //集群名字
                    .put("cluster.name", clusterName)
                    //自动嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中
                    .put("client.transport.sniff", true)
                    //增加线程池个数,暂时设为5
                    .put("thread_pool.search.size", poolSize)
                    .build();
            //配置信息Settings自定义
            transportClient = new PreBuiltTransportClient(esSetting);
            transportClient.addTransportAddresses(new TransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port)));

如果连接多台服务器可以采用这种方法。

Client client = new TransportClient()  
            .addTransportAddress(newInetSocketTransportAddress("host1", 9300))  
            .addTransportAddress(newInetSocketTransportAddress("host2", 9300));

在连接 测试集群的代码也是没有任何问题的。

但是要链接线上集群却失败了,最终原因却是 “client.transport.sniff” 这个设置,

设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器。

但是es 嗅探的却是内网ip,我们linj连接的是外网ip,所以连接失败。

所以:当ES服务器监听使用内网服务器IP而访问使用外网IP时,不要使用client.transport.sniff为true,在自动发现时会使用内网IP进行通信,导致无法连接到ES服务器,要连接外网集群需要直接使用addTransportAddress方法进行指定ES服务器或者将client.transport.sniff设为false。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值