You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch集群master_not_discovered_exception故障求助

解决Elasticsearch集群master_not_discovered_exception及节点连通问题

从你遇到的情况来看,核心问题很明确:主节点node-master-1没法和node-master-2通过9300端口(Elasticsearch节点间通信的默认端口)建立连接,导致集群凑不齐足够的主节点来完成选主流程(你配置了2个主节点,需要至少2个达成quorum才能选出可用的主节点),所以才会抛出master_not_discovered_exception错误,同时日志里的"No route to host"已经给了明确的排查方向。

下面是一步步的排查和解决步骤,你可以按顺序来:

1. 先确认基础网络连通性

既然提示"No route to host",先从最底层的网络开始排查:

  • 在node-master-1上执行 ping 192.168.107.76,看看能不能ping通node-master-2的IP。如果ping不通,那就是底层网络的问题——比如IP配置错了、交换机端口没开、路由规则有问题,得先把这个搞定。
  • 如果ping能通,再测试9300端口的连通性,用 telnet 192.168.107.76 9300 或者 nc -zv 192.168.107.76 9300。要是连接失败,那大概率是防火墙或者SELinux把这个端口拦住了。

2. 检查防火墙和SELinux设置

Elasticsearch节点之间的通信依赖9300端口,必须确保两个主节点的防火墙都放行这个端口:

  • 如果你用的是firewalld(CentOS/RHEL系列),在两个主节点上都执行这两条命令:
    sudo firewall-cmd --add-port=9300/tcp --permanent
    sudo firewall-cmd --reload
    
  • 要是用的是ufw(Ubuntu/Debian系列),就执行:
    sudo ufw allow 9300/tcp
    sudo ufw reload
    
  • 再检查SELinux状态,如果是Enforcing模式,可能需要给9300端口添加SELinux规则:
    sudo semanage port -a -t http_port_t -p tcp 9300
    # 也可以临时关闭SELinux来测试(不建议长期关闭,只是用来验证问题)
    sudo setenforce 0
    

3. 核对两个主节点的Elasticsearch配置

确保两个主节点的elasticsearch.yml里的集群关键参数完全一致:

  • cluster.name:两个节点必须设置成同一个集群名称,比如:
    cluster.name: my-production-es-cluster
    
  • node.name:保证两个主节点的名称唯一,比如分别设为node-master-1和node-master-2
  • discovery.seed_hosts:这个参数必须包含所有主节点的IP和9300端口,比如:
    discovery.seed_hosts: ["192.168.107.75:9300", "192.168.107.76:9300"]
    
  • cluster.initial_master_nodes:如果是集群第一次启动,这个参数需要设置成所有主节点的名称,比如:
    cluster.initial_master_nodes: ["node-master-1", "node-master-2"]
    
    注意:如果集群已经启动过,后续修改配置的时候就不要再加这个参数了,否则可能会引发脑裂之类的问题。

4. 确认node-master-2的服务状态

  • 先在node-master-2上执行 sudo systemctl status elasticsearch.service,看看服务是不是正常启动了。如果没起来,用 journalctl -u elasticsearch.service 查看日志,找启动失败的原因——比如内存不够、配置文件写错了。
  • 如果服务已经启动,检查9300端口是不是被Elasticsearch占用了,用 netstat -tulpn | grep 9300 或者 ss -tulpn | grep 9300 就行,要是端口被其他进程占了,得把那个进程停掉或者改ES的端口。

5. 重启节点并验证结果

等上面的问题都解决之后:

  • 先重启node-master-2的Elasticsearch服务:sudo systemctl restart elasticsearch.service
  • 再重启node-master-1的服务:sudo systemctl restart elasticsearch.service
  • 等个1-2分钟,让节点完成发现和选主,然后再执行 curl -X GET "192.168.107.75:9200/_cat/master?v",应该就能看到主节点的信息了。
  • 也可以用 curl -X GET "192.168.107.75:9200/_cat/nodes?v" 看看所有已发现的节点,确认两个主节点都在列表里。

内容的提问来源于stack exchange,提问作者coding_monkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:47:32