【问题标题】:Overriding `tcp.publish_port` breaks clustering when elasticsearch is in a container当 elasticsearch 在容器中时,覆盖 `tcp.publish_port` 会破坏集群
【发布时间】: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


【解决方案1】:

discovery-ec2 插件的工作方式是它使用 AWS EC2 API 收集 IP 地址列表并将此列表用作节点的单播列表。

但它不会从正在运行的集群中收集任何信息。显然节点还没有连接! 所以它对其他节点的publish_port一无所知。

它只是添加了一个 IP 地址。就这样。 Elasticsearch 然后is using the default port 是 9300。

因此,IMO 无法在短时间内解决此问题。

但我们可以想象添加一个与 Google Compute Engine 实现的功能接近的新功能。我们使用特定的元数据从 GCE API 获取此端口。

我们可以为 Azure 和 EC2 做同样的事情。你想open an issue 以便我们跟踪工作吗?

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 2015-04-22
    • 2016-08-04
    • 2021-12-15
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多