问题描述: 利用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)); } }
评论区