我一直在尝试使用可爱的ansible elasticsearch项目来建立一个九节点的elasticsearch集群。
每个节点都已启动并运行。。。但他们彼此之间没有交流。主节点认为没有数据节点。数据节点未连接到主节点。
它们都具有相同的cluster.name
。我尝试过启用多播(discovery.zen.ping.multicast.enabled: true
)和禁用多播(之前设置为false,discovery.zen.ping.unicast.hosts:["host1","host2",..."host9"]
),但在这两种情况下,节点都不通信。
他们之间有网络连接-通过9300端口的telnet进行验证。
样本输出:$ curl host1:9200/_cluster/health
{"error":{"root_cause":[{"type":"master_not_discovered_exception","reason":"waited for [30s]"}],"type":"master_not_discovered_exception","reason":"waited for [30s]"},"status":503}
我想不出他们为什么不联系的更多原因了——寻找更多的尝试想法。
编辑:我终于解决了这个问题。有效的设置是publish_host
到"_non_loopback:ipv4_"
,单播discovery.zen.ping.unicast.hosts
设置为["host1:9300","host2:9300","host3:9300"]
,仅列出专用主节点。我有一个最小的主节点计数2。
我认为可能导致这种行为的唯一原因是:
-
连接问题-Ping不是检查节点是否可以相互连接的好工具。使用telnet并尝试从主机1连接到端口9300上的主机2。
-
您的
elasticsearch.yml
设置为绑定127.0.0.1
或错误的主机(如果您不确定,请绑定0.0.0.0,看看这是否解决了您的连接问题,然后重要的是将其更改为仅绑定内部主机,以避免弹性搜索直接暴露在互联网上)。 -
您的publish_host不正确-当您在docker容器中运行ES时,通常会发生这种情况。例如,您需要确保publish_hhost设置为可以通过其他主机访问的地址。