连接的端口不是配置的端口,而且连接不上
遇到的问题是:我需要连接的是19301端口,但是提示的报错一直在连接19401端口connect timeout,而本机只开了19301端口
原因:设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中。这样做的好处是,一般你不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器
当ES服务器监听(publish_address )使用内网服务器IP,尽量不要设置client.transport.sniff为true。不设置client.transport.sniff时,默认为false(关闭客户端去嗅探整个集群的状态)。因为在自动发现时会使用内网IP进行通信,导致无法连接到ES服务器。因此此时需要直接使用addTransportAddress方法把集群中其它机器的ip地址加到客户端中。
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.net.UnknownHostException;
@Slf4j
@Component
public class EsUtil {
@Value("${elasticsearch.clusterNodes}")
private String clusterNodes;
@Value("${elasticsearch.clusterName}")
private String clusterName;
public TransportClient createClient() throws Exception {
System.setProperty("es.set.netty.runtime.available.processors", "false");
// client.transport.sniff 为true开启集群嗅探,如果有其它端口也会去建立连接
/*Settings settings = Settings.builder().put("cluster.name", clusterName)
.put("client.transport.sniff", true)
.put("thread_pool.search.size", Integer.parseInt("20")).build();*/
Settings settings = Settings.builder().put("cluster.name", clusterName)
.put("client.transport.sniff", false)
.put("thread_pool.search.size", Integer.parseInt("20")).build();
TransportClient client = client = new PreBuiltTransportClient(settings);
try{
if (clusterNodes != null && !"".equals(clusterNodes)) {
for (String node : clusterNodes.split(",")) {
String[] nodeInfo = node.split(":");
client.addTransportAddress(new TransportAddress(InetAddress.getByName(nodeInfo[0]), Integer.parseInt(nodeInfo[1])));
}
}
}catch (Exception e){
log.error("初始化ES连接出现异常===" + (e.getMessage() == null ? e.getMessage():e.getCause()));
}
return client;
}
}