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-clusternode.name:保证两个主节点的名称唯一,比如分别设为node-master-1和node-master-2discovery.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
相关产品推荐
相关产品推荐

