【问题标题】:Nodes won't join cluster : NotMasterException (Weird master election bug)节点不会加入集群:NotMasterException(奇怪的主选举错误)
【发布时间】:2026-02-04 08:55:01
【问题描述】:

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

它有三个主节点:

el-m01
el-m02
el-m03

集群组装失败,每个master节点在日志中得到如下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

启用调试日志让我了解以下内容:

master 选举正在进行,并且是成功的。然而,虽然每个节点都选择了主节点,但没有节点认为他是主节点。 即:

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

这里发生了什么?

【问题讨论】:

    标签: elasticsearch elasticsearch-5


    【解决方案1】:

    情况如下:通过克隆 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。

    为了避免出现这个问题,你可以:

    • A. 克隆虚拟机后安装 elasticsearch
    • 乙。使用 ansible 或 puppet 之类的自动化工具来管理 elasticsearch。

    【讨论】:

    • 对该解决方案投赞成票。经过 6 天的努力,它解决了我的集群形成问题。谢谢
    • 关键是不要在将创建其他vms / ec2实例的服务器上启动elasticsearch服务。
    【解决方案2】:

    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

    问题可以通过删除数据目录的内容来解决,数据目录一开始不应该复制。

    【讨论】:

    • 只是为了具体... $/var/lib/elasticsearch# rm -rf nodes/