无法通过9300端口连接远程es集群

问题描述: 利用docker在远程主机上部署了一套es节点,在本地电脑上可以通过kibana连接成功,访问ip:9200可以访问成功,通过java客户端连接9300端口,操作失败报错内容为:
NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{o_MdofxbQCiafOWQNe0dVQ}{ip}{123.206.xxx.xxx:9300}] ]
解决:
1. 通过telnet ip 9300发现网络不通。elasticsearch连接远程服务器需要设置network.address参数。修改elasticsearch.yml将network.address设置为0.0.0.0
network.address: 0.0.0.0
增加该配置后,启动docker 报错:
max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解决:
sudo sysctl -w vm.max_map_count=655360
并用以下命令查看是否修改成功
sysctl -a | grep “vm.max_map_count”
修改配置文件
sudo vim /etc/sysctl.conf
加入:
vm.max_map_count=262144
docker启动成功后,通过java客户端连接依然报错
NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{o_MdofxbQCiafOWQNe0dVQ}{ip}{123.206.xxx.xxx:9300}] ]
原来在java代码中使用嗅探技术,java客户端会去嗅探es集群中的所有节点以便客户端使用,但在嗅探时发生错误造成操作失败。ps:为什么会嗅探失败暂未解决。
解决:
修改java代码将嗅探关闭,采用手动添加节点的方式后操作成功。
java代码:
@PostConstruct
public void initialize() throws Exception {
    Settings esSettings = Settings.builder()
            .put("cluster.name", esClusterName)
            // TODO 关闭网络嗅探 ,自动嗅探时会报错 原因没搞明白
            .put("client.transport.sniff", false).build();
    client = new PreBuiltTransportClient(esSettings);
    String[] esHosts = esHost.trim().split(",");
    // 循环添加配置中的各个es节点
    for (String host : esHosts) {
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host),
                esPort));
    }
}

连接远程的 Elasticsearch 8.7.0 需要使用 Java 客户端。以下是连接到 Elasticsearch 8.7.0 的示例代码: ```java import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestClient; import org.elasticsearch.common.settings.Settings; public class ElasticsearchClient { public static RestHighLevelClient createClient() { // 设置 Elasticsearch 集群的名称 String clusterName = "my-es-cluster"; // 设置 Elasticsearch 集群中的节点 IP 和端口 String host = "localhost"; int port = 9200; // 配置连接 Elasticsearch 的 RestClient RestClientBuilder builder = RestClient.builder(new HttpHost(host, port)) .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder .setDefaultCredentialsProvider(new BasicCredentialsProvider())) .setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder .setConnectTimeout(5000) .setSocketTimeout(60000)); // 配置连接 Elasticsearch 的 RestHighLevelClient RestHighLevelClient client = new RestHighLevelClient(builder); return client; } } ``` 在上面的代码中,我们使用 `RestClientBuilder` 构建了一个连接到 Elasticsearch 的 `RestHighLevelClient`,并设置了连接 Elasticsearch 的节点 IP 和端口连接超时时间、读取超时时间和认证信息。 在使用时,只需要调用 `createClient()` 方法即可创建一个连接到 Elasticsearch 的 `RestHighLevelClient` 对象: ```java RestHighLevelClient client = ElasticsearchClient.createClient(); ``` 注意,为了使用 Elasticsearch 的 Java API,还需要添加 Elasticsearch 的依赖,例如: ```xml <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.15.0</version> </dependency> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值