节点不会加入集群:NotMasterException(奇怪的主选举错误)

时间:2016-11-25 18:36:45

标签: elasticsearch elasticsearch-5

我正在设置elasticsearch(5.0.1)群集。

它有三个符合主节点的节点:

el-m01
el-m02
el-m03

群集无法汇编,并且每个主节点在日志中都会收到以下NotMasterException异常:

[2016-11-21T15:24:13,274][INFO ][o.e.d.z.ZenDiscovery     ] [el-m01] failed to send join request to master [{el-m02}{bBhsu3fJSj-MyiWJGhQmog}{_IzdeUd4Sv6g-rhemGjEVQ}{192.168.110.118}{192.168.110.118:9300}{rack=r1}], reason [RemoteTransportException[[el-m02][192.168.110.118:9300][internal:discovery/zen/join]]; nested: NotMasterException[Node [{el-m02}{bBhsu3fJSj-MyiWJGhQmog}{_IzdeUd4Sv6g-rhemGjEVQ}{192.168.110.118}{192.168.110.118:9300}{rack=r1}] not master for join request]; ], tried [3] times

启用调试日志使我能够理解以下内容:

大师选举正在进行,并取得了成功。但是,虽然每个节点都选择了一个主节点,但没有节点认为他是主节点。 即:

  • el-m01认为el-m02是主人
  • el-m02认为el-m03是主人
  • el-m03认为el-m01是主人

这里发生了什么?

2 个答案:

答案 0 :(得分:16)

情况如下:通过克隆VM以获取所有主服务器,每个节点都具有相同的节点ID

可以使用以下命令验证这一点,列出所有节点ID:

GET /_cat/nodes?v&h=id,ip,name&full_id=true

请注意,由于您的群集尚未形成,因此需要单独查询每个节点,即:

curl 192.168.110.111:9200/_cat/nodes?v&h=id,ip,name&full_id=true
curl 192.168.110.112:9200/_cat/nodes?v&h=id,ip,name&full_id=true
(...)

这很糟糕。节点ID必须是唯一的。

要解决此问题,您需要删除每个节点上的索引(在/var/lib/elasticsearch中)。这将 删除elasticsearch中的所有数据 ,并且还会重置节点ID。

为了避免首先出现此问题,您可以:

  • 甲。 克隆虚拟机后安装elasticsearch
  • B中。使用像ansible或puppet这样的自动化工具来管理弹性搜索。

答案 1 :(得分:1)

Elasticsearch数据目录$ES_HOME/data,或者在RPM的情况下,例如/var/lib/elasticsearch包含首次启动Elasticsearch时随机生成的节点ID。如果将此目录复制到预期形成群集的多个实例,则应收到以下错误:

failed to send join request to master [..] IllegalArgumentException [..] found existing node [..] with the same id but is a different node instance

但是,当不满足minimum_master_nodes时,会收到较少表示该问题的错误:

failed to send join request to master [..] NotMasterException [..] not master for join request

Github:https://github.com/elastic/elasticsearch/issues/32904

可以通过删除数据目录的内容来解决此问题,并且不应首先复制数据目录。