我在AWS上设置了一个elasticsearch节点集群.群集包含3个节点.节点位于ELB(Elastic Load平衡器)后面. ELB的DNS名称为“a.b.c.com”.
我能够成功地执行以下操作:
curl -XGET 'http://a.b.c.com:9200/_cat/nodes'
这证明权限和路由正常工作.
当我尝试将我的Java应用程序服务器连接到Elasticsearch时,它失败并出现以下错误:
org.elasticsearch.transport.ReceiveTimeoutTransportException: [][inet[a.b.c.com/172.31.27.110:9300]][cluster:monitor/nodes/info] request_id [57] timed out after [10000ms]
at org.elasticsearch.transport.TransportService$TimeoutHandler.run(TransportService.java:366)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
无论我是否增加client.transport.ping_timeout,都会发生这种情况.
我用来连接的java代码如下:
Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", clusterName).put("client.transport.ping_timeout", 10000).build();
client = new TransportClient(settings);
TransportClient transportClient = (TransportClient)client;
transportClient.addTransportAddress(new InetSocketTransportAddress(instance, esPort));
实例= “a.b.c.com”
esPort = 9300(我也尝试过9200)
提前帮忙解决问题.
最佳答案 这是对未来寻找任何可怜的灵魂的答案:
您的ES节点在9300上运行,并且您的安全组在该实例上打开以允许来自您的应用服务器的连接.
但ELB有自己的安全组.所以你需要这样做:
在ELB上设置SG以允许从您的应用服务器进行连接.
在ES实例上设置SG以允许从ELB进行连接.
并在你的ES实例上设置SG以允许自己的9300流量 – 一旦他们发现彼此,他们需要能够与自己交谈!