我在3台AWS主机上的docker容器中运行3节点Elasticsearch 2.1群集。 除了其他一些东西之外,Elasticsearch.yml还包含以下内容:
network.host: 0.0.0.0
discovery.type: "ec2"
discovery.ec2.ping_timeout: "30s"
discovery.zen.ping.multicast.enabled: false
cloud.aws.access_key: ...
cloud.aws.secret_key: ...
cloud.aws.region: ...
在命令行中我有:
-Des.network.bind_host=0.0.0.0 -Des.cluster.name=XXX -Des.node.name=XXX-1 (up to -XXX-3)
数据存储在动态安装在节点启动的EBS卷上;已安装AWS Cloud Plugin。
一切正常,包括重启和更新,直到整个系统通过一般网络问题。不知道那里发生了什么。 之后,每个节点启动,声称它在XXX集群中运行,但声明自己为主节点:
[cluster.service] [XXX-3] new_master {XXX-3} {5oQHbq_KS8-JrIuFfTTBdw} {192.168.AAA.BB} {192.168.CCC.DD:9300}, 原因:zen-disco-join(elections_as_master,[0]加入收到)" }
我通过在其中一个主机上设置network.host: _ec2_
来成功解决了这个问题。在启动时,此主机已成功连接到其中一个正在运行的实例,并且仅在此之后第三个节点成功连接到群集,即使使用network.host: 0.0.0.0
也是如此。现在它再次运行得很好。
我试图了解我遇到此问题的原因 - 在AWS中使用0.0.0.0是否合法?在仅将一个节点network.host更改为_ec2_
后,它如何再次工作。
另一点是我想在本地环境(vagrant)中使用相同的命令行使用相同的服务,但在这种情况下我不能使用 ec2 。
提前致谢
答案 0 :(得分:0)
最终这是我找到的解决方案。
由于AWS是主要("生产")环境,因此主要配置面向它:
network.host: _ec2_
elasticsearch -Des.network.bind_host=0.0.0.0
在这种情况下,发现顺利进行并且节点绑定到任何网络接口(没有它就无法启动,因为_ec2_ IP与EC2主机网络相关,而不是与docker的网络接口相关)
要使其在本地环境(vagrant)中运行,命令行应覆盖network.host参数,因此要设置为:elasticsearch -Des.network.bind_host=0.0.0.0 -Des.network.host=0.0.0.0