【发布时间】:2016-10-06 16:38:47
【问题描述】:
我正在尝试运行一个弹性搜索集群,每个 es 节点都在自己的容器中运行。这些容器使用ECS 部署在可能运行其他不相关容器的多台机器上。为了避免端口冲突,容器公开的每个端口都被分配了一个随机值。这些随机端口在所有运行的相同类型容器中是一致的。也就是说,所有运行的 es-node 容器都将 9300 端口映射到同一个随机数。
这是我正在使用的配置:
network:
host: 0.0.0.0
plugin:
mandatory: cloud-aws
cluster:
name: ${ES_CLUSTER_NAME}
discovery:
type: ec2
ec2:
groups: ${ES_SECURITY_GROUP}
any_group: false
zen.ping.multicast.enabled: false
transport:
tcp.port: 9300
publish_port: ${_INSTANCE_PORT_TRANSPORT}
cloud.aws:
access_key: ${AWS_ACCESS_KEY}
secret_key: ${AWS_SECRET_KEY}
region: ${AWS_REGION}
在这种情况下,_INSTANCE_PORT_TRANSPORT 是主机上 9300 绑定的端口。我已经确认上面使用的所有环境变量都设置正确。我还通过命令行 arg 将 network.publish_host 设置为主机的本地 IP。
当我强制 _INSTANCE_PORT_TRANSPORT(然后是 transport.publish_port)为 9300 时,一切正常,但一旦被赋予随机值,节点就无法再相互连接。我使用logger.discovery=TRACE 看到这样的错误:
ConnectTransportException[[][10.0.xxx.xxx:9300] connect_timeout[30s]]; nested: ConnectException[Connection refused: /10.0.xxx.xxx:9300];
at org.elasticsearch.transport.netty.NettyTransport.connectToChannelsLight(NettyTransport.java:952)
at org.elasticsearch.transport.netty.NettyTransport.connectToNode(NettyTransport.java:916)
at org.elasticsearch.transport.netty.NettyTransport.connectToNodeLight(NettyTransport.java:888)
at org.elasticsearch.transport.TransportService.connectToNodeLight(TransportService.java:267)
at org.elasticsearch.discovery.zen.ping.unicast.UnicastZenPing$3.run(UnicastZenPing.java:395)
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)
似乎一个节点绑定到的端口与它在尝试连接到其他节点时 ping 的端口相同。有什么办法可以让它们与众不同吗?如果不是,transport.publish_port 的意义何在?
【问题讨论】:
-
您能否将日志的开头发布到您启动的节点的
[.........][INFO ][node ] [My Node Name] started? -
会的。集群有两台机器,分别名为 Gateway 和 Doctor Spectrum。这里是两台机器的日志:gist.github.com/xavi-/6ecc4ba16b39680fb28c8fb25307bcc7
标签: elasticsearch docker elasticsearch-plugin